0

NullReferenceException: オブジェクト参照がオブジェクト Tower.OnGUI () のインスタンスに設定されていません (Assets/Tower.cs:100)

関連する行は次のとおりです。

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

Towers の変数はそのように定義されていますが、間違っていますか?

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

ありがとう!

4

3 に答える 3

0

nullであるか、問題の原因となっている行の前にMain呼び出していないようです。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
        };
    }
}
于 2013-07-22T08:49:46.517 に答える
0

Start 関数の行を、作成時に呼び出される Awake 関数に移動する必要があります。そして、配列に 0 から 10 までアクセスしようとしましたが、配列のサイズが 10 であるため、9 までの配列にアクセスする必要があります。値の実際のカウントを意味します。

于 2014-04-17T05:01:51.987 に答える