How to make my coroutine work? this has an error of nullreferenceexception
Hello im new to unity and c#. i want to create a login user so i have 3 classes: user class, event class where it takes the input (name, password) and ServerCalls class. This is my serverCalls class namespace SeriousGame.ServerCalls {
public class StaticCoroutine :MonoBehaviour {
static public StaticCoroutine instance;
static public void DoCoroutine(WWWForm formitsa){
instance.StartCoroutine (serverRequest(formitsa)); // here is the problem
Debug.Log ("play until here?");
Debug.Log (formitsa);
Debug.Log ("play until here too?");
}
public static bool userLogin (string username, string password){
Debug.Log("Creating WebForm");
WWWForm Myform = new WWWForm();
Myform.AddField("action", "userdata");
Myform.AddField("input", "u:"+username+",p:"+password);
Myform.AddField("debug", "true");
Debug.Log (Myform);
DoCoroutine (Myform);
Debug.Log ("play here?");
// StartCoroutine( serverRequest (Myform));
//instance.StartCoroutine(serverRequest (Myform));
//Debug.Log(jsonString);
return true;
}
public static IEnumerator serverRequest (WWWForm Forma) {
Debug.Log("Preparing Request");
string TestUrl = "http://seriousgame.andreaslyras.gr/dbtables/cmd.php";
Debug.Log("Creating Post Data");
WWW w = new WWW(TestUrl, Forma);
while (!w.isDone) {
Debug.Log ("Looparw");
}
Debug.Log("Making the Post");
yield return w.text;
if (!string.IsNullOrEmpty(w.error)) {
Debug.Log(w.error);
}
else {
string msgFromTheOtherSide = "The answer from the other side is: \n" + w.text;
Debug.Log ( msgFromTheOtherSide);
//Actions.jsonString=w.text;
}
}
}
I know that coroutines cant be in a static thats why i did this, but still isnt working. can anyone help me out?
Answer by HenryStrattonFW · Nov 09, 2015 at 01:59 PM
The problem is that you are accessing a variable "instance" but you have never set that variable to be anything. Although your instance knows what type it should be, this is not enough for it to be able to use it.
Make sure you attach this script to an object in your scene, then add an Awake() method like this.
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject); // Optional but usefull in some cases if you only want one of these and are moving between scenes.
}
}
Then you should be able to access instance after the Awake method has called.