using UnityEngine; using UnityEngine.Serialization; namespace Flexalon { /// <summary> /// Base type for many Flexalon components. Deals with FlexalonNode lifecycle, /// and provides the ForceUpdate and MarkDirty methods to trigger a Flexalon update. /// </summary> [ExecuteAlways, RequireComponent(typeof(FlexalonResult))] public abstract class FlexalonComponent : MonoBehaviour { protected FlexalonNode _node; /// <summary> The FlexalonNode associated with this gameObject. </summary> public FlexalonNode Node => _node; [SerializeField, HideInInspector, FormerlySerializedAs("_initialized")] private int _version; private static readonly int _currentVersion = 4; void Update() { DoUpdate(); } void OnEnable() { _node = Flexalon.GetOrCreateNode(gameObject); DoOnEnable(); if (_version == 0) { Initialize(); } else if (_version < _currentVersion) { Upgrade(_version); } if (!_node.HasResult || _version == 0) { MarkDirty(); } else { UpdateProperties(); } _version = _currentVersion; } void OnDisable() { DoOnDisable(); } void OnDestroy() { if (_node != null) { ResetProperties(); Flexalon.RecordFrameChanges = true; _node.MarkDirty(); _node = null; } } /// <summary> Marks this component needing an update. The Flexalon singleton /// will visit it in dependency order on LateUpdate. </summary> public void MarkDirty() { if (_node != null) { UpdateProperties(); _node.MarkDirty(); } } /// <summary> Forces this component, its parent nodes, and its children nodes to update immediately. </summary> public void ForceUpdate() { _node = Flexalon.GetOrCreateNode(gameObject); MarkDirty(); _node.ForceUpdate(); } void OnDidApplyAnimationProperties() { MarkDirty(); } /// <summary> Called when the component is enabled to apply properties to the FlexalonNode. </summary> protected virtual void UpdateProperties() {} /// <summary> Called when the component is destroyed to reset properties on the FlexalonNode. </summary> protected virtual void ResetProperties() {} /// <summary> Called when the component is enabled. </summary> protected virtual void DoOnEnable() {} /// <summary> Called when the component is disabled. </summary> protected virtual void DoOnDisable() {} /// <summary> Called when the component is updated. </summary> public virtual void DoUpdate() {} /// <summary> Called when the component is first created. </summary> protected virtual void Initialize() {} /// <summary> Called when the component is upgraded to a new version of Flexalon. </summary> protected virtual void Upgrade(int fromVersion) {} } }