对不起标题,我想不出更好的方式来描述这个问题。基本上,我正在尝试在游戏中实现碰撞系统。我希望能够注册一个“碰撞处理程序”来处理可以转换为特定类型的两个对象(以任意顺序给出)的任何碰撞。因此,如果Player : Ship : Entity
和Laser : Particle : Entity
,以及 和 的处理程序注册 ,(Ship, Particle)
而(Laser, Entity)
不是 的冲突(Laser, Player)
,则应通知两个处理程序,并以正确的顺序提供参数,并且 的冲突(Laser, Laser)
应仅通知第二个处理程序。
一个代码片段说了一千个单词,所以这就是我现在正在做的事情(naieve 方法):
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),所以我正在寻找一种方法来减少几个周期/分配。
我想到了(例如,花了一个小时实现然后因为自己是个白痴而将头撞到墙上)一种方法,该方法根据它们的哈希码将类型按顺序排列,然后将它们放入字典中,每个条目都是该类型对的处理程序的链接列表,带有布尔值指示处理程序是否希望反转参数的顺序。不幸的是,这不适用于派生类型,因为如果传入派生类型,它不会通知基类型的订阅者。谁能想到比检查每个类型对(两次)以查看它是否匹配更好的方法?
谢谢,罗伯特