【问题标题】:Trying to get an object to bounce once on the ground - then when it falls again go through the ground试图让一个物体在地面上反弹一次 - 然后当它再次落下时穿过地面
【发布时间】:2021-05-25 23:33:38
【问题描述】:

这是脚本:

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 和一个物理材质 2D,弹性为 1)并且即使你第一次错过它也能够被点击,但我只希望这种情况发生一次,所以我希望 CricleCollider2D 在它接触地面一次后成为触发器,允许它仍然被点击,但下次让球落入地面。但是,使用此脚本时,不会检测到碰撞。

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

【问题讨论】:

  • 您是否尝试过添加physics material,并将弹性设置得更高?
  • @ken 我已经在地面上放置了一个物理材质,将弹性设置得更高会使其从屏幕顶部反弹。除非您的意思是向球添加物理材料,在这种情况下,这有什么帮助?
  • 我在阅读整个问题之前问了这个问题。我不明白你的问题。我现在试着回答。
  • @ken 啊,好的,谢谢!我很想看看你要说什么,因为这真的让我很困惑哈哈。我有点初学者。

标签: c# unity3d collision-detection


【解决方案1】:

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

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

这是你应该做的:

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

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

【讨论】:

  • 非常感谢!这是有道理的,我不知道为什么我没有想到它!
  • 不要使用GetComponent .. 我们已经知道对撞机:Collision2D.collider
  • 这对bounced = true; if (bounced == true) 有什么好处(除了错字)?当然,这个条件总是正确的,因为你之前已经设置好了。有那个标志根本没有用;)
  • collision.gameObject.GetComponent().isTrigger 与碰撞相同如果允许就错了。始终尝试瞄准低端机器,这意味着尽可能避免使用 GetComponent。
  • @Rhach 实际上GetComponent 使用哈希(在更高版本中)并且不再昂贵(不再)。无论如何,在这种情况下,性能和可读性都是不必要的^^顺便说一句,它是collision.collider.isTrigger而不是collision.isTrigger;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2013-05-12
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多