2017-05-14 71 views
1

我有以下一段代碼。我將編輯器中的文本組件引用爲no_lives。遊戲管理者(單身人士)正在實例化之前的一個場景。 debug.log()在控制檯中顯示5。但是,當我嘗試設置文本時,我發現引用未設置爲對象的實例。這是爲什麼?Unity3D C# - 文本UI

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"; 
    } 
} 
+0

'no_lives = GetComponent ()'似乎不是工作 – Dawnkeeper

+0

你確定'Start()'在Update之前被調用,並且GetComponent實際上是將一個值設置爲'no_lives'?另外'lives_n'需要轉換爲字符串'lives_n.ToString()+「x」' – Nkosi

回答

3

你肯定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>‌​(),它會尋找Text組件的實例上的,相同的遊戲對象level1_script腳本被附加到。

你有兩個選擇:

.Attach Text組件,遊戲物體的level1_script腳本atached到那麼你當前的代碼應該工作。

。如果你已經有連接到另一個遊戲物體的Text組件,讓我們說,一個對象調用「MYTEXT」,使用GameObject.Find找到「MYTEXT」然後在其上進行GetComponent到獲取Text組件。

no_lives = GameObject.Find("MyText").GetComponent<Text>‌​() 

編輯:

那麼,文本和腳本連接到同一個對象 prntscr.com/f7p7vx

很可能連接到多個遊戲對象和其他遊戲對象呢沒有附加Text腳本。

選擇level1_script腳本,去資產 - >查找場景參考文獻,然後從其他對象中刪除重複的腳本。

+0

好吧,文本和腳本都附加到相同的對象http://prntscr.com/f7p7vx – Stefan

+0

@Stefan檢查編輯回答如果是這樣的話 – Programmer

1

當腳本在調試日誌中記錄'5'時,在我看來,變量lives_n被正確使用。 我的猜測是組件「no_lives」未被填充(這就是常常導致「引用未設置爲對象實例」的錯誤) 我建議您嘗試將腳本添加到UI文本對象在你的場景中,腳本通過這種方式找到該對象上的「文本」組件。

瞭解對象和組件之間的差異很重要,因爲它們都是統一性的重要組成部分。對象是場景中的「事物」,如立方體,相機和類似的東西。另一方面,組件是對象的一部分,並定義該對象的屬性。例如:一個攝像頭對象具有一個攝像頭組件,使其成爲一個攝像頭,並使其實際可供用戶查看。 GetComponent <>()方法在腳本所連接的對象上搜索(在你的情況下)Text組件。

希望這會有所幫助! (哦,不要忘記從你放置的其他物體上刪除腳本,以防止這種情況發生)否則你仍然會收到錯誤