Collided という Body オブジェクトに抽象メソッドを作成するだけです。
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);
}
}
もちろん、このチェックが実際に呼び出しを 2 回行うよりも高速であることを検証するには、経験的なテストを行う必要があります...