大家好:)这是情况:
我有一个baddy预制件,它有两个碰撞器组件:一个用于物理的简单CapsuleCollider2D,以及一个仅用于鼠标点碰撞的触发器PolygonCollider2D。
只有在需要时才使用附加脚本(Baddy.cs)更新PolygonCollider2D:
if(this.gameObject.GetComponent<PolygonCollider2D>()!=null){
Destroy(this.gameObject.GetComponent<PolygonCollider2D>());
}
this.gameObject.AddComponent<PolygonCollider2D>();
this.gameObject.GetComponent<PolygonCollider2D>().isTrigger=true;
是的,这是不好的做法,但它完成了工作。它完美无缺:在游戏的场景视图中我可以暂停并看到我们的baddy预制件上确实存在多边形对撞机。
在另一个附加脚本(CollisionHandler.cs)中,我们检查我们的baddy上的鼠标按下:
if(MousePress()){
hit=Physics2D.Raycast(level.mousePoint, Vector2.zero, 0f);
if(hit&&hit.collider==this.gameObject.GetComponent<PolygonCollider2D>()){
print("baddy mousePress");
}
}
然而,hit.collider==this.gameObject.GetComponent<PolygonCollider2D>()
错误,即使我可以在我们hit.collider
之前立即打印this.gameObject.GetComponent<PolygonCollider2D>()
和if(MousePress())
,并将它们定义为:
D_Prefab(Clone) (UnityEngine.PolygonCollider2D)
它们不能是不同的PolygonColliders,因为一次只能有一个,因为我们的Baddy脚本会同时删除并创建PolygonCollider。
任何可能出错的想法?
答案 0 :(得分:2)
通过使用带有layerMask的Physics2D.RaycastAll,我解决了其他碰撞器阻碍的问题,包括baddy自己的capsuleCollider2D。幸运的是,在我需要检查鼠标碰撞之前,我的baddys会冻结,所以当baddy的动画速度为0时我提前更新了对撞机。显然通过更新功能创建和移除碰撞器并不能给系统带来足够的效果是时候处理碰撞了。