Unity 2D地面对撞机正常工作,但未被OnTriggerEnter2D检测到

时间:2019-06-05 10:18:45

标签: c# unity3d

我正在制作我的第一个Unity平台游戏,但我发现我从未阻止过我的玩家无限跳跃。我尝试了使用布尔值的典型解决方案,该布尔值通过跳跃和与地面碰撞来切换。问题是,即使我的播放器确实与地面发生碰撞,OnTriggerEnter2D似乎也没有检测到它。

是的,我已经三遍检查了地面是否有正确的标签。

我尝试使用raycaster解决方案,但这似乎也不起作用。 我有代码打印出与之碰撞的任何物体的标签,因此我知道它根本无法检测到地面。

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
        }      
    }
}

2 个答案:

答案 0 :(得分:3)

所以我意识到这是因为地面对撞机没有被设置为触发器。 我添加了第二个对撞机,它是一个触发器,现在可以按预期工作。

答案 1 :(得分:3)

做好自己寻找错误的操作,OP。通常情况下是您的解决方案:)将来您可能会遇到碰撞问题。我发现,当人们遇到无法触发碰撞的问题时,主要问题是:

  1. 您正在2D游戏中使用3D对撞机组件。
  2. 所有碰撞对象都没有刚体(2D)。
  3. 脚本附加到的对象没有对撞机组件
  4. 当输入参数应为Collider时为Collision,反之亦然。
  5. 未设置isTrigger布尔值(对于OnTriggerEnter(2D))
  6. 脚本未附加到对象
  7. 您以编程方式排除了要碰撞的图层。您也可以通过矩阵在项目设置中进行设置。 (通常不是这样,因为如果您这样做,您可能知道自己在做什么)
  8. 您的对象移动太快,您没有设置“连续碰撞模式”(“对撞机”组件的下拉菜单)