From c5084b159694d8b215b3a3920be72af0eb33d8a2 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sun, 18 Dec 2016 19:40:28 +0700 Subject: [PATCH] IsoHolder and IsoInstance improvements --- .../IsoTools/Scripts/Internal/IsoAssocList.cs | 8 --- .../IsoTools/Scripts/Internal/IsoBehaviour.cs | 47 ++++++++++++++++++ .../Scripts/Internal/IsoBehaviour.cs.meta | 12 +++++ Assets/IsoTools/Scripts/Internal/IsoHolder.cs | 19 +++---- .../IsoTools/Scripts/Internal/IsoInstance.cs | 49 +++++++++++-------- Assets/IsoTools/Scripts/Internal/IsoList.cs | 28 ----------- Assets/IsoTools/Scripts/IsoObject.cs | 1 - 7 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs create mode 100644 Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta diff --git a/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs index 9ad8181..283b210 100644 --- a/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs +++ b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs @@ -67,13 +67,5 @@ namespace IsoTools.Internal { _list.Clear(); _dict.Clear(); } - - public void AssignTo(List list) { - _list.AssignTo(list); - } - - public void AssignTo(IsoList list) { - _list.AssignTo(list); - } } } \ No newline at end of file diff --git a/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs b/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs new file mode 100644 index 0000000..250ad96 --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs @@ -0,0 +1,47 @@ +using UnityEngine; + +namespace IsoTools.Internal { + public abstract class IsoBehaviour : MonoBehaviour + where T : IsoBehaviour + { + static IsoAssocList _behaviours = new IsoAssocList(); + + // --------------------------------------------------------------------- + // + // Internal + // + // --------------------------------------------------------------------- + + public bool IsActive() { + return isActiveAndEnabled && gameObject.activeInHierarchy; + } + + protected static int AllBehaviourCount { + get { return _behaviours.Count; } + } + + protected static T GetBehaviourByIndex(int index) { + return _behaviours[index]; + } + + // --------------------------------------------------------------------- + // + // Virtual + // + // --------------------------------------------------------------------- + + protected virtual void OnEnable() { + var behaviour = this as T; + if ( behaviour && behaviour.IsActive() ) { + _behaviours.Add(behaviour); + } + } + + protected virtual void OnDisable() { + var behaviour = this as T; + if ( behaviour ) { + _behaviours.Remove(behaviour); + } + } + } +} \ No newline at end of file diff --git a/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta b/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta new file mode 100644 index 0000000..09e2fb1 --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c8e027f31837046a8969524d5858dd99 +timeCreated: 1482054894 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/IsoTools/Scripts/Internal/IsoHolder.cs b/Assets/IsoTools/Scripts/Internal/IsoHolder.cs index a4fb699..ac063ec 100644 --- a/Assets/IsoTools/Scripts/Internal/IsoHolder.cs +++ b/Assets/IsoTools/Scripts/Internal/IsoHolder.cs @@ -1,8 +1,7 @@ -using UnityEngine; -using System.Collections.Generic; +using System.Collections.Generic; namespace IsoTools.Internal { - public abstract class IsoHolder : MonoBehaviour + public abstract class IsoHolder : IsoBehaviour where THold : IsoHolder where TInst : IsoInstance { @@ -29,19 +28,15 @@ namespace IsoTools.Internal { // // --------------------------------------------------------------------- - public bool IsActive() { - return isActiveAndEnabled && gameObject.activeInHierarchy; - } - public void AddInstance(TInst instance) { - if ( instance != null && instance.IsActive() ) { + if ( instance && instance.IsActive() ) { _instances.Add(instance); OnAddInstanceToHolder(instance); } } public void RemoveInstance(TInst instance) { - if ( instance != null ) { + if ( instance ) { _instances.Remove(instance); OnRemoveInstanceFromHolder(instance); } @@ -57,11 +52,13 @@ namespace IsoTools.Internal { // // --------------------------------------------------------------------- - protected virtual void OnEnable() { + protected override void OnEnable() { + base.OnEnable(); RecacheChildrenHolders(); } - protected virtual void OnDisable() { + protected override void OnDisable() { + base.OnDisable(); RecacheChildrenHolders(); } diff --git a/Assets/IsoTools/Scripts/Internal/IsoInstance.cs b/Assets/IsoTools/Scripts/Internal/IsoInstance.cs index eea650d..e68ce2a 100644 --- a/Assets/IsoTools/Scripts/Internal/IsoInstance.cs +++ b/Assets/IsoTools/Scripts/Internal/IsoInstance.cs @@ -1,8 +1,7 @@ -using UnityEngine; -using System.Collections.Generic; +using System.Collections.Generic; namespace IsoTools.Internal { - public abstract class IsoInstance : MonoBehaviour + public abstract class IsoInstance : IsoBehaviour where THold : IsoHolder where TInst : IsoInstance { @@ -11,14 +10,30 @@ namespace IsoTools.Internal { // --------------------------------------------------------------------- // - // Internal + // Private // // --------------------------------------------------------------------- - public bool IsActive() { - return isActiveAndEnabled && gameObject.activeInHierarchy; + 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); @@ -29,18 +44,10 @@ namespace IsoTools.Internal { 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; - } + _holder = FindFirstActiveParent(); + if ( _holder ) { + _holder.AddInstance(this as TInst); } - _tempHolders.Clear(); - } - if ( _holder ) { - _holder.AddInstance(this as TInst); } } @@ -53,15 +60,17 @@ namespace IsoTools.Internal { // --------------------------------------------------------------------- // - // Messages + // Virtual // // --------------------------------------------------------------------- - protected virtual void OnEnable() { + protected override void OnEnable() { + base.OnEnable(); RecacheHolder(); } - protected virtual void OnDisable() { + protected override void OnDisable() { + base.OnDisable(); ResetHolder(); } diff --git a/Assets/IsoTools/Scripts/Internal/IsoList.cs b/Assets/IsoTools/Scripts/Internal/IsoList.cs index 629c7c6..8e43160 100644 --- a/Assets/IsoTools/Scripts/Internal/IsoList.cs +++ b/Assets/IsoTools/Scripts/Internal/IsoList.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace IsoTools.Internal { public class IsoList { @@ -104,32 +103,5 @@ namespace IsoTools.Internal { } } } - - public void AssignTo(List list) { - list.Clear(); - if ( list.Capacity < Count ) { - list.Capacity = Count * 2; - } - for ( int i = 0, e = Count; i < e; ++i ) { - list.Add(this[i]); - } - } - - public void AssignTo(IsoList list) { - if ( list._data.Length < _size ) { - var new_data = new T[_size * 2]; - Array.Copy(_data, new_data, _size); - list._data = new_data; - list._size = _size; - } else { - if ( _size < list._size ) { - Array.Clear(list._data, _size, list._size - _size); - } - if ( _size > 0 ) { - Array.Copy(_data, list._data, _size); - } - list._size = _size; - } - } } } \ No newline at end of file diff --git a/Assets/IsoTools/Scripts/IsoObject.cs b/Assets/IsoTools/Scripts/IsoObject.cs index 8d84b8b..b018373 100644 --- a/Assets/IsoTools/Scripts/IsoObject.cs +++ b/Assets/IsoTools/Scripts/IsoObject.cs @@ -151,7 +151,6 @@ namespace IsoTools { Mode3d } - [Space(10)] [SerializeField] Mode _mode = Mode.Mode2d;