【问题标题】:Instantiating a prefab and then adding a force to it (Projectile) - Unity实例化预制件,然后向其添加力(Projectile) - Unity
【发布时间】:2021-06-13 23:55:29
【问题描述】:

我正在尝试向 Unity 中实例化射弹的 Rigidbody 组件添加力。我想使用这种方法,因为它是一个简单的投掷机制,我只想让弹丸在一个小的抛物线轨迹上移动。弹丸预制件已在 Unity 编辑器中附加到此脚本,并且它确实具有刚体组件。

到目前为止,这是我的代码:

private void ProjectileShoot()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift) && !gameOver)
        {
            Rigidbody projectileRb = projectilePrefab.GetComponent<Rigidbody>();
            Instantiate(projectilePrefab, transform.position, 
                projectilePrefab.transform.rotation);
            projectileRb.AddForce(throwForce * Vector3.forward, ForceMode.Impulse);
        }
    }

射弹预制件按预期在玩家的位置生成,但它只是直接落到地上。不管throwForce我申请多少。

顺便说一句,ProjectileShoot()Update() 中。

我是 C# 和 Unity 的业余爱好者,这是我的第一个项目,因此非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: c# unity3d spawn projectile


    【解决方案1】:
    private void ProjectileShoot()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift) && !gameOver)
        {
            GameObject projectileGO = (GameObject) Instantiate(projectilePrefab, transform.position, 
                projectilePrefab.transform.rotation);
    
            Rigidbody projectileRb = projectileGO.GetComponent<Rigidbody>();
            projectileRb.AddForce(throwForce * Vector3.forward, ForceMode.Impulse);
        }
    }
    

    您之前所做的是试图从预制件中抓取刚体,但这是不可能的。相反,通过在实例化时将其设置为变量来从实例中获取刚体。

    【讨论】:

      【解决方案2】:

      Rigidbody projectileRb = projectilePrefab.GetComponent&lt;Rigidbody&gt;();

      引用预制件的刚体。

      Instantiate(projectilePrefab, transform.position, 
                  projectilePrefab.transform.rotation);
      

      使用预制件实例化一个新实体。

      projectileRb.AddForce(throwForce * Vector3.forward, ForceMode.Impulse);
      

      力被应用到被引用的刚体上。


      您正在创建一个新实体,但没有访问它的刚体,而是使用了预制件的刚体。为了解决这个问题,在实例化新实体(即预制件的游戏对象)时,保留它的引用并使用它的刚体来施加力。

      GameObject projectile = (GameObject) Instantiate(projectilePrefab, transform.position, 
      projectilePrefab.transform.rotation);
      
      Rigidbody rb = projectile.GetComponent<Rigidbody>();
      projectileRb.AddForce(throwForce * Vector3.forward, ForceMode.Impulse);
      

      【讨论】:

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