You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:45:03