タイトルについて申し訳ありませんが、問題を説明するためのより良い方法を考えることができませんでした。基本的に、私はゲームに衝突システムを実装しようとしています。特定のタイプにキャストできる2つのオブジェクト(いずれかの順序で指定)の衝突を処理する「衝突ハンドラー」を登録できるようにしたいと思います。したがって、Player : Ship : Entity
とLaser : Particle : Entity
、およびのハンドラーが(Ship, Particle)
の(Laser, Entity)
衝突よりも登録されている場合は(Laser, Player)
、両方のハンドラーに引数を正しい順序で通知する必要があり、の衝突で(Laser, Laser)
は2番目のハンドラーのみに通知する必要があります。
コードスニペットは千の単語を言っているので、これが私が今していることです(ナイーブメソッド):
public IObservable<Collision<T1, T2>> onCollisionsOf<T1, T2>()
where T1 : Entity
where T2 : Entity
{
Type t1 = typeof(T1);
Type t2 = typeof(T2);
Subject<Collision<T1, T2>> obs = new Subject<Collision<T1, T2>>();
_onCollisionInternal += delegate(Entity obj1, Entity obj2)
{
if (t1.IsAssignableFrom(obj1.GetType()) && t2.IsAssignableFrom(obj2.GetType()))
obs.OnNext(new Collision<T1, T2>((T1) obj1, (T2) obj2));
else if (t1.IsAssignableFrom(obj2.GetType()) && t2.IsAssignableFrom(obj1.GetType()))
obs.OnNext(new Collision<T1, T2>((T1) obj2, (T2) obj1));
};
return obs;
}
ただし、この方法は非常に遅いため(測定可能です。これを実装した後、最大2 FPSを失いました)、これから数サイクル/割り当てを削減する方法を探しています。
私は(たとえば、1時間かけて実装し、そのようなばかであるために壁に頭をぶつけた)、ハッシュコードに基づいて型を並べ替え、辞書に入れて、各エントリを次のようにする方法を考えました。そのタイプのペアのハンドラーのリンクリストと、ハンドラーが引数の順序を逆にするかどうかをブール値で示します。残念ながら、これは派生型では機能しません。派生型が渡された場合、基本型についてサブスクライバーに通知されないためです。すべてのタイプペアを( 2回)チェックして一致するかどうかを確認するよりも良い方法を誰かが考えることができますか?
ありがとう、ロバート