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 循环,然后再移除对象。