如何用弧形制造抛射物

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

动画

我如何制作它以使子弹在空中传播时沿弧线旋转?

我尝试了以下作为在子弹上运行的脚本

图表1

public class PointingBehaviour:MonoBehaviour { private Rigidbody rb; private void Awake() { rb = GetComponent(); } public void Update() { transform.up = rb.velocity; } } 

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

动画

我让它在开始时停止闪烁,并通过执行以下操作停止旋转

 public class BulletController : MonoBehaviour { private Rigidbody _rb; private bool _followArc; private bool _firstFrame; private void Start() { _rb = GetComponent(); _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().First(x => x.CompareTag("BarrelPivotPoint")); _bulletSpawn = GetComponentsInChildren().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(); 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; } } 

我相信你所说的是 – 你的剧本展览1非常有用。

如果你考虑一下,你所要做的就是在你想要的时候关掉那种行为。

在这种情况下,你在想“当它碰到地面时行为应该停止。我认为这就是你的意思。

关闭MonoBehaviour很容易,因为你知道只有enabled = false;

所以,你有一些像BulletBulletBoss那样的脚本

在那里,你将有一个变量私有PointingBehaviour pb ,你只需要pb.enabled = false

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

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

当你为这样的抛射物写出指向行为时,可以做一件非常容易的事情,试着将它轻轻地拉到切线上。 结果是惊人的真实外观。 接下来或许可以添加一些非常类似炸弹的随机“摆动”。 令人惊讶的是用户可以看到这样的东西,只有几帧。 (我想下一步将是真实的空气物理学!)

请注意,当然, PointingBehaviour应该只是它自己的脚本。 你必须保持行为完全孤立。


关于提到的LateUpdate从来没有必要使用它。

Unity提供“脚本订单执行”系统(请参阅“首选项”菜单选项),如果真的想在框架内订购。 但关于这样做的唯一原因可能是出于某些实验原因。

它更像是“使用全局” – 没有理由。 与任何代码一样,如果您必须按给定顺序执行某些操作,请按顺序调用。