簡體   English   中英

Unity:NullReferenceException

[英]Unity: NullReferenceException

NullReferenceException:對象引用未設置為對象Tower.OnGUI()的實例(在Assets / Tower.cs:100處)

相關行是:

if(Main.Gold >= Towers.u[stage])

塔中的變量是這樣定義的,我做錯了嗎?

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Towers : MonoBehaviour {

    public static float[] d;
    public static float[] r;
    public static float[] s;
    public static float[] u;

    // Use this for initialization
    void Start () { 
        d = new float[10];
        d[0] = 1f;
        d[1] = 3f;
        d[2] = 5f;
        d[3] = 7f;
        d[4] = 9f;
        d[5] = 11f;
        d[6] = 13f;
        d[7] = 15f;
        d[8] = 18f;
        d[9] = 21f;
        d[10] = 23f;        

        r = new float[10];
        r[0] = 5f;
        r[1] = 9f;
        r[2] = 13f;
        r[3] = 17f;
        r[4] = 21f;
        r[5] = 25f;
        r[6] = 29f;
        r[7] = 33f;
        r[8] = 37f;
        r[9] = 41f;
        r[10] = 45f;

        s = new float[10];
        s[0] = 3f;
        s[1] = 2.8f;
        s[2] = 2.6f;
        s[3] = 2.4f;
        s[4] = 2.2f;
        s[5] = 2f;
        s[6] = 1.8f;
        s[7] = 1.6f;
        s[8] = 1.4f;
        s[9] = 1.2f;
        s[10] = 1f;

        u = new float[10];
        u[0] = 50f;
        u[1] = 100f;
        u[2] = 150f;
        u[3] = 200f;
        u[4] = 250f;
        u[5] = 300f;
        u[6] = 350f;
        u[7] = 400f;
        u[8] = 450f;
        u[9] = 500f;
        u[10] = 0f;     
    }
}

謝謝!

似乎Main為null或沒有在導致問題的行之前調用Towers.Start()

像這樣初始化靜態字段時,有時可以通過調用返回初始化數據的私有靜態方法來在聲明字段的地方使用靜態初始化。

這樣做意味着您不需要記住必須調用的單獨的Start()方法。

例如:

public class Towers: MonoBehaviour
{
    public static float[] d = initD();
    public static float[] r = initR();
    public static float[] s = initS();
    public static float[] u = initU();

    private static float[] initD()
    {
        return new []
        {
             1f,
             3f,
             5f,
             7f,
             9f,
            11f,
            13f,
            15f,
            18f,
            21f,
            23f
        };
    }

    private static float[] initR()
    {
        return new []
        {
             5f,
             9f,
            13f,
            17f,
            21f,
            25f,
            29f,
            33f,
            37f,
            41f,
            45f
        };
    }

    private static float[] initS()
    {
        return new []
        {
            3.0f,
            2.8f,
            2.6f,
            2.4f,
            2.2f,
            2.0f,
            1.8f,
            1.6f,
            1.4f,
            1.2f,
            1.0f
        };
    }

    private static float[] initU()
    {
        return new[]
        {
             50f,
            100f,
            150f,
            200f,
            250f,
            300f,
            350f,
            400f,
            450f,
            500f,
              0f
        };
    }
}

您應該在Awake而不是Start內初始化任何單聲道行為, Awake是您可以在MonoBehaviour生命周期中捕獲的第一個事件。

編輯:請記住,如果您嘗試從Awake訪問其他MonoBehaviour,則無法確定它們是否已初始化。

您應該將“開始”功能中的行移動到創建時調用的“喚醒”功能。 並且您嘗試訪問從0到10的數組,但是數組的大小是10,因此必須訪問最多9的數組。如果要訪問數組的十分之一值,則必須將其分配為11大小,表示值的實際計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM