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