53 lines
1.7 KiB
C#
53 lines
1.7 KiB
C#
using UnityEngine;
|
|
using System;
|
|
|
|
namespace Architecture.Variables
|
|
{
|
|
/// <summary>
|
|
/// 共享浮点变量(ScriptableObject 资产)。
|
|
/// 任何系统可读取 / 写入,并由 OnValueChanged 事件驱动 UI 刷新,
|
|
/// 替代 MonoBehaviour 字段跨系统传递与逐帧反射读取。
|
|
/// </summary>
|
|
[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<float> OnValueChanged;
|
|
|
|
public void SetValue(float value) => Value = value;
|
|
public void ApplyChange(float amount) => Value += amount;
|
|
|
|
/// <summary>将运行时值重置为 _defaultValue(每次进入 Play Mode 时由 VariableRegistry 自动调用)。</summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|