- Home /
Scope issues when initializing variables
In the code below, I declare variables globally within the script "DealScript." I then initialize them in a Start() function. Yet, for some reason, when trying to use those variables in other functions within DealScript, Unity gives me NullReferenceException errors.
A temporary fix I found is to copy and paste those initializing statements into each function where I need the variables. Strangely enough, after running my game once, I can delete those copy and pasted statements, and the game still works! No errors.... until the next time I open Unity again.
What is going wrong here? The scope of the variables should extend to every function in DealScript.
Relevant Code:
public class DealScript : MonoBehaviour {
// References to other objects / scripts
public GameObject card;
GameObject Controller;
GameController gameController;
Vector3 posForest;
Vector3 posHand;
float forestSpacing;
float handSpacing;
// Use to initialize variables
private void Start()
{
// Necessary variables from Game Controller
Controller = GameObject.Find("Controller");
gameController = Controller.GetComponent<GameController>();
posForest = gameController.posForest;
posHand = gameController.posHand;
forestSpacing = gameController.forestSpacing;
handSpacing = gameController.handSpacing;
}
/ Code below is used to deal cards /
// Deals the initial 8 cards and the 3 cards in the player's hand
public void Deal () {
Controller = GameObject.Find("Controller");
gameController = Controller.GetComponent<GameController>();
posForest = gameController.posForest;
posHand = gameController.posHand;
forestSpacing = gameController.forestSpacing;
handSpacing = gameController.handSpacing;
// Add eight cards to forest
for (int i = 0; i < numDeal; i++)
{
MakeCard("Forest");
}
// Add three cards to hand
for (int j = 0; j < numHand; j++)
{
MakeCard("Hand");
}
// Position cards appropriately
gameController.Reposition(gameController.Hand, handSpacing, posHand);
gameController.Reposition(gameController.Forest, forestSpacing, posForest);
}
}
Answer by nomadic · Jun 18, 2018 at 07:23 PM
It's not an issue of scope. Scope is governed by the compiler. You have a runtime issue.
The full error log is likely telling you that your gameController variable is null, so you can't get references from it. How is the Controller/GameController being created?
Are you creating it inside another Start() call? If so it's likely that you are trying to reference something that hasn't been created yet. Is the Controller object inactive during the Start() call? If so GameObject.Find will fail.
Answer by ShadyProductions · Jun 18, 2018 at 07:36 PM
Seems like you are calling Deal() on another monobehaviour before Start() is initialized by this monobehaviour. Set up the correct script order execution in project settings.