簡體   English   中英

Unity3D C#-文本UI

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM