using UnityEngine; using System; namespace Architecture.Variables { /// /// 共享浮点变量(ScriptableObject 资产)。 /// 任何系统可读取 / 写入,并由 OnValueChanged 事件驱动 UI 刷新, /// 替代 MonoBehaviour 字段跨系统传递与逐帧反射读取。 /// [CreateAssetMenu(menuName = "Architecture/Variables/Float", fileName = "NewFloatVariable")] public class FloatVariable : ScriptableObject, Architecture.IVariable { [SerializeField] private float _value; [Tooltip("进入 Play Mode 时的初始值,由 VariableRegistry 在每次启动游戏时自动恢复,防止跨局状态泄漏")] [SerializeField] private float _defaultValue; public float Value { get => _value; set { if (Mathf.Approximately(_value, value)) return; _value = value; OnValueChanged?.Invoke(value); } } public event Action OnValueChanged; public void SetValue(float value) => Value = value; public void ApplyChange(float amount) => Value += amount; /// 将运行时值重置为 _defaultValue(每次进入 Play Mode 时由 VariableRegistry 自动调用)。 public void ResetToDefault() { _value = _defaultValue; OnValueChanged?.Invoke(_value); } [ContextMenu("Reset To Default")] public void Reset() => ResetToDefault(); private void OnEnable() => VariableRegistry.Register(this); private void OnDisable() { VariableRegistry.Unregister(this); OnValueChanged = null; } } }