- Home /
Stopping a Coroutine and drawing OnGUI
Hello, below is a code that I have for logging into a database. Everything works really well however I'm trying to get a pop up window to show to the user. Unfortunately, even though I have done pop up windows before, I'm a bit stuck. I can't seem to get it to show anything. The window simply won't show. That being said, I've tried doing this without canceling the coroutine and with canceling the coroutine all giving the same result. I also seem to be getting an error that states all GUI function calls must be in the OnGUI function. Which is weird because usually to make a pop up window you have to draw all the GUI components in a separate function from the OnGUI so I don't know why I'm getting all the errors. Any help would be greatly appreciated.
using UnityEngine;
using System.Collections;
public class Login : MonoBehaviour {
public Texture LoginBackground;
public Texture2D stylebackground;
public GUIStyle LoginStyle;
public GUIStyle LoginTextBox;
public GUIStyle LoginButton;
public string Username;
public string Password;
public float transparent;
private string url;
public WWW w;
public WWWForm loginform;
public bool doWindow0 = false;
public string formText;
// Use this for initialization
void Start () {
LoginStyle.fontSize = 72;
LoginStyle.alignment = TextAnchor.MiddleCenter;
LoginTextBox.fontSize = 20;
LoginTextBox.alignment = TextAnchor.MiddleCenter;
LoginTextBox.normal.background = stylebackground;
LoginButton.fontSize = 30;
LoginButton.alignment = TextAnchor.MiddleCenter;
loginform = new WWWForm();
}
// Update is called once per frame
void Update () {
doWindow0 = false;
}
void OnGUI() {
GUI.backgroundColor = Color.black;
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),LoginBackground,ScaleMode.StretchToFill, false, 0.0f);
GUI.Label(new Rect(Screen.width/2-250,Screen.height/2-250,500,250),"Username:", LoginStyle);
Username = GUI.TextField(new Rect(Screen.width/2-250,Screen.height/2-80,500,50), Username, 10, LoginTextBox);
GUI.Label(new Rect(Screen.width/2-250,Screen.height/2-50,500,250),"Password:", LoginStyle);
Password = GUI.TextField(new Rect(Screen.width/2-250,Screen.height/2+120,500,50), Password, 10, LoginTextBox);
if (GUI.Button(new Rect(Screen.width/2-150,Screen.height/2+200,300,50),"Login:", LoginButton))
{
//CheckLogin();
StartCoroutine(CheckLogin());
}
if (doWindow0 == true)
{
GUI.Window (0, new Rect (Screen.width/2-240,Screen.height/2-100,800,120), DoMyWindow, "Notice:");
}
}
void DoMyWindow (int windowID) {
GUI.Label(new Rect (10, 20, 800, 40), formText);
if (formText == "Login success. Click the close button to continue to the character selection screen.")
{
if (GUI.Button (new Rect (10,80,100,20), "Close"))
doWindow0 = false;
Application.LoadLevel("CharacterSelect");
}
else
{
if (GUI.Button (new Rect (10,80,100,20), "Close"))
{
doWindow0 = false;
}
}
}
IEnumerator CheckLogin()
{
url = "http://redlightlife.tk/scripts/checklogin.php?username=" + WWW.EscapeURL(Username) + "&password=" + WWW.EscapeURL(Password);
w = new WWW(url);
yield return w;
Debug.Log("Downloaded");
if (w.error != null)
{
print(w.error);
}
if (w.error == null)
{
formText = w.text;
w.Dispose();
print(formText);
doWindow0 = true;
print(doWindow0);
StopAllCoroutines();
}
}
}
What lines specifically are getting the errors?
I've recently struggled with all parts of this problem- coroutines can't call GUI functions, even if the GUI is in the main thread.
I have no idea it tells me ArgumentException. And I don't actually call the GUI function from within the coroutine.
Does the exception not have a line number?
Also, I think doWindow0 should be made static. I'm not sure that the flag being set by the coroutine is actually changing in the original thread
Well the exception seems to have disappeared now. What do you mean by static?
Static variables exist only once in a class. So even if you make multiple copies of the class, there would only be one "doWindow0" flag. I'm not sure that's an issue in this case, because I don't know how CoRoutines are implemetned.
In a worst case scenario, CoRoutine would be setting the doWindow0 flag to true in one thread, but the doWindow0 flag in the main thread wouldn't be changed. To avoid this, you would make that public static bool doWindow0.
However, as of now, that's not the problem in your code(see my answer ;) )
Answer by perchik · Jul 25, 2012 at 05:36 PM
I got it.
You set doWindow0 to false on update. So regardless of whether it gets set to true, every frame it's set back to false--thus never displaying your window.
Also, by any chance do you know how to align text in the window?
I also now have another problem, I can't seem to get my button to take me to a different scene.
oid Do$$anonymous$$yWindow (int windowID) { GUI.Label(new Rect (10, 20, 800, 40), formText); if (formText == "Login success. Click the close button to continue to the character selection screen.") { if (GUI.Button (new Rect (10,80,100,20), "Close")) { Application.LoadLevel("CharacterSelect"); doWindow0 = false; } } else { if (GUI.Button (new Rect (10,80,100,20), "Close")) { doWindow0 = false; } } }
Your answer
Follow this Question
Related Questions
(C#) coroutines keep blocking GUI :? 0 Answers
Distribute terrain in zones 3 Answers
Terminal-like GUI, wait for input 1 Answer
Why isn't my simple coroutine working? (and how can I make it infinite?) 2 Answers
Multiple Cars not working 1 Answer