mirror of
https://github.com/BlackMATov/unity-iso-tools.git
synced 2025-12-13 15:52:03 +07:00
IsoHolder and IsoInstance improvements
This commit is contained in:
@@ -67,13 +67,5 @@ namespace IsoTools.Internal {
|
||||
_list.Clear();
|
||||
_dict.Clear();
|
||||
}
|
||||
|
||||
public void AssignTo(List<T> list) {
|
||||
_list.AssignTo(list);
|
||||
}
|
||||
|
||||
public void AssignTo(IsoList<T> list) {
|
||||
_list.AssignTo(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
47
Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs
Normal file
47
Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace IsoTools.Internal {
|
||||
public abstract class IsoBehaviour<T> : MonoBehaviour
|
||||
where T : IsoBehaviour<T>
|
||||
{
|
||||
static IsoAssocList<T> _behaviours = new IsoAssocList<T>();
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
12
Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta
Normal file
12
Assets/IsoTools/Scripts/Internal/IsoBehaviour.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8e027f31837046a8969524d5858dd99
|
||||
timeCreated: 1482054894
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +1,7 @@
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace IsoTools.Internal {
|
||||
public abstract class IsoHolder<THold, TInst> : MonoBehaviour
|
||||
public abstract class IsoHolder<THold, TInst> : IsoBehaviour<THold>
|
||||
where THold : IsoHolder <THold, TInst>
|
||||
where TInst : IsoInstance <THold, TInst>
|
||||
{
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace IsoTools.Internal {
|
||||
public abstract class IsoInstance<THold, TInst> : MonoBehaviour
|
||||
public abstract class IsoInstance<THold, TInst> : IsoBehaviour<TInst>
|
||||
where THold : IsoHolder <THold, TInst>
|
||||
where TInst : IsoInstance <THold, TInst>
|
||||
{
|
||||
@@ -11,14 +10,30 @@ namespace IsoTools.Internal {
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Internal
|
||||
// Private
|
||||
//
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
public bool IsActive() {
|
||||
return isActiveAndEnabled && gameObject.activeInHierarchy;
|
||||
THold FindFirstActiveParent() {
|
||||
THold ret_value = null;
|
||||
GetComponentsInParent<THold>(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<THold>(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();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace IsoTools.Internal {
|
||||
public class IsoList<T> {
|
||||
@@ -104,32 +103,5 @@ namespace IsoTools.Internal {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AssignTo(List<T> 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<T> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -151,7 +151,6 @@ namespace IsoTools {
|
||||
Mode3d
|
||||
}
|
||||
|
||||
[Space(10)]
|
||||
[SerializeField]
|
||||
Mode _mode = Mode.Mode2d;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user