【问题标题】:Get velocity of instantiated prefab获取实例化预制件的速度
【发布时间】:2021-04-07 07:07:33
【问题描述】:

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

 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),质量是正确的)。我做错了什么,如何获得每个实例化子弹的速度?

【问题讨论】:

    标签: c# unity3d game-physics rigid-bodies prefab


    【解决方案1】:

    物理仅在下一次FixedUpdate 调用中更新。

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

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

    Clone2.velocity = bulletVelocity;
    

    这对于初始化子弹完全没问题,因为在这里我们明确地想要立即改变速度。

    请注意,Clone2.GetComponent&lt;Rigidbody&gt;() 相当多余。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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2016-11-04
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多