Unity 2D地面碰撞器有效,但无法被OnTriggerEnter2D检测到。

3

我正在制作我的第一个Unity平台游戏,但我发现我的玩家可以一直跳跃。我尝试使用一个布尔值来解决问题,该值通过跳跃和与地面碰撞来切换状态。但问题在于,即使我的玩家确实与地面碰撞,OnTriggerEnter2D似乎也无法检测到它。

而且,我已经三次确认了地面的标签是正确的。

我尝试使用一个光线投射的解决方案,但那也似乎无法解决问题。我在代码中打印出每个对象碰撞时的标签,所以我知道它根本没有检测到地面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    //movement variables
    public float movex;
    public float speed;
    public float jumpforce;

    //interactivity variables
    public Rigidbody2D rb2d;

    private bool isJumping;

    Vector3 startingPosition;

    // Use this for initialization
    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
        startingPosition = transform.position;
    }

    // Update is called once per frame
    void Update()
    {        
        // localScale;
        if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
        {
            rb2d.velocity = new Vector2(rb2d.velocity.x, jumpforce);
            isJumping = true;
        }

    }

    void OnTriggerEnter2D(Collider2D col) 
    {
        Debug.Log(col.tag);

        if (col.gameObject.CompareTag("Floor"))
        {
            isJumping = false
        }      
    }
}

嗨Jessy,你确定你附加到玩家的碰撞器是(Box)Collider2D,而不是3D碰撞器了吗? - Fredrik Schön
1
你为什么选择添加额外的触发器而不是使用OnCollisionEnter2D呢?当玩家非触发器碰撞体接触地面时,它会被触发。 - Fredrik Schön
2个回答

3

我意识到问题是由于地面上的碰撞体没有被设置成触发器。

我添加了第二个盒状碰撞体并将其设为触发器,现在它已经按预期工作了。


3

做得好,OP,你自己找到了错误并提供了解决方案 :) 未来你可能会遇到碰撞问题。我发现人们在处理碰撞触发时通常出现以下问题:

  1. 在2D游戏中使用3D碰撞器组件。
  2. 碰撞对象没有Rigidbody(2D)。
  3. 脚本所附加的对象没有Collider组件。
  4. 输入参数是Collision而不是Collider或反之。
  5. isTrigger布尔值未设置(对于OnTriggerEnter(2D))。
  6. 脚本未附加到对象。
  7. 通过矩阵在项目设置中编程排除层的碰撞。 (通常情况下不会出现这种情况,因为如果您这样做,您可能知道自己在做什么)
  8. 您的对象移动得太快,而且您没有设置连续碰撞模式(在Collider组件的下拉菜单中)。

2
  1. 方法名存在拼写错误,例如 OnTriggerEnter2d
- Alex Myers
Unity命名“约定”。 可能不是世界上最糟糕的。 但它们绝对在争夺一个称号。 Puntendered。 - Confused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接