unity NullReferenceException 访问另一个脚本的变量后
Unity NullReferenceException after accessing a variable of another script
在尝试从列表中访问另一个游戏对象的另一个脚本中的变量后,我每次都会遇到异常。主要代码如下所示:
private var BombList = new List.<GameObject>();
private var BombTemp : GameObject;
private var BombTempScript : Bomb;
function Start () {
BombTemp = null;
BombTempScript = null;
BombList.Clear();
}
function Update () {
if(BombList.Count > 0){
for(var i : int = 0; i<BombList.Count;i++){
BombTemp = BombList[i];
BombTempScript = BombTemp.GetComponent.<Bomb>();
if(BombTempScript.bombCountdown <= 0){
BombTempScript.explode();
BombList.Remove(BombTemp);
addHealth(-1);
}
}
}
}
function OnTriggerEnter (other : Collider) {
if(other.gameObject.CompareTag("Bomb")){
BombList.Add(other.gameObject);
other.gameObject.GetComponent.<Bomb>().notListed = false;
}
}
function OnTriggerExit(other : Collider){
if(other.gameObject.CompareTag("Bomb")){
if(BombList.Contains(other.gameObject)){
BombList.Remove(other.gameObject);
other.gameObject.GetComponent.<Bomb>().notListed = true;
}
}
}
如果列表中没有对象,则更新函数中的代码不会按预期工作。但是当里面有一个对象时,它会在 if Line:
中产生一个 NullReferenceException
if(BombTempScript.bombCountdown <= 0)
指向名为bombCountdown 的变量,不断变化。
这是预期的代码:
#pragma strict
public var bombCountdown : float;
public var notListed : System.Boolean;
function Start () {
bombCountdown = 10.0;
notListed = true;
}
function Update () {
bombCountdown -= Time.deltaTime;
if(bombCountdown <= 0 && notListed)
explode();
}
function explode(){
Destroy(myText);
Destroy(this.gameObject);
}
希望你能帮助我们。
提前致谢,愚蠢的科学家们
我认为代码中存在一个小错误,导致它发生。
在 Bomb 脚本的以下部分中,您将销毁炸弹对象,而不是将其从第一个脚本的 BombList 中删除。
因此,BombList[i] 可能会变为空,因为它可能已经被销毁了。
如果您确保在 Bomb 被摧毁时更新 BombList,我想代码会起作用。
您在 for 循环中从列表中删除了游戏对象,因此列表中的所有索引都从删除的对象向左移动。并且计数与 for loop started 不同。首先,您必须完成 for 循环,然后再移除对象。
在尝试从列表中访问另一个游戏对象的另一个脚本中的变量后,我每次都会遇到异常。主要代码如下所示:
private var BombList = new List.<GameObject>();
private var BombTemp : GameObject;
private var BombTempScript : Bomb;
function Start () {
BombTemp = null;
BombTempScript = null;
BombList.Clear();
}
function Update () {
if(BombList.Count > 0){
for(var i : int = 0; i<BombList.Count;i++){
BombTemp = BombList[i];
BombTempScript = BombTemp.GetComponent.<Bomb>();
if(BombTempScript.bombCountdown <= 0){
BombTempScript.explode();
BombList.Remove(BombTemp);
addHealth(-1);
}
}
}
}
function OnTriggerEnter (other : Collider) {
if(other.gameObject.CompareTag("Bomb")){
BombList.Add(other.gameObject);
other.gameObject.GetComponent.<Bomb>().notListed = false;
}
}
function OnTriggerExit(other : Collider){
if(other.gameObject.CompareTag("Bomb")){
if(BombList.Contains(other.gameObject)){
BombList.Remove(other.gameObject);
other.gameObject.GetComponent.<Bomb>().notListed = true;
}
}
}
如果列表中没有对象,则更新函数中的代码不会按预期工作。但是当里面有一个对象时,它会在 if Line:
中产生一个 NullReferenceExceptionif(BombTempScript.bombCountdown <= 0)
指向名为bombCountdown 的变量,不断变化。 这是预期的代码:
#pragma strict
public var bombCountdown : float;
public var notListed : System.Boolean;
function Start () {
bombCountdown = 10.0;
notListed = true;
}
function Update () {
bombCountdown -= Time.deltaTime;
if(bombCountdown <= 0 && notListed)
explode();
}
function explode(){
Destroy(myText);
Destroy(this.gameObject);
}
希望你能帮助我们。
提前致谢,愚蠢的科学家们
我认为代码中存在一个小错误,导致它发生。
在 Bomb 脚本的以下部分中,您将销毁炸弹对象,而不是将其从第一个脚本的 BombList 中删除。
因此,BombList[i] 可能会变为空,因为它可能已经被销毁了。
如果您确保在 Bomb 被摧毁时更新 BombList,我想代码会起作用。
您在 for 循环中从列表中删除了游戏对象,因此列表中的所有索引都从删除的对象向左移动。并且计数与 for loop started 不同。首先,您必须完成 for 循环,然后再移除对象。