[英]Unity3D C# - Text UI
我有以下代码。 我在编辑器中将文本组件引用为no_lives。 游戏经理(单身)之前被实例化为场景。 debug.log()在控制台中显示5。 但是当我尝试设置文本时,我得到的是引用未设置为对象的实例。 这是为什么?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class level1_script : MonoBehaviour {
public Text no_lives;
// Use this for initialization
void Start () {
no_lives = GetComponent<Text>();
}
// Update is called once per frame
void Update () {
int lives_n = gamemanager.lives_f ();
Debug.Log (lives_n);
no_lives.text = lives_n + " x";
}
}
您确定Start()
在Update
之前被调用并且GetComponent
实际上将值设置为no_lives
吗?
如果不是,则进行防御性编码。 另外, lives_n
需要转换为字符串lives_n.ToString() + " x"
或使用格式。
void Update () {
int lives_n = gamemanager.lives_f ();
Debug.Log (lives_n);
if(no_lives != null) {
no_lives.text = string.Format("{0} x", lives_n);
}
}
编辑:
但是当我尝试设置文本时,我得到的是引用未设置为对象的实例。
这是因为当您执行GetComponent<Text>()
,它将在您的level1_script
脚本所附加的相同 level1_script
上查找Text
组件的实例。
您有两种选择:
1。将 GameObject和您的level1_script
脚本连接到Text
组件,然后您的当前代码应该可以正常工作。
2。如果你已经拥有了Text
连接到另一个游戏物体组件,让我们说所谓的“MYTEXT”对象,请使用GameObject.Find找到“MYTEXT”然后执行GetComponent
它来得到Text
组件。
no_lives = GameObject.Find("MyText").GetComponent<Text>()
编辑:
好吧,文本和脚本都附加到同一对象prntscr.com/f7p7vx
它可能已附加到多个GameObject,而另一个GameObject没有附加Text
脚本。
选择level1_script
脚本,转到“ 资产 -> 在场景中查找引用”,然后从其他对象中删除重复的脚本。
当脚本在调试日志中记录“ 5”时,在我看来,变量lives_n的使用正确。 我的猜测是未填充组件“ no_lives”(这通常是导致“未将引用设置为对象的实例”错误)的原因,建议您尝试将脚本添加到您的UI Text对象中场景,这样脚本可以在该对象上找到“文本”组件。
了解对象和组件之间的差异非常重要,因为它们都是统一性的重要组成部分。 对象是场景中的“事物”,例如立方体,照相机和类似的东西。 另一方面,组件是对象的一部分,并定义该对象的属性。 例如:照相机对象具有照相机组件,以使其成为照相机并使用户实际可见。 GetComponent <>()方法在脚本附加到的对象上搜索(在您的情况下)Text组件。
希望这可以帮助! (哦,别忘了从脚本上放置的其他对象中删除该脚本,以防万一这可行。否则,您仍然会收到错误消息)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.