试图让一个物体在地面上反弹一次 - 然后当它再次落下时穿过地面
Trying to get an object to bounce once on the ground - then when it falls again go through the ground
这是脚本:
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 和一个 Physics Material 2D,反弹力为 1)并且即使你错过了它也能被点击第一次,但我只希望这种情况发生一次,所以我希望 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;
}
}
我把你的代码改得有点大,但你的应该可以,如果不行,把你的改成我的。
这是脚本:
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 和一个 Physics Material 2D,反弹力为 1)并且即使你错过了它也能被点击第一次,但我只希望这种情况发生一次,所以我希望 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;
}
}
我把你的代码改得有点大,但你的应该可以,如果不行,把你的改成我的。