begin physic events optimization

This commit is contained in:
2016-04-20 02:34:43 +06:00
parent a9706465e1
commit 92ed826849
13 changed files with 298 additions and 92 deletions

View File

@@ -0,0 +1,30 @@
using UnityEngine;
namespace IsoTools.Internal {
public class IsoFakeCollisionListener : MonoBehaviour {
IsoCollisionListener _isoListener = null;
public IsoFakeCollisionListener Init(IsoCollisionListener iso_listener) {
_isoListener = iso_listener;
return this;
}
IsoCollisionListener isoListener {
get { return _isoListener; }
}
void OnCollisionEnter(Collision collision) {
isoListener.gameObject.SendMessage(
"OnIsoCollisionEnter",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
void OnCollisionExit(Collision collision) {
isoListener.gameObject.SendMessage(
"OnIsoCollisionExit",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b3ba702b17e9f4b85aad7b29b1a06eed
timeCreated: 1461097028
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -31,33 +31,5 @@ namespace IsoTools.Internal {
_lastPosition = isoObject.position = transform.position;
}
}
void OnTriggerEnter(Collider collider) {
isoObject.gameObject.SendMessage(
"OnIsoTriggerEnter",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
void OnTriggerExit(Collider collider) {
isoObject.gameObject.SendMessage(
"OnIsoTriggerExit",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
void OnCollisionEnter(Collision collision) {
isoObject.gameObject.SendMessage(
"OnIsoCollisionEnter",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
void OnCollisionExit(Collision collision) {
isoObject.gameObject.SendMessage(
"OnIsoCollisionExit",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
}
}

View File

@@ -0,0 +1,30 @@
using UnityEngine;
namespace IsoTools.Internal {
public class IsoFakeTriggerListener : MonoBehaviour {
IsoTriggerListener _isoListener = null;
public IsoFakeTriggerListener Init(IsoTriggerListener iso_listener) {
_isoListener = iso_listener;
return this;
}
IsoTriggerListener isoListener {
get { return _isoListener; }
}
void OnTriggerEnter(Collider collider) {
isoListener.gameObject.SendMessage(
"OnIsoTriggerEnter",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
void OnTriggerExit(Collider collider) {
isoListener.gameObject.SendMessage(
"OnIsoTriggerExit",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 85a92cf713a8c4da68454e88e803bbce
timeCreated: 1461097013
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -6,18 +6,23 @@ namespace IsoTools.Internal {
[RequireComponent(typeof(IsoObject))]
public class IsoPhysicHelper : MonoBehaviour {
static List<IsoCollider > _tmpColliders = new List<IsoCollider >(7);
static List<IsoRigidbody> _tmpRigidbodies = new List<IsoRigidbody>(7);
static List<IsoCollider> _tmpColliders = new List<IsoCollider>(7);
static List<IsoRigidbody> _tmpRigidbodies = new List<IsoRigidbody>(7);
static List<IsoTriggerListener> _tmpTriggerListeners = new List<IsoTriggerListener>(7);
static List<IsoCollisionListener> _tmpCollisionListeners = new List<IsoCollisionListener>(7);
GameObject _isoFakeObject = null;
public GameObject isoFakeObject {
get { return _isoFakeObject; }
}
//TODO: fix copy-paste
public void DestroyIfUnnecessary(Component except) {
var unnecessary = true;
GetComponents<IsoCollider >(_tmpColliders);
GetComponents<IsoRigidbody>(_tmpRigidbodies);
GetComponents<IsoCollider> (_tmpColliders);
GetComponents<IsoRigidbody> (_tmpRigidbodies);
GetComponents<IsoTriggerListener> (_tmpTriggerListeners);
GetComponents<IsoCollisionListener>(_tmpCollisionListeners);
if ( unnecessary ) {
for ( int i = 0, e = _tmpColliders.Count; i < e; ++i ) {
if ( _tmpColliders[i] != except ) {
@@ -34,8 +39,26 @@ namespace IsoTools.Internal {
}
}
}
if ( unnecessary ) {
for ( int i = 0, e = _tmpTriggerListeners.Count; i < e; ++i ) {
if ( _tmpTriggerListeners[i] != except ) {
unnecessary = false;
break;
}
}
}
if ( unnecessary ) {
for ( int i = 0, e = _tmpCollisionListeners.Count; i < e; ++i ) {
if ( _tmpCollisionListeners[i] != except ) {
unnecessary = false;
break;
}
}
}
_tmpColliders.Clear();
_tmpRigidbodies.Clear();
_tmpTriggerListeners.Clear();
_tmpCollisionListeners.Clear();
if ( unnecessary ) {
Destroy(this);
}

View File

@@ -0,0 +1,30 @@
using UnityEngine;
using IsoTools.Internal;
namespace IsoTools {
[DisallowMultipleComponent]
[RequireComponent(typeof(IsoObject))]
public class IsoCollisionListener : MonoBehaviour {
IsoFakeCollisionListener _fakeListener;
GameObject fakeObject {
get { return physicHelper.isoFakeObject; }
}
IsoPhysicHelper physicHelper {
get { return IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject); }
}
void Awake() {
_fakeListener = fakeObject.AddComponent<IsoFakeCollisionListener>().Init(this);
}
void OnDestroy() {
if ( _fakeListener ) {
Destroy(_fakeListener);
}
physicHelper.DestroyIfUnnecessary(this);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c9634e461d1e942de8174ee80528a2d3
timeCreated: 1461096905
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,30 @@
using UnityEngine;
using IsoTools.Internal;
namespace IsoTools {
[DisallowMultipleComponent]
[RequireComponent(typeof(IsoObject))]
public class IsoTriggerListener : MonoBehaviour {
IsoFakeTriggerListener _fakeListener;
GameObject fakeObject {
get { return physicHelper.isoFakeObject; }
}
IsoPhysicHelper physicHelper {
get { return IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject); }
}
void Awake() {
_fakeListener = fakeObject.AddComponent<IsoFakeTriggerListener>().Init(this);
}
void OnDestroy() {
if ( _fakeListener ) {
Destroy(_fakeListener);
}
physicHelper.DestroyIfUnnecessary(this);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 1925507eee33e42c2a04a1ae1eaa1ec5
timeCreated: 1461096892
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: