撞到东西后如何保持相同的速度? (统一二维)
How to keep the same velocity after bumping into things ? (Unity 2D)
我的游戏(2D 俯视图)是关于发射弹跳子弹的坦克。那些子弹有无限次弹跳,弹跳后保持相同的速度。它适用于静态物体,但它不能与移动物体保持相同的速度:子弹可以推动东西,但会变慢,我不知道如何消除减速。
这是一条推文,您可以看到子弹在接触到一些物体后速度变慢了:
https://twitter.com/TurboDevTeam/status/1350751139508215808?s=20
编辑:
这里是子弹的参数:
derHugo 的评论很中肯:由于汽车在受到撞击时会移动,因此它们会吸收部分能量。
我已经建立了一个最小的例子来演示。
球有一个 CircleCollider2D
和一个 Rigidbody2D
与 Linear Drag = 0
和一个 material 与 Friction = 0
和 Bounciness = 1
。
墙壁有 BoxCollider2D
和 Rigidbody2D
。重力被禁用。
第一次测试,墙 Rigidbody2D
设置为 Static
。
第二次测试,墙Rigidbody2D
设置为Dynamic
,Mass = 10
和Linear Drag = 1
。
为了在这种情况下让它永远弹跳,你必须自己编写弹跳的代码。首先移除 Physics Material 或将 bounciness 设置为 0,以确保 Physics Engine 没有模拟它。
然后,为项目符号创建一个脚本:
public class Bullet : MonoBehaviour
{
private Vector2 lastVelocity;
void FixedUpdate()
{
lastVelocity = GetComponent<Rigidbody2D>().velocity;
}
void OnCollisionEnter2D(Collision2D collision)
{
GetComponent<Rigidbody2D>().velocity = Vector2.Reflect(lastVelocity, collision.contacts[0].normal);
}
}
(请注意,您应该谨慎使用 GetComponent
,也许只在开始时调用它一次并保存一个引用,我没有这样做是为了保持最小样本。)
这里的想法是获取碰撞前的速度并将其反转。但是,如果您采用 OnCollisionEnter
上的 Rigidbody2D
速度,它已经是更新值。因此您必须将值存储在 FixedUpdate
中,因为 next 仅在 OnCollisionEnter
方法之后调用。
然后,您使用 Vector2.Reflect
来反映碰撞法线的传入速度。
Vector2.Reflect
结果在 2D 中有效:
我的游戏(2D 俯视图)是关于发射弹跳子弹的坦克。那些子弹有无限次弹跳,弹跳后保持相同的速度。它适用于静态物体,但它不能与移动物体保持相同的速度:子弹可以推动东西,但会变慢,我不知道如何消除减速。
这是一条推文,您可以看到子弹在接触到一些物体后速度变慢了: https://twitter.com/TurboDevTeam/status/1350751139508215808?s=20
编辑: 这里是子弹的参数:
derHugo 的评论很中肯:由于汽车在受到撞击时会移动,因此它们会吸收部分能量。
我已经建立了一个最小的例子来演示。
球有一个 CircleCollider2D
和一个 Rigidbody2D
与 Linear Drag = 0
和一个 material 与 Friction = 0
和 Bounciness = 1
。
墙壁有 BoxCollider2D
和 Rigidbody2D
。重力被禁用。
第一次测试,墙 Rigidbody2D
设置为 Static
。
第二次测试,墙Rigidbody2D
设置为Dynamic
,Mass = 10
和Linear Drag = 1
。
为了在这种情况下让它永远弹跳,你必须自己编写弹跳的代码。首先移除 Physics Material 或将 bounciness 设置为 0,以确保 Physics Engine 没有模拟它。
然后,为项目符号创建一个脚本:
public class Bullet : MonoBehaviour
{
private Vector2 lastVelocity;
void FixedUpdate()
{
lastVelocity = GetComponent<Rigidbody2D>().velocity;
}
void OnCollisionEnter2D(Collision2D collision)
{
GetComponent<Rigidbody2D>().velocity = Vector2.Reflect(lastVelocity, collision.contacts[0].normal);
}
}
(请注意,您应该谨慎使用 GetComponent
,也许只在开始时调用它一次并保存一个引用,我没有这样做是为了保持最小样本。)
这里的想法是获取碰撞前的速度并将其反转。但是,如果您采用 OnCollisionEnter
上的 Rigidbody2D
速度,它已经是更新值。因此您必须将值存储在 FixedUpdate
中,因为 next 仅在 OnCollisionEnter
方法之后调用。
然后,您使用 Vector2.Reflect
来反映碰撞法线的传入速度。
Vector2.Reflect
结果在 2D 中有效: