C# 引用另一个类中的变量会产生NULL
我有两门课,genDicTable和StartGame。我想引用StartName中genDicTable中的一个变量,但它会生成NULL genDicTable.csC# 引用另一个类中的变量会产生NULL,c#,unity3d,C#,Unity3d,我有两门课,genDicTable和StartGame。我想引用StartName中genDicTable中的一个变量,但它会生成NULL genDicTable.cs using UnityEngine; using System.Collections; using System.Collections.Generic; public class genDicTable : MonoBehaviour { public TextAsset file; public doub
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
}
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类可性别区分:单一行为
{
公共文本资产文件;
公共双主计数;
私有void Start()
{
加载(文件);
masterCount=行列表。计数;
Debug.Log(masterCount);//您需要对该对象的引用
如果类附加到与startName
相同的对象,则可以执行以下操作:public genDicTable GEN=GetComponent();
如果您的类附加到其他对象,则public genDicTable GEN=GameObject.Find(“您的其他对象名”).GetComponent();
编辑:
如果存在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.
}
}
公共类开始名称:单一行为{
公共性别可鉴定基因;
私有void Start()
{
GEN=GameObject.Find(“对象名称”).GetComponent()`
Debug.Log(GEN.masterCount);//
我不太记得unity编辑器是如何工作的,但看起来好像您还没有创建genDicTable的实例,因此double需要是静态的才能访问。您从未初始化该字段。将其更改为此
public genDicTable GEN = new genDicTable();
或者在构造函数中执行此操作:
public StartGame()
{
GEN = new genDicTable();
}
您尚未为GEN分配任何值。这将解决此问题:
private void Start()
{
GEN = new genDicTable();
Debug.Log(GEN.masterCount); // <-- This is no longer NULL.
}
private void Start()
{
GEN=新的genDicTable();
Debug.Log(GEN.masterCount);//正如它所说的,值为null。这种行为没有任何错误。您还没有在startgame.csp中为genDictTable类型的变量GEN创建任何实例。请仔细阅读指向的副本。如果您不知道什么是实例以及如何初始化它,那么这里给出的任何答案都不能帮助您理解您的pro问题和避免将来的失误出于同样的原因,我已经尝试添加“static”,但没有运气…genDicTable的start方法是否运行过?是的,我检查了genDicTable中的所有内容,并得出了它应该得到的结果。问题是如何引用另一个类…将其作为static,然后是genDicTable.masterCount而不是GEN.masterCountNo.如果存在多个genDicTable
实例,则会出现问题。GetComponent
是OP正在查找的。谢谢,但是new genDicTable()会产生另一个警告,说明“您正试图使用'new'关键字创建单行为。这是不允许的……”最好是为这个问题打开另一张罚单。不幸的是,我从未使用过monobhavior
,也无法帮助您解决这个问题。您创建了一个脚本的新实例,该脚本使用new
关键字继承自monobhavior
。谢谢,但是new genDicTable()会产生另一个警告“您正试图使用'new'关键字创建一个MonoBehavior。这是不允许的……”正如您所说,它不再是null,而是变成0,这不是正确的值。@Dongsan停止这些,看看答案。好吧,还没看到您使用unity(因此MonoBehavior)。这在使用Visual Studio开发WinForms应用程序时会起作用,但不在此处…谢谢,但您的建议会导致“UnityException:不允许从MonoBehavior构造函数(或实例字段初始值设定项)调用Find”,请改为在唤醒或启动时调用它"错误。我也在Start中调用了它,我的变量的值变成了0,这不是正确的值。@Dongsan修改了他的答案。再次检查。你必须在函数内部执行GetComponent
。谢谢你FCin和所有其他顾问。最后我找出了问题所在,问题在于两个脚本的执行顺序未经验证。结果证明,在引用之前执行了引用。这就是为什么我没有得到(或得到错误)我想要的值。我将genDicTable()中的Start()更改为Awake(),问题就解决了。请原谅我的愚蠢。
public StartGame()
{
GEN = new genDicTable();
}
private void Start()
{
GEN = new genDicTable();
Debug.Log(GEN.masterCount); // <-- This is no longer NULL.
}