【问题标题】:Unity : NullReferenceException when Instantiating RigidbodyUnity:实例化刚体时出现 NullReferenceException
【发布时间】:2015-09-30 23:00:24
【问题描述】:

实例化后的 Rigidbody2D 空引用异常

我需要 Unity 游戏引擎特定的答案。

所以基本上,我正在编写一个控制生成器的脚本。它非常通用,基本上它的作用是在实例化刚体生成后对其施加力。但由于某种原因,每次我第一次生成对象时,Unity 都会抛出 NullReferenceException 错误。我检查了我的代码的勘误表,但我认为这很好。有人有提示吗?

顺便说一句,确切的错误信息是:

NullReferenceException:对象引用未设置为对象的实例 USBSpawner+c__Iterator0.MoveNext ()(在 Assets/Scripts/USBSpawner.cs:24)

代码:

 using UnityEngine;
 using System.Collections;

 public class USBSpawner : MonoBehaviour {

     public static bool isActive = true;

     public GameObject USBPrefab;
     public float spawnDelay = 5f;
     public Vector2 throwForce;

     void Start() {
         StartCoroutine(SpawnUSB());
     }
     IEnumerator SpawnUSB () {
         yield return new WaitForSeconds(spawnDelay);

         if(isActive) {
             var newTransform = transform;

             Rigidbody2D USBInstance;
             USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D;
             USBInstance.GetComponent<Rigidbody2D>().velocity = throwForce;
         }

         StartCoroutine(SpawnUSB());
     }
 }

有什么想法吗?

【问题讨论】:

标签: c# unity3d


【解决方案1】:

正如 Kapol 所详述,您的问题似乎是您尝试将 GameObject 转换为 RigidBody2D 与以下行:

USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D;

由于这个转换会失败(这两种类型真的很不同),这行代码基本上可以运行到USBInstance = null;,并且尝试调用它上面的任何方法都会给你一个NullReferenceException

鉴于您已经在下一行调用了GetComponent&lt;Rigidbody2D&gt;(),因此无需尝试将Instantiate() 的结果转换为任何内容;只需将其保留为GameObject

USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity);

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    在发布问题之前,您确实需要进行更多研究。这对于任何在他们的第一个 OOP 程序之后的程序员来说都应该是相当明显的。您正在使用一个没有价值的对象。也许您的转换从未进行过,或者您的四元数不存在。类似的东西

    【讨论】:

    • 实例化调用相当于new
    • @Cjen1 对。我没看到。谢谢!
    【解决方案3】:

    在我看来,问题出在下面一行:

    USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D;
    

    调用Instantiate 后,您尝试使用as 运算符将结果转换为Rigidbody2D 的实例。下面是微软对这个运算符的评价:

    as 运算符类似于强制转换操作。但是,如果转换 不可能,因为 返回 null 而不是引发异常。

    看起来转换是不可能的,因此当你调用 GetComponent 时,USBInstancenull

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      相关资源
      最近更新 更多