error CS0120: An object reference is required to access non-static member `TextManagerLvl1.currentState'
I am trying to access another variable from another script by the following code, and I get the above error message
My Continue script
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class Continue : MonoBehaviour
{
string SceneName;
AudioClip Click;
Animation ButtonTrueAnimation;
Animation ButtonFalseAnimation;
Animation ButtonContinueAnimation;
private enum States
{
question, trueState, falseState, continueState
};
private States myState;
void Start ()
{
myState = States.question;
}
void Play ()
{
if(TextManagerLvl1.currentState == "trueState")
{
TrueState();
}
else if(TextManagerLvl1.currentState == "falseState")
{
FalseState();
}
else if(TextManagerLvl1.currentState == "continueState")
{
ContinueState();
}
}
I am trying to access the variable "currentState" from the 'TextManagerLvl1" script.
My TextManagerLvl1 script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TextManagerLvl1 : MonoBehaviour
{
public Text MainText;
public Button ButtonTrue;
public Button ButtonFalse;
public GameObject ButtonContinue;
public GameObject ButtonT;
public GameObject ButtonF;
public bool Correct;
public bool False;
public string currentState;
private enum States
{
question, trueState, falseState, continueState
};
void trueState()
{
MainText.text = "You are correct! :)";
currentState = "trueState";
Deactivate ();
}
void falseState()
{
MainText.text = "You are wrong! :(";
currentState = "falseState";
Deactivate ();
}
void Deactivate()
{
ButtonContinue.SetActive (true);
myState = States.continueState;
currentState = "continueState";
ButtonT.SetActive (false);
ButtonF.SetActive (false);
}
}
Any help is greatly appreciated!
Answer by Commoble · Mar 10, 2017 at 03:33 AM
A static member of a class (declared, for example, public static float staticFloat;
) is a variable or a function that belongs to that class type itself, rather than individual instances of the class. For example, if you declare a static variable in a class, and then make five instances of that class, then there will only be one copy of that variable, rather then five copies. Static members are frequently used for global variables and utility functions, and you can access a static member via NameOfClass.nameOfStaticMember
. You can access a public static member from anywhere, even if you don't have a reference to an instance of the class handy.
Now, what you've done above is you're trying to access TextManagerLvl1.currentState
statically, since TextManagerLvl1 is a class type rather than an instance of a class. However, currentState is not a static member of that class, meaning that you'd have to instantiate an instance of TextManagerLvl1 and then use that instance's currentState variable.
Given your above code, I suggest getting a reference to your TextManagerLvl1 script in your other script and accessing the currentState field that way:
public TextManagerLvl1 textManagerScript;
// . . . later
void Play()
{
if (textManagerScript.currentState == "trueState")
{
TrueState();
}
// etc
}