Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

panel hide and show in NGUI

I am new to NGUI and unity 3d. I have two panels in a ui root. its named as firstPanel and secondPanel. secondPanel is deactivated in scene. In firstPanel i have so many buttons and one is a play button, that is image button. While Clicking on play button, firstPanel should get hide and secondPanel should show.I adde a new Script to play button and written code in it

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

}

But I get this Error : "NullReferenceException" In which script of ngui i have to edit and how can i do it? please help me to solve this issue Thanks in advance.

like image 573
Sona Rijesh Avatar asked Feb 07 '13 05:02

Sona Rijesh


3 Answers

If your panels are named as Panel1 and Panel2, you will not find them by using GameObject.Find("secondPanel") and GameObject.Find("firstPanel"). If "Panel1" and "Panel2" is the only name in the game scene(No other Panel1 or Panel2), then you can try to use

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

}
like image 60
onevcat Avatar answered Nov 06 '22 22:11

onevcat


GameObject.Find("Something") cannot find any disabled game object, so you cannot use by this way. You can try to add reflection to your button code:

public GameObject pannel1 = null;
public GameObject pannel2 = null;

and set them to right panel in the scene editor window.

Another way, first you need to keep both of your panels active in your scene, then add code to your button script like this:

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) function is not very efficient in Unity3D, so do not try to use it in Update() or every time you click your button.

like image 40
Nicolas Dai Avatar answered Nov 07 '22 00:11

Nicolas Dai


I know this thread is old but if anyone else is having an issue calling panels when they are inactive you can prefab your panel and use the NGUITools.AddChild to call your panel. It would look something like this.

public GameObject parent;
public GameObject child;

void Spawn () {

NGUITools.AddChild (parent, child);

}

Assign your UIRoot to parent (or whatever you want to add the panel to), and assign your panel to child in the editor and you're all set! I hope this helps someone out, this is a common problem when first working with NGUI.

Happy Coding :)

like image 1
Steve Griffin Avatar answered Nov 06 '22 23:11

Steve Griffin