NullReferenceException无法弄清楚什么是Null

时间:2013-06-30 04:49:57

标签: c# unity3d

我在Unity中遇到此错误:

NullReferenceException:未将对象引用设置为对象的实例 TowerSlot.OnGUI()(在Assets / TowerSlot.cs:26)

我对Unity比较陌生,无法弄清楚这个错误来自哪一行(我假设是26)而且我不知道什么是null。如果有人可以请帮助向我解释如何理解错误指向的内容以及我需要做什么,将非常感激。

TowerSlot.cs:

using UnityEngine;
using System.Collections;

public class TowerSlot : MonoBehaviour {
    public GUISkin skin = null;

    bool gui = false;

    // Tower prefab
    public Tower towerPrefab = null;

    void OnGUI() {    
        if (gui) {
            GUI.skin = skin;

            // get 3d position on screen        
            Vector3 v = Camera.main.WorldToScreenPoint(transform.position);

            // convert to gui coordinates
            v = new Vector2(v.x, Screen.height - v.y); 

            // creation menu for tower
            int width = 200;
            int height = 40;
            Rect r = new Rect(v.x - width / 2, v.y - height / 2, width, height);
            GUI.contentColor = (Player.gold >= towerPrefab.buildPrice ? Color.green : Color.red);
            GUI.Box(r, "Build " + towerPrefab.name + "(" + towerPrefab.buildPrice + " gold)");

            // mouse not down anymore and mouse over the box? then build the tower                
            if (Event.current.type == EventType.MouseUp && 
                r.Contains(Event.current.mousePosition) &&
                Player.gold >= towerPrefab.buildPrice) {
                // decrease gold
                Player.gold -= towerPrefab.buildPrice;

                // instantiate
                Instantiate(towerPrefab, transform.position, Quaternion.identity);

                // disable gameobject
                gameObject.SetActive(false);
            }
        }
    }

    public void OnMouseDown() {
        gui = true;
    }


    public void OnMouseUp() {
        gui = false;
    }
}

此外,我正在尝试按照此教程http://makeagame.info/unity-tower-defense-game-step-4-scripting

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以在早期将towerPrefab设置为null,然后在第26行,在为其指定任何非空值之前引用其buildPrice属性或字段。这将抛出一个空例外。

这一行是问题所在:

GUI.contentColor = (Player.gold >= towerPrefab.buildPrice ? Color.green : Color.red);

答案 1 :(得分:0)

打嗝指出了这个问题。我认为这可能会解决它:

public Tower towerPrefab = new Tower();

因为Tower类具有您尝试访问的属性buildPrice

答案 2 :(得分:0)

OP对@Hatchet的回复中的屏幕截图肯定显示编辑器中未设置塔预制件。

它应该由其他一些代码(不起作用)设置,或者应该手动设置。您可以通过将塔式预制件拖到插槽上,或者通过单击“无(塔)”右侧的小圆圈来执行此操作:这将弹出一个拾取器对话框,您可以在其中选择塔式预制件。它显示为“塔”,因为它是它想要的那种变量。

BTW GUIskin也未设置。当你点击

时,这可能会导致问题
GUI.skin = skin;

关于Unity gui的文档,用于分配这样的引用:http://docs.unity3d.com/Documentation/Manual/EditingReferenceProperties.html