Unity中敌人Goomba碰撞墙壁不切换方向仅碰撞角色生效如何解决
问题原因
- 碰撞坐标判断逻辑失效:你当前的判断逻辑依赖碰撞体的transform坐标,但Tilemap上所有Tile的碰撞体都挂载在Tilemap父节点下,
coll.collider.transform.position返回的是整个Tilemap父对象的坐标,而非你碰撞到的单个墙壁块的坐标,导致方向判断逻辑完全不触发,移动方向没有修改,Goomba持续向墙壁方向移动被物理阻挡,就会停在原地。 - 碰撞类型未过滤:地面和墙壁共享同一个Tilemap,碰撞到地面时也会触发
OnCollisionEnter2D,干扰方向判断逻辑。
解决方法
可以通过碰撞接触点的法线来判断碰撞方向,同时过滤有效碰撞类型,避免无效干扰,修改后的代码如下:
public class GoombaController : MonoBehaviour { public float speed = 1f; private Vector2 moveDir = Vector2.left; void Update() { transform.Translate(moveDir * Time.deltaTime * speed); } void OnCollisionEnter2D(Collision2D coll) { // 获取第一个碰撞接触点的法线 ContactPoint2D contact = coll.contacts[0]; // 只处理水平方向的碰撞(撞墙/撞玩家侧面,排除撞地面的垂直碰撞) if (Mathf.Abs(contact.normal.x) > 0.5f) { // 法线朝右说明碰撞发生在Goomba右侧,向左走;反之向右走 moveDir = contact.normal.x > 0 ? Vector2.left : Vector2.right; } } }
如果需要更精准的控制,也可以给玩家、墙壁、地面分别设置独立的Layer,在碰撞逻辑中判断Layer,只有碰到玩家或墙壁层时才执行方向切换,避免其他碰撞的干扰。
内容的提问来源于stack exchange,提问作者Efe FRK
相关产品推荐
相关产品推荐

