实例化后的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());
}
}
有什么想法吗?
答案 0 :(得分:0)
在发布问题之前,你真的需要做更多的研究。对于任何程序员在他们的第一个OOP程序之后,这应该是相当明显的。您正在使用没有价值的对象。也许你的变换永远不会发生,或者你的四元数不存在。某种东西
答案 1 :(得分:0)
在我看来,问题在于以下几行:
USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D;
调用Instantiate
后,您尝试使用Rigidbody2D
运算符将结果强制转换为as
的实例。现在,这就是微软对这个运营商所说的话:
as运算符就像一个强制转换操作。但是,如果转换 是不可能的,因为返回null 而不是引发异常。
看起来无法进行转换,因此当您在其上调用USBInstance
时null
为GetComponent
。
答案 2 :(得分:0)
正如Kapol详细说明的那样,您的问题似乎是您尝试使用以下行投放GameObject
到RigidBody2D
:
USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D;
由于此转换将失败(这两种类型确实完全不同),这行代码基本上适用于USBInstance = null;
,并且尝试调用其上的任何方法将为您提供NullReferenceException
。
看到你已经在下一行调用了GetComponent<Rigidbody2D>()
,就没有必要尝试将Instantiate()
的结果转换为任何内容;只需将其保留为GameObject
:
USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity);
希望这有帮助!如果您有任何问题,请告诉我。