Unity3d 统一:按空格键时更改UI.Canvas.Text.Text

Unity3d 统一:按空格键时更改UI.Canvas.Text.Text,unity3d,reference,null,instantiation,Unity3d,Reference,Null,Instantiation,类ChangeText是UI.Canvas.Text的子类: using UnityEngine; using UnityEngine.UI; public class ChangeText : MonoBehaviour { Text Instruction; // Use this for initialization void Start () { Instruction = GetComponent<Text>(); Debug.Lo

类ChangeText是UI.Canvas.Text的子类:

using UnityEngine;
using UnityEngine.UI;

public class ChangeText : MonoBehaviour {

Text Instruction;

// Use this for initialization
void Start () {        

    Instruction = GetComponent<Text>();

    Debug.Log("Instruction: " + Instruction.text);
}

// Update is called once per frame
void Update () {

}

public void ChangeTheInstruction(string inst)
{
    Instruction.text = inst;
    Debug.Log("Instruction is now: " + Instruction.text);
}
}

我从CT对象得到一个NullReferenceException,因为CT没有实例化,但我不能在MonoBehavior上使用“new”。如何正确执行此操作?

CT
声明为public(或在其上方添加
[SerializeField]
标记),然后在inspector中拖放包含
ChangeText
组件的游戏对象

public class SpacePress : MonoBehaviour 
{
    [SerializeField]
    private ChangeText CT; // Drag & drop in the inspector

}
另一个解决方案(不太建议)是保持
CT
私有,并使用
GetComponent
Find
函数之一检索它:

public class SpacePress : MonoBehaviour
{
    private ChangeText CT;

    // Use this for initialization
    void Start ()
    {
        CT = FindObjectOfType<ChangeText>();
        // OR
        // CT = GameObject.Find("NameOfTheObjectHoldingCT").GetComponent<ChangeText>();
    }
}
公共类SpacePress:MonoBehavior
{
私有文本CT;
//用于初始化
无效开始()
{
CT=FindObjectOfType();
//或
//CT=GameObject.Find(“name of objectholdingct”).GetComponent();
}
}

HI,我使用了:CT=GameObject.Find(“Text”).GetComponent();在start()方法中,因为ChangeText()已作为Canvas.Text的组件添加完毕。但在更改文本之前,我仍然会遇到一个NullReference错误。我可以解决这个一次性错误吗?
GameObject.Find
将检索名为
Text
的游戏对象。问题是,您可能检索到错误的游戏对象。重命名游戏对象,使其具有唯一的名称。但我强烈建议你选择第一个解决方案。我想选择第一个解决方案。但我要把什么拖给检查员?脚本已经在Text对象下了。正如我所说,您必须在
SpacePress
脚本中放置
ChangeText
实例的公共/序列化引用。然后,在
SpacePress
的检查器的
CT
字段中拖放包含
ChangeText
脚本的对象。
public class SpacePress : MonoBehaviour
{
    private ChangeText CT;

    // Use this for initialization
    void Start ()
    {
        CT = FindObjectOfType<ChangeText>();
        // OR
        // CT = GameObject.Find("NameOfTheObjectHoldingCT").GetComponent<ChangeText>();
    }
}