【问题标题】:Player not colliding with Tilemap 2d collider玩家没有与 Tilemap 2d 碰撞器发生碰撞
【发布时间】:2021-02-17 04:48:15
【问题描述】:

由于某种原因,我的玩家没有与有碰撞的地图墙发生碰撞...这是我的玩家移动代码

 void Update()
    {
        hInput = Input.GetAxisRaw("Horizontal");
        vInput = Input.GetAxisRaw("Vertical");
        
        if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.RightArrow))
        {
            transform.Translate(hInput, 0, 0);
        }
        else if (Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.DownArrow))
        {
            transform.Translate(0, vInput, 0);
        }
        
        
    }

当我移动我的玩家时,他们会直接穿过对撞机。它们在同一层上,并且都有碰撞器。有谁知道为什么会这样?谢谢!

编辑:所以我已经像建议的那样测试了与 OnCollisionEnter2d 的碰撞,它们正在碰撞,问题是我的玩家仍然穿过墙壁。我不知道为什么对撞机不能阻止这种情况的发生。

【问题讨论】:

  • 我检查的第一件事是层矩阵,以及 2 个碰撞对撞机中的一个是否有 Rigidbody2D。或者它们可能被设置为触发器。

标签: c# unity3d


【解决方案1】:

Collider 实际上并不像碰撞后的后果那样执行物理,它只是计算出物体何时发生接触。为了使用物理,你需要一个刚体或刚体2D,它实际上会对碰撞器检测到的碰撞做一些事情。然后,您需要设置 rb.velocity,而不是设置位置。

【讨论】:

    【解决方案2】:

    Update() 方法中不会发生碰撞器的检测。要检测碰撞,您需要拥有OnCollisionEnter()。当另一个具有碰撞器和刚体的对象进入其中时,将调用此方法。见官方例子here

    void OnCollisionEnter(Collision collision)
    {
        Debug.Log(collision.collider.name);
    }
    

    【讨论】:

      【解决方案3】:

      确保Z 轴 值相同。

      为了检查碰撞是否真的发生,这样做:

      void OnCollisionEnter(Collision col)
      {
          Debug.Log(col.collider.name);
      }
      

      并确保 Collider 不是 Trigger

      这些是唯一可能的问题,以及它们的修复方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多