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;
}
}