using System.Collections.Generic; namespace IsoTools.Internal { public abstract class IsoInstance : IsoBehaviour where THold : IsoHolder where TInst : IsoInstance { THold _holder = null; static List _tempHolders = new List(); // --------------------------------------------------------------------- // // Private // // --------------------------------------------------------------------- THold FindFirstActiveParent() { THold ret_value = null; GetComponentsInParent(false, _tempHolders); for ( int i = 0, e = _tempHolders.Count; i < e; ++i ) { var holder = _tempHolders[i]; if ( holder.IsActive() ) { ret_value = holder; break; } } _tempHolders.Clear(); return ret_value; } // --------------------------------------------------------------------- // // Internal // // --------------------------------------------------------------------- public void ResetHolder() { if ( _holder ) { _holder.RemoveInstance(this as TInst); _holder = null; } } public void RecacheHolder() { ResetHolder(); if ( IsActive() ) { _holder = FindFirstActiveParent(); if ( _holder ) { _holder.AddInstance(this as TInst); } } } protected THold GetHolder() { if ( !_holder ) { RecacheHolder(); } return _holder; } // --------------------------------------------------------------------- // // Virtual // // --------------------------------------------------------------------- protected override void OnEnable() { base.OnEnable(); RecacheHolder(); } protected override void OnDisable() { base.OnDisable(); ResetHolder(); } protected virtual void OnTransformParentChanged() { RecacheHolder(); } } }