0

我从我的预制“子弹”中实例化刚体“克隆”以在我的项目中拍摄它们。我想获得我射击的每颗子弹(每一个实例)的速度。在下面我的代码示例中:

 public GameObject throwstart;
 public Rigidbody Clone;
 public float bulletVelocity { get; set; } = 1;
 ...
 ...
 void Update()
     {
         if (Input.GetKeyDown(KeyCode.Space))
         {
             Rigidbody Clone2;
             Clone2 = Instantiate(Clone, throwstart.transform.position, throwstart.transform.rotation);
             Clone2.GetComponent<Rigidbody>().AddForce(Clone2.transform.forward * bulletVelocity, ForceMode.Impulse);
             Debug.Log("Velocity Clone Instanz: " + Clone2.mass);
             Debug.Log("Velocity Clone Instanz: " + Clone2.velocity);
         }
     }

通过上面的代码,我得到了我的预制件的速度/质量(但速度总是(0、0、0),质量是正确的)。我做错了什么,如何获得每个实例化子弹的速度?

4

1 回答 1

0

物理仅在下次FixedUpdate通话中更新。

所以此时速度很可能仍然是 0。

我宁愿简单地设置而不是力量

Clone2.velocity = bulletVelocity;

这对于初始化子弹是完全可以的,因为这里我们明确地想要立即改变速度。

注意顺便说一句,这Clone2.GetComponent<Rigidbody>()是非常多余的..Clone2已经Rigidbody.


如果你真的想做你目前正在尝试的事情,你可能不得不等到FixedUpdate然后做例如

void Update()
 {
     if (Input.GetKeyDown(KeyCode.Space))
     {
         var Clone2 = Instantiate(Clone, throwstart.transform.position, throwstart.transform.rotation);
         Clone2.AddForce(Clone2.transform.forward * bulletVelocity, ForceMode.Impulse);
         
         StartCoroutine(ShowVelocity(Clone2));
     }
 }

private IEnumerator ShowVelocity(Rigidbody rigidbody)
{
    yield return new WaitForFixedUpdate();

    Debug.Log("Mass Clone Instanz: " + rigidbody.mass);
    Debug.Log("Velocity Clone Instanz: " + rigidbody.velocity);
}
于 2021-04-07T07:37:39.177 回答