Unity:实例化Rigidbody时的NullReferenceException

时间:2015-09-29 20:08:05

标签: c# unity3d

实例化后的Rigidbody2D空引用异常

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

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

BTW,确切的错误信息是:

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());
     }
 }

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在发布问题之前,你真的需要做更多的研究。对于任何程序员在他们的第一个OOP程序之后,这应该是相当明显的。您正在使用没有价值的对象。也许你的变换永远不会发生,或者你的四元数不存在。某种东西

答案 1 :(得分:0)

在我看来,问题在于以下几行:

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

调用Instantiate后,您尝试使用Rigidbody2D运算符将结果强制转换为as的实例。现在,这就是微软对这个运营商所说的话:

  

as运算符就像一个强制转换操作。但是,如果转换   是不可能的,因为返回null 而不是引发异常。

看起来无法进行转换,因此当您在其上调用USBInstancenullGetComponent

答案 2 :(得分:0)

正如Kapol详细说明的那样,您的问题似乎是您尝试使用以下行投放GameObjectRigidBody2D

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

由于此转换将失败(这两种类型确实完全不同),这行代码基本上适用于USBInstance = null;,并且尝试调用其上的任何方法将为您提供NullReferenceException

看到你已经在下一行调用了GetComponent<Rigidbody2D>(),就没有必要尝试将Instantiate()的结果转换为任何内容;只需将其保留为GameObject

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

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