2013-02-07 10 views
6

Ich bin neu zu NGUI und unity 3d. Ich habe zwei Platten in einer ui Wurzel. sein Name ist firstPanel und secondPanel. secondPanel ist in der Szene deaktiviert. In firstPanel habe ich so viele Tasten und man ist eine play Taste, das ist Bild-Taste. Während Klick auf play Taste sollte firstPanel erhalten verstecken und secondPanel sollte zeigen .Ich adde ein neues Script zu play Taste und geschriebenen Code in esPanel verstecken und in NGUI

void OnClick(){ 
    GameObject panel2 = GameObject.Find("secondPanel"); 
    NGUITools.SetActive(panel2,true);  
    GameObject panel1 = GameObject.Find("firstPanel");   
    NGUITools.SetActive(panel1,false); 

} 

Aber ich bekomme diese Fehler: "NullReferenceException" In Welches Skript von ngui ich muss bearbeiten und wie kann ich es tun? Bitte helfen Sie mir, dieses Problem zu lösen Vielen Dank im Voraus.

+1

In welcher Zeile erhalten Sie die Ausnahme? – Kay

+0

GameObject panel2 = GameObject.Find ("secondPanel"); hier bekomme ich Fehler – Sona

Antwort

8

Wenn Ihre Panels als Panel1 und Panel2 benannt sind, finden Sie sie nicht mit GameObject.Find ("secondPanel") und GameObject.Find ("firstPanel"). Wenn „Panel1“ und „Panel2“ in der Spielszene der einzige Name ist (keine andere Panel1 oder Panel2), dann können Sie versuchen,

void OnClick(){ 
    GameObject panel2 = GameObject.Find("Panel2"); 
    NGUITools.SetActive(panel2,true);  
    GameObject panel1 = GameObject.Find("Panel1");   
    NGUITools.SetActive(panel1,false); 

} 
+0

Entschuldigung. es funktioniert nicht richtig. secondpanel ist in der Szene inaktiv. also kann ich es nicht zeigen. – Sona

+3

Also ich denke, dass sie als Referenz funktionieren wird. Versuchen Sie Folgendes: Fügen Sie "public GameObject panel2;" in Ihrem Skript (im Klassenkörper, zum Beispiel direkt über dem void OnClick). Wählen Sie dann Ihre Wiedergabetaste. Sie werden ein Feld namens "Panel2" in Ihrem Skript im Inspektor sehen. Ziehen Sie das zweite Panel aus der Spielszene in das Feld. Dann können Sie die GameObject-Zeile löschen und panel2 direkt verwenden. – onevcat

+0

Warum GameObject.Find und NGUITools verwenden.SetActive? Das ist so langsam ... Gibt es keinen Weg, nicht einfach zu rendern? – GeekPeek

3

GameObject.Find zu verwenden („Something“) kann kein behindertes Spiel finden Objekt, so können Sie nicht auf diese Weise verwenden. Sie können versuchen, Ihrem Tastencode eine Spiegelung hinzuzufügen:

und setzen Sie diese im rechten Fensterbereich des Szeneneditorfensters.

Ein anderer Weg, müssen Sie zuerst in der Szene aktiv Ihre beiden Platten halten, dann Code auf Ihre Schaltfläche Skript wie folgt hinzu:

private GameObject panel1 = null; 
private GameObject panel2 = null; 
void Start() 
{ 
    panel1 = GameObject.Find("Panel1"); 
    panel2 = GameObject.Find("Panel2"); 
} 

void OnClick() 
{ 
    panel2.SetActiveRecursively(true); 
    panel1.SetActiveRecursively(false); 
} 

GameObject.Find (string name) Funktion nicht sehr effizient ist Versuchen Sie nicht, es in Unity3D in Update() oder bei jedem Klicken auf die Schaltfläche zu verwenden.

0

Sie können GameObject.Find() nicht verwenden, um ein deaktiviertes Spielobjekt zu finden, es gibt null zurück;

1

Ich weiß, dass dieser Thread alt ist, aber wenn jemand ein Problem hat, das Panels aufruft, wenn sie inaktiv sind, können Sie Ihr Panel vorfertigen und das NGUITools.AddChild verwenden, um Ihr Panel aufzurufen. Es würde ungefähr so ​​aussehen.

public GameObject parent; 
public GameObject child; 

void Spawn() { 

NGUITools.AddChild (parent, child); 

} 

Weisen Sie Ihre UIRoot zu Eltern (oder was auch immer Sie das Panel hinzufügen möchten), und ordnen Sie Ihre Panel Kind im Editor und du bist fertig! Ich hoffe, dass dies jemandem hilft, dies ist ein häufiges Problem bei der ersten Arbeit mit NGUI.

Happy Coding :)