c# - 试图让一个物体在地面上反弹一次 - 然后当它再次落下时穿过地面
问题描述
这是脚本:
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。我不认为这很重要,但是地面物体稍微在屏幕外,所以球会离开屏幕一瞬间然后回到屏幕上让你再次点击。
解决方案
由于您在 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;
}
}
我将您的代码更改了一点,但是您的代码应该可以工作,如果没有,请将您的代码更改为我的。
推荐阅读
- javascript - React - 注入的组件与父页面 DOM 不匹配
- python - 读取 2 个正整数并仅使用“while”打印它的第一个倍数的程序
- ios - 拨打 USSD 号码或打开电话应用程序
- vim - 从 Git Bash 调用的 Vim:视觉块前置不会应用于所有行
- three.js - 如何在 ThreeJS 中将纹理放置到挤压几何体的一侧?
- redis - 字符串类型的字符串与哈希?哈希将只有一个键而不是多个
- three.js - Three.js - mtlLoader 材质
- perl - 如何使用 Perl 作为配置文件的语言?
- javascript - 如何根据值在 Javacsript 中自动选择 Ajax 下拉菜单
- python - 将 RGB numpy 矩阵转换为灰度矩阵