using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 数值实例 /// public class ValueInstance { /// 数值类型 public readonly ValueType type; /// 数值名称 public readonly string name; /// 自定义数值 public float value; /// 修改器列表 public List modifiers = new List(); /// 默认值 public float DefaultValue { get; protected set; } /// 最小值 public float MinValue { get; protected set; } /// 最大值 public float MaxValue { get; protected set; } /// 基础值 = 默认值 + 全部修改器 public float BaseValue { get; protected set; } /// 附加值% = 1 + 全部修改器 public float AddedValue { get; protected set; } /// 当前值 = Clamp(基础值 * 附加值%) public float CurrentValue { get; protected set; } /// 是布尔值 public bool IsBoolean => type == ValueType.Boolean && CurrentValue == MaxValue; /// 创建数值 public static ValueInstance Create(ValueType type, string name) { ValueInstance instance = new ValueInstance(type, name); float maxValue = float.MaxValue; if (type == ValueType.Boolean) { maxValue = 1; } if (type == ValueType.Percentage) { maxValue = 100; } instance.Settings(0, maxValue); return instance; } protected ValueInstance(ValueType type, string name) { this.type = type; this.name = name; } /// 设置默认值 public void Settings(float defaultValue) { this.DefaultValue = defaultValue; RecalculateValue(); } /// 设置数值范围 public void Settings(float minValue, float maxValue) { this.MinValue = minValue; this.MaxValue = maxValue; RecalculateValue(); } /// 设置默认值和数值范围 public void Settings(float defaultValue, float minValue, float maxValue) { this.DefaultValue = defaultValue; this.MinValue = minValue; this.MaxValue = maxValue; RecalculateValue(); } /// 添加修改器 public void AddModifier(ValueModifier modifier, bool isUpdate = true) { modifiers.Add(modifier); if (isUpdate) { RecalculateValue(); } } /// 添加修改器 public void AddModifier(List modifier, bool isUpdate = true) { modifiers.AddRange(modifier); if (isUpdate) { RecalculateValue(); } } /// 重新计算值 public void RecalculateValue() { AddedValue = 1; BaseValue = DefaultValue; modifiers.ForEach(Modify); float temp = BaseValue * AddedValue; CurrentValue = Mathf.Clamp(temp, MinValue, MaxValue); if (type == ValueType.Integer) { CurrentValue = Mathf.Round(CurrentValue); } } /// 修改 private void Modify(ValueModifier modifier) { BaseValue += modifier.FixedValue; AddedValue += modifier.AddedValue; } }