2017-03-18 35 views
0

我有两个类,genDicTable和StartGame。我想从StartGame中的genDicTable引用一个变量,但它会产生NULL。引用另一个类中的变量会产生NULL

genDicTable.cs

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

public class genDicTable : MonoBehaviour 
{ 
    public TextAsset file; 
    public double masterCount; 

    private void Start() 
    { 
     Load(file); 

     masterCount = rowList.Count; 
     Debug.Log(masterCount); // <-- This properly prints out the value of masterCount  
    } 

    public class Row 
    { 
     public string id; 
     public string word; 
     public string length; 
    } 

    public List<Row> rowList = new List<Row>(); 

    public void Load(TextAsset csv) { 
     // This function assigns a value into RowList 
    } 
} 

StartGame.cs

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

public class StartGame : MonoBehaviour { 

    public genDicTable GEN;  

    private void Start() 
    { 
     Debug.Log(GEN.masterCount); // <-- This yields NULL. 
    } 
} 

因此,问题是,当我在StartGame.cs访问变量masterCount,它产生一个错误“的NullReferenceException:对象引用未设置为对象的实例。“

我在这里错过了什么?

+0

正如它说的值为空。这种行为没有任何问题。您尚未在startgame.cs中为genDictTable类型的变量GEN创建任何实例 –

+0

请仔细阅读指向的副本。如果你不知道什么是实例以及如何初始化它,那么这里给出的答案都不能帮助你理解你的问题,并且出于同样的原因避免未来的错误 – Steve

回答

3

您需要对该对象的引用。

如果你的类连接到同一个对象,你StartGame,那么你可以这样做:public genDicTable GEN = GetComponent<genDicTable>();

如果你的类连接到一个不同的对象,然后public genDicTable GEN = GameObject.Find("YourOtherObjectName").GetComponent<genDicTable>();

编辑

如果genDicTable脚本存在并且您只想引用它:

public class StartGame : MonoBehaviour { 

    public genDicTable GEN;  

    private void Start() 
    { 
     GEN = GameObject.Find("your object's name").GetComponent<genDicTable>();` 
     Debug.Log(GEN.masterCount); // <-- This yields NULL. 
    } 
} 

如果genDicTable脚本确实不存在存在,您只是想创建它的新实例,然后检查this答案。

+0

谢谢,但是你的建议会导致“UnityException:Find is is不允许从MonoBehaviour构造函数(或实例字段初始值设定项)调用,在唤醒或启动时调用它,而不是“错误”。我也在Start中调用它,并且我的变量值变为0,这不是合适的值。 – Dongsan

+0

@龙山修改了他的答案。再次检查。您必须在函数内执行'GetComponent'。 – Programmer

+0

谢谢FCin和所有其他顾问。最后,我明白出了什么问题,问题在于两个脚本执行的顺序。原来,推荐人在被推荐之前被执行。这就是为什么我没有得到(或错误)我想要的价值。我将genDicTable中的Start()更改为Awake(),并解决了问题。所有,请原谅我的愚蠢。 – Dongsan

-1
public static double masterCount; 

不太记得它是如何统一的编辑工作,但看起来好像你还没有创建的genDicTable因此需要加倍的实例是静态的,以便能够访问。

+0

我已经尝试添加“静态”,但没有运气...... – Dongsan

+0

genDicTable的启动方法曾经运行过吗? –

+0

是的,我检查了genDicTable中的所有东西都能正常工作,并产生它应该产生的效果。问题是如何从另一个类引用... – Dongsan

-1

您从不初始化该字段。将其更改为这个

public genDicTable GEN = new genDicTable(); 

或做它在构造函数中:

public StartGame() 
{ 
    GEN = new genDicTable(); 
} 
+0

感谢但新的genDicTable()产生另一个警告说:“你正试图使用​​'new'关键字创建一个MonoBehavior,这是不允许的......” – Dongsan

+0

最好的办法是为这个问题打开另一张票。不幸的是,我从来没有使用过“MonoBehaviour”,因此无法帮助你。 –

+0

您[不能](http://stackoverflow.com/a/37399263/3785314)使用'new'关键字创建从'MonoBehaviour'继承的脚本的新实例。 – Programmer

-1

你没有带分配给GEN任何价值。这应该解决问题:

private void Start() 
{ 
    GEN = new genDicTable(); 
    Debug.Log(GEN.masterCount); // <-- This is no longer NULL. 
} 
+0

感谢但新的genDicTable()产生另一个警告说:“你正试图用'new'关键字创建一个MonoBehavior,这是不允许的......”就像你说的那样,它不再是null,而是变成0,这不是合适的值。 – Dongsan

+0

@Dongsan停下来,看看[FCin's](http://stackoverflow.com/a/42875938/3785314)的答案。 – Programmer

+0

嗯,没有看到你使用的是团结(因此MonoBehaviour)。这将在使用Visual Studio开发WinForms-Application时起作用,但在这里不会... – MrElliwood