Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by kmccmk9 · Jul 25, 2012 at 05:21 PM · c#guicoroutine

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();
  }
  }
 }
Comment
Add comment · Show 5
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image perchik · Jul 25, 2012 at 05:25 PM 0
Share

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.

avatar image kmccmk9 · Jul 25, 2012 at 05:30 PM 0
Share

I have no idea it tells me ArgumentException. And I don't actually call the GUI function from within the coroutine.

avatar image perchik · Jul 25, 2012 at 05:31 PM 0
Share

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

avatar image kmccmk9 · Jul 25, 2012 at 05:33 PM 0
Share

Well the exception seems to have disappeared now. What do you mean by static?

avatar image perchik · Jul 25, 2012 at 05:39 PM 0
Share

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

1 Reply

· Add your reply
  • Sort: 
avatar image
1
Best 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.

Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image kmccmk9 · Jul 25, 2012 at 05:40 PM 0
Share

Yes that works thank you so much!

avatar image kmccmk9 · Jul 25, 2012 at 05:42 PM 0
Share

Also, by any chance do you know how to align text in the window?

avatar image kmccmk9 · Jul 25, 2012 at 05:45 PM 0
Share

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

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

6 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image

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


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges