版权声明:本文为 ls9512 原创文章,转载请注明出处! https://blog.csdn.net/ls9512/article/details/70791769
Unity的物理系统,处理碰撞事件,需要自行实现MonoBehaviour中的void OnTriggerEnter(Collider)等方法,MonoBehaviour的生命周期方法,有些不太常用,可能会经常不记得、或者打错名字,调试还不容易找到原因,很不方便。
我们可以把常用接口封装起来,让需要实现碰撞事件的类,继承已经封装好的类即可。
using System;
using UnityEngine;
[RequireComponent(typeof(Collider))]
public class ColliderListener : MonoBehaviour {
public Action<Collider> onTriggerEnter = delegate { };
public Action<Collider> onTriggerStay = delegate { };
public Action<Collider> onTriggerExit = delegate { };
public Action<Collision> onCollisionEnter = delegate { };
public Action<Collision> onCollisionStay = delegate { };
public Action<Collision> onCollisionExit = delegate { };
private void OnTriggerEnter(Collider other) {
onTriggerEnter(other);
}
private void OnTriggerStay(Collider other) {
onTriggerStay(other);
}
private void OnTriggerExit(Collider other) {
onTriggerExit(other);
}
private void OnCollisionEnter(Collision other) {
onCollisionEnter(other);
}
private void OnCollisionStay(Collision other) {
onCollisionStay(other);
}
private void OnCollisionExit(Collision other) {
onCollisionExit(other);
}
public virtual void Clear() {
onTriggerEnter = delegate { };
onTriggerStay = delegate { };
onTriggerExit = delegate { };
onCollisionEnter = delegate { };
onCollisionStay = delegate { };
onCollisionExit = delegate { };
}
}
如此一来,只需要让类继承 ColliderListener 类,然后注册 onTriggerEnter 等已经封装好的事件即可,比每次都重复实现接口的效率要高不少。 本例封装了6个方法,还可以参照本例直接做出 Collider2DListener ,如果有需要可以把其他MonoBehaviour生命周期方法封装起来,做成其他的常用快速实现类。
不过需要注意一个问题,由于这些接口都是空实现,但是只要写了这个方法,哪怕没有实现,Unity的UI消息机制,也会每次将消息发送到这个方法上,会有一定性能开销。