c# - 如何使弹丸转弯有弧度

标签 c# unity3d game-physics

我有一门大炮,可以沿抛物线弧线发射子弹。现在,当我发射子弹时,子弹与它从大炮中发射时保持相同的旋转。

animation

如何才能让子弹在空中飞行时沿着弧线旋转?

我尝试将以下内容作为在项目符号上运行的脚本

图表 1

public class PointingBehaviour:MonoBehaviour
{
    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    public void Update()
    {
        transform.up = rb.velocity;
    }
}

而且效果相当好。但是我在物体存在的第一帧看到轻微的闪烁(我认为这是因为此时速度仍然为 0)并且物体一旦撞到地面就无法控制地旋转。

animation

我通过执行以下操作使其在开始时停止闪烁并在着陆时停止旋转

public class BulletController : MonoBehaviour
{
    private Rigidbody _rb;
    private bool _followArc;
    private bool _firstFrame;
    private void Start()
    {
        _rb = GetComponent<Rigidbody>();
        _firstFrame = true;
        _followArc = true;
    }

    public void LateUpdate()
    {
        if (_followArc && !_firstFrame)
            transform.up = _rb.velocity;
        _firstFrame = false;
    }

    public void OnCollisionEnter(Collision collision)
    {
        _followArc = false;
    }
}

但如果我碰巧在空中撞到什么东西,它就会停止跟随弧线,然后自由翻滚直到落地。做我想做的事情的“正确”方法是什么?


因为人们想看到它,这里是产生子弹的代码。

public class TankController : MonoBehaviour
{

    private Transform _barrelPivot;
    private Transform _bulletSpawn;
    public GameObject Bullet;
    public float FirePower;
    public float RotationSpeed;
    public float TiltSpeed;

    private void Start()
    {
        _barrelPivot = GetComponentsInChildren<Transform>().First(x => x.CompareTag("BarrelPivotPoint"));
        _bulletSpawn = GetComponentsInChildren<Transform>().First(x => x.CompareTag("BulletSpawn"));
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            FireCannon();
        }
        //(SNIP) Handle turning left and right and pivoting up and down.
    }

    private void FireCannon()
    {
        var newBullet = SpawnBullet();
        var rb = newBullet.GetComponent<Rigidbody>();
        rb.AddForce(_bulletSpawn.up * FirePower, ForceMode.Impulse);
    }

    private GameObject SpawnBullet()
    {
        var newBullet = (GameObject) Instantiate(Bullet, _bulletSpawn.position, _bulletSpawn.rotation);
        newBullet.transform.localScale = Bullet.transform.localScale;
        return newBullet;
    }
}

最佳答案

我相信您所说的是 - 您的脚本 exhibit1 效果很好。

如果您考虑一下,您所要做的就是在需要时关闭该行为。

在这种情况下,您在想“这种行为应该在落地时停止......我想这就是您的物理意思。

关闭 MonoBehaviour 非常容易,您只知道 enabled = false;

所以,您在某处有一些脚本,例如 Bullet 或者 BulletBoss

在那里你会有一个变量 private PointingBehaviour pb 并且你只是 pb.enabled = false

(我不能告诉你“什么时候”你想这样做,这取决于你的游戏......所以它可能是“当高度低于等等”或“当我击中某物时”......可能与 OnCollisionEnter 相关。)

请注意 - 我相信您知道这一点 - 对于射弹的指向行为,只需沿着切线设置它是非常基本的。

当您为这样的射弹编写指向行为时,这是一件非常容易做的可爱的事情,请尝试将其轻轻地移动到切线。结果是令人惊叹的真实外观。接下来也许添加一些非常像炸弹的随机“摆动”。令人惊奇的是用户如何能够看到这样的东西,只有几帧。 (我猜下一步将是真正的空气物理学!)

请注意,PointingBehaviour 当然应该只是它自己的脚本。您必须使行为完全隔离。


关于提到的 LateUpdate从不需要使用它。

Unity 提供了一个“脚本顺序执行”系统(参见首选项菜单选项),如果您真的想在框架内执行顺序的话。但这样做的唯一原因可能是出于某些实验原因。

这更像是“使用全局变量”——没有理由这样做。与任何代码一样,如果您必须按给定顺序执行某些操作,只需按顺序调用即可。

关于c# - 如何使弹丸转弯有弧度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161321/

相关文章:

javascript - 将 Javascript 结果传递给 View

c# - 我们如何使用统一在后台保存大量数据?

c# - Prim 的算法 C# Unity

java - 粒子堆算法

iphone - Box2d - 赋予物体吸引力/重力

c# - 为什么visual studio默认检测到的Mac Agent无法连接到mac agent?

c# - 为什么 DELETE 语句在 MySql Workbench 和 PHP/PDO 中运行时会在 MySQL Connector/net 中默默失败?

c# - ToString 方法和转换为字符串之间有区别吗?

unity3d - Unity Editor 检测构建失败的时间

java - LibGdx 摧毁一个 body