微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

撞到东西后如何保持相同的速度? (Unity 2D)

如何解决撞到东西后如何保持相同的速度? (Unity 2D)

我的游戏(2D 自顶向下视图)是关于一辆发射弹跳子弹的坦克。这些子弹有无限弹跳,弹跳后保持相同的速度。它适用于静态物体,但它不会与移动物体保持相同的速度:子弹可以推动物体,但会变慢,我不知道如何消除慢。

这是一条推文,您可以看到子弹在接触某些物体后减速: https://twitter.com/TurboDevTeam/status/1350751139508215808?s=20

编辑: 这是子弹的参数:

enter image description here

enter image description here

enter image description here

解决方法

derHugo 的评论很中肯:由于汽车在受到撞击时会移动,因此它们会吸收部分能量。

我已经设置了一个最小的示例来演示。

球有一个 CircleCollider2D 和一个 Rigidbody2D,带有 Linear Drag = 0,材质带有 Friction = 0Bounciness = 1。 墙壁有一个 BoxCollider2D 和一个 Rigidbody2D。重力被禁用。

对于第一次测试,墙 Rigidbody2D 设置为 Static

Test 1,Static Wall

对于第二个测试,墙 Rigidbody2D 设置为 Dynamic,带有 Mass = 10Linear Drag = 1

Test 2,Dynamic Wall

为了在这种情况下永远保持弹跳,您必须自己编码弹跳。首先移除物理材质或将弹性设置为 0,以确保物理引擎不会模拟它。

然后,为项目符号创建脚本:

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,可能只在开始时调用一次并保存引用,我没有这样做是为了保留最少的样本。)

这里的想法是在碰撞之前获取速度并将其反转。但是,如果您采用 Rigidbody2D 上的 OnCollisionEnter 速度,它已经是更新后的值。因此您必须将值存储在 FixedUpdate 中,因为 next 仅在 OnCollisionEnter 方法之后调用。 然后,您使用 Vector2.Reflect 通过碰撞法线反映传入速度。

Test 3,Dynamic Wall,Custom Bounce

Vector2.Reflect 结果在 2D 中有效:

Test 4,Custom Bounce,2D

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。