- Home /
Code stops working when I put it inside a method, what am I messing up?
Hello! I'm trying to put some code into methods to simplify/optimize my code. The game I'm making is a falling-sand type game and right now the script for each particle goes through the entire grid looking for that type of material and executing its code whenever it shows up. I'm trying to make it so that it only scans the grid one time, and runs the appropriate material's script at each location. Up until now all of my methods have been working, but when I try to do it inside a For Loop, it stops working. Effectively what I'm doing is taking this, which works:
private void ParticleBehavior()
{
for (int x = 0; x < gridXY.x; x++)
{
for (int y = 0; y < gridXY.y; y++)
{
if (tilemapCurrent.GetTile(new Vector3Int(x, y - 1, 0)) == null && tilemapNext.GetTile(new Vector3Int(x, y - 1, 0)) == null)
{ //if tile below is empty, move there
tilemapNext.SetTile(new Vector3Int(x, y - 1, 0), sand);
}
//For simplicity sake I removed a couple dozens of lines of code here because they're not pertinent to the question
}
}
}
and turning it into this, which doesn't:
private void ParticleBehavior()
{
for (int x = 0; x < gridXY.x; x++)
{
for (int y = 0; y < gridXY.y; y++)
{
SandBehavior();
//If this worked this is also where I'd put every other particle behavior method
}
}
}
private void SandBehavior()
{
if (tilemapCurrent.GetTile(new Vector3Int(x, y - 1, 0)) == null && tilemapNext.GetTile(new Vector3Int(x, y - 1, 0)) == null)
{ //if tile below is empty, move there
tilemapNext.SetTile(new Vector3Int(x, y - 1, 0), sand);
}
//For simplicity sake I removed a couple dozens of lines of code here because they're not pertinent to the question
}
Thank you!
Maybe you should pass x
and y
to SandBehaviour()
?
For example :
for (int y = 0; y < gridXY.y; y++)
{
SandBehavior(x, y);
//If this worked this is also where I'd put every other particle behavior method
}
Exactly, what the problem here is that @Burkelbear 's calling the SandBehaviour function inside a couple of loops, so the variables 'x' and 'y' do no exist outside the for loops, the solution is what you said, although if i may add, the parameters need to be defined with the function too. The corrected code will be:-
private void ParticleBehavior()
{
for (int x = 0; x < gridXY.x; x++)
{
for (int y = 0; y < gridXY.y; y++)
{
SandBehavior(x, y);
//If this worked this is also where I'd put every other particle behavior method
}
}
}
private void SandBehavior(int x, int y)
{
if (tilemapCurrent.GetTile(new Vector3Int(x, y - 1, 0)) == null && tilemapNext.GetTile(new Vector3Int(x, y - 1, 0)) == null)
{ //if tile below is empty, move there
tilemapNext.SetTile(new Vector3Int(x, y - 1, 0), sand);
}
//For simplicity sake I removed a couple dozens of lines of code here because they're not pertinent to the question
}
Your answer
Follow this Question
Related Questions
Character Select script issues 1 Answer
OnTriggerEnter2D(Collider2D other) 2 Answers
Platform Collider Not Working When Enemy Collides With It 1 Answer
Teleporter 1 Answer
Multi-touch in a unity 2D game 1 Answer