2017-05-14 7 views
1

Ich habe das folgende Stück Code. Ich habe die Textkomponente im Editor auf no_lives verwiesen. Der Gamemanager (Singleton) wird zuvor eine Szene instanziiert. Das debug.log() zeigt 5 in der Konsole an. Aber wenn ich versuche, den Text zu setzen, bekomme ich, dass die Referenz nicht auf eine Instanz des Objekts gesetzt ist. Warum das?Unity3D C# - Text 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 ()' scheint nicht Arbeit – Dawnkeeper

+0

Sind Sie sicher, dass 'Start()' vor 'Update' aufgerufen wurde und dass die GetComponent tatsächlich einen Wert auf' no_lives' setzt? Auch 'lives_n' muss in einen String' lives_n.ToString() + "x" ' – Nkosi

Antwort

3

Sind Sie sicher, dass Start() vor Update genannt wurde und dass die GetComponent tatsächlich einen Wert no_lives Einstellung?

Wenn nicht, dann defensiv. Auch lives_n muss in eine Zeichenfolge lives_n.ToString() + " x" konvertiert werden oder ein Format verwenden.

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); 
    } 
} 

EDIT:

Aber wenn ich versuche, den Text, den ich bekommen zu setzen, dass der Verweis nicht auf eine Instanz des Objekts festgelegt wird.

Das ist, weil, wenn Sie GetComponent<Text>‌​() tun, ist es für die Instanz von Text Komponente auf die-gleiche Gameobject Ihr level1_script Skript angebracht aussehen wird.

Sie haben zwei Möglichkeiten:

.Attach Text Komponente, die Ihr level1_script Skript Gameobject atached Ihre aktuelle Code dann sollte funktionieren.

.Wenn Sie bereits die Text Komponente an einen anderen Gameobject angeschlossen haben, lassen Sie uns ein Objekt „MyText“ genannt sagen, verwenden GameObject.Find„MyText“ dann ausführen GetComponent darauf zu finden, Holen Sie sich die Text Komponente.

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

Edit:

Nun, beide Text und Skript auf das gleiche Objekt angebracht prntscr.com/f7p7vx

Es ist wahrscheinlich mehrere Gameobject befestigt und das andere tut Gameobject nicht das Skript Text angehängt haben.

Wählen Sie das level1_script Skript, gehen Sie zu Assets ->Suche Referenzen in Szene dann von anderen Objekten, die dupliziert Skript entfernen.

+0

konvertiert werden Nun, beide Text und Skript sind an das gleiche Objekt angeschlossen http://prntscr.com/f7p7vx – Stefan

+0

@Stefan Überprüfen Sie die bearbeitet antworte, wenn das der Fall ist – Programmer

1

Da das Skript '5' im Debug-Protokoll protokolliert, scheint es mir, dass die Variable Lives_n korrekt verwendet wird. Meine Vermutung ist, dass die Komponente "no_lives" nicht gefüllt ist (das ist, was oft verursacht die "Verweis ist nicht auf eine Instanz des Objekts festgelegt" Fehler) Ich schlage vor, dass Sie versuchen, das Skript zum UI-Textobjekt hinzuzufügen In Ihrer Szene findet das Skript auf diese Weise die Komponente "Text" für dieses Objekt.

Es ist wichtig, die Unterschiede zwischen Objekten und Komponenten zu kennen, denn beide sind wesentliche Bestandteile der Einheit. Objekte sind "Dinge" in deiner Szene, wie Würfel, Kameras und solche Sachen. Komponenten hingegen sind Teil eines Objekts und definieren die Eigenschaften dieses Objekts. Zum Beispiel: Ein Kamera-Objekt hat eine Kamera-Komponente, um es zu einer Kamera zu machen und es tatsächlich für den Benutzer sichtbar zu machen. Die Methode GetComponent <>() sucht nach einer (in Ihrem Fall) Textkomponente für das Objekt, an das das Skript angefügt ist.

Hoffe, das hilft! (oh und vergiss nicht, das Skript von dem anderen Objekt zu entfernen, falls das funktioniert. Sonst bekommst du immer noch Fehler)