IsoHolder and IsoInstance improvements

This commit is contained in:
2016-12-18 19:40:28 +07:00
parent d3016c5603
commit c5084b1596
7 changed files with 96 additions and 68 deletions

View File

@@ -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);
}
}
}

View 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);
}
}
}
}

View 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:

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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;
}
}
}
}

View File

@@ -151,7 +151,6 @@ namespace IsoTools {
Mode3d
}
[Space(10)]
[SerializeField]
Mode _mode = Mode.Mode2d;