我会在 Body 对象上创建一个名为 Collided 的抽象方法:
abstract class Body
{
abstract void Collision(Body other);
}
class Dog : Body
{
public override void Collision(Body other) {
this.Bark();
}
public void Bark() { ... }
}
然后在您的碰撞函数中,只需在相关物体上调用 Collision 即可。
public bool OnCollision(Body body1, Body body2)
{
body2.Collision(body2);
}
这样,任何类型的主体都可以在发生碰撞时做任何需要的事情,您甚至可以对其进行优化以跟踪哪些主体已收到相互碰撞的通知,并减少您必须执行的函数调用的数量:
public bool OnCollision(Body body1, Body body2)
{
// Record that these two objects have been notified of a collision
// then when these same objects are the only two operands in subsequent calls
// you can just short circuit the calls.
if(!AlreadyNotifiedOfCollision(body1, body2))
{
body1.Collision(body2);
body2.Collision(body1);
NotifiedOfCollision(body1, body2);
}
}
当然,必须进行经验测试以验证此检查是否比实际调用两次更快...