[英]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.