[solved] This error "NullReferenceException: Object reference not set to an instance of an object" occurs only the first time?
In the inspector I have a game object attached to the function below. On that game object there is a script called behButtonDecayManager and in that code there is a function called set decay. For some reason when I click on the button which activates the function “activateBehavior” I get the following error.
NullReferenceException: Object reference not set to an instance of an object behButtonDecayManager.setDecay () (at Assets/Scripts/Decay managers/behButtonDecayManager.cs:25) buttonEvents.activateBehavior(UnityEngine.GameObjectquestionBehavior)(atAssets/Scripts/buttonEvents.cs:134)
All of the events play out just fine except for the last one. Furthermore, the error seems to only occur the first time the function call is attempted. So if the GameObject questionBehavior gets deactivated and then the function is called again, this time it will work.
public void activateBehavior(GameObject questionBehavior)
{
if (questionBehavior.activeSelf == false /*&& questionBehavior.GetComponent<activationCon>().getBeenSelected() == false*/)
{
questionBehavior.SetActive(true);
topicCounterBehavior--;
questionBehavior.transform.SetAsFirstSibling();
questionBehavior.GetComponent<behButtonDecayManager>().setDecay();
}
}
this script references the following script (the one attached to the game object)
{
public int localDecay;
private int deactivateCon = -9000;
private buttonDecayCounter theManager;
private buttonEvents topManager;
public GameObject thisButton;
public GameObject Topic;
void Start()
{
theManager = GameObject.Find("Manager").GetComponent<buttonDecayCounter>();
topManager = GameObject.Find("Manager").GetComponent<buttonEvents>();
}
public void setDecay()
{
deactivateCon = theManager.getDecayCounter() - localDecay;
Debug.Log("set decon to " + deactivateCon);
}
void Update()
{
if (deactivateCon >= theManager.getDecayCounter())
{
thisButton.SetActive(false);
topManager.topicCounterBehavior--;
topManager.deactivateTopicBehavior(Topic);
deactivateCon = -9000;
}
// Debug.Log(topManager.topicCounterBehavior);
// Debug.Log(deactivateCon);
}
}
This in turn references the following script (attached to a manager object)
private int decayCounter = 0;
public int getDecayCounter()
{
return decayCounter;
}
public void setDecayCounter(int counterEffect)
{
decayCounter += counterEffect;
}
public void deductCounter()
{
decayCounter = decayCounter - 1;
}
private buttonDecayCounter()
{
Debug.Log("created decay counter");
}
}
Any ideas?
Update: I had to move theManager from Start function to the setDecay function, because, for some reason, when I use the setDecay function from a different script, it bypasses the Start function… Don’t know why, but it kind of makes sense. It works now.
void Start()
{
topManager = GameObject.Find("Manager").GetComponent<buttonEvents>();
}
public void setDecay()
{
theManager = GameObject.Find("Manager").GetComponent<buttonDecayCounter>();
Debug.Log("set decon to " + deactivateCon);
deactivateCon = theManager.getDecayCounter() - localDecay;
}