试图让一个物体在地面上反弹一次 - 然后当它再次落下时穿过地面

时间:2021-05-24 23:50:52

标签: c# unity3d collision-detection

脚本如下:

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

public class groundCollision : MonoBehaviour
{
    public bool hasTouchedGround = false;

    public CircleCollider2D cC;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "ball")
        {
            hasTouchedGround = true;
        }
    }

    void Update()
    {
        if (hasTouchedGround == true)
        {
            cC.isTrigger = true;
        }
    }
}

我有两个游戏对象。一个是球,命名为“ball”,标签为“ball”;另一个是在 X 轴上拉伸成一个大矩形并命名为“ground”的正方形,没有标签。球有一个刚体设置为动态(会有很多球,游戏的重点是在球落下时点击它们以获得积分)和一个 CircleCollider2D,重力比例已设置为 0.5(虽然我有使用 1 的正常重力比例时存在同样的问题)。

我希望球能够从地面反弹(它有一个 BoxCollider2D 和一个弹性为 1 的物理材料 2D)并且即使你第一次错过它也能够被点击,但我只希望这发生一次,所以我希望 CricleCollider2D 在它接触地面一次后成为触发器,允许它仍然被点击,但让球下一次落入地面。但是,使用此脚本,未检测到碰撞。

当球击中地面并弹开时,布尔值“hasTouchedGround”不会变为真。什么可能导致这种情况?我仔细检查了我所有的引用,它们都很好,脚本中引用的 CircleCollider2D (cC) 设置为球上的 CircleCollider2D。我认为这无关紧要,但是地面物体稍微离开屏幕,所以球会离开屏幕一瞬间然后回到屏幕上让您再次点击。

1 个答案:

答案 0 :(得分:0)

由于您使用的是 unity2d,您需要确保您所做的一切都不是 3d。由于您正在检测二维碰撞,因此您需要确保调用了正确的方法。

测试时,我尝试在 OnCollisionEnter 中放置一个打印语句,即使球击中它也没有任何结果。这是因为 OnCollisionEnter 检测的是 3d 碰撞,而 OnCollisionEnter2D 检测的是 2d 碰撞。如果您使用 2d 版本,则还必须有 2d 参数。在这种情况下,我们使用 Collision2D 而不是 Collision

这是你应该做的:

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag == "ball")
        {
            collision.collider.isTrigger = true;
        }
    }

我把你的代码改了一点点,但你的应该可以工作,如果不行,把你的改成我的。

相关问题