- Home /
If /else statement can be used like this?
Hi everybody,
I'm trying to switch from a grid to a circle representation of a GameObject (prefab), but I cannot get the transition correctly, here is the code:
it should instantiates a prefab in a grid
var prefab : GameObject;
var gridX = 5;
var gridY = 4;
var spacing = 2.0;
var numberOfObjects : int = 20;
var radius = 2;
var IsGrid : boolean = true;
function Start ()
{
if(Input.GetButtonDown("Fire1"))
IsGrid = !IsGrid;
if(IsGrid == false)
{
for(var i = 0; i<numberOfObjects;i++){
var angle = i * Mathf.PI * 2 / numberOfObjects;
var pos = Vector3 (Mathf.Cos(angle),0,Mathf.Sin(angle))*radius;
Instantiate(prefab,pos,Quaternion.identity);
}
}
else
{
for (var y = 0; y < gridY; y++) {
for (var x = 0; x < gridX; x++) {
var pos2 = Vector3 (x, 0, y) * spacing;
Instantiate(prefab, pos, Quaternion.identity);
}
}
}
}
and pressing "Fire1" key, should change to the circle, does it make sense? how can i do it?
thanks in advance for anyhelp...
Answer by syclamoth · May 10, 2012 at 02:22 PM
The 'Start' function only gets called once- in the first frame that the object exists. So, it only checks the fire button once- when it is first created. If you want a transition, you will need to do a few things.
1: Keep track of the currently existing objects. If you don't know what you've already created, you won't be able to delete them before creating the other pattern!
Simplest way to do this is to use one of the features of transform parenting. In your instantiation code, do this:
var newObj : GameObject = Instantiate(prefab, pos, Quaternion.identity);
newObj.transform.parent = transform;
This will make all the new object children of the controller.
Then, when you switch patterns, do this:
for(var trans : Transform in transform)
{
Destroy(trans.gameObject);
}
This will automatically delete all the children of the controller's transform!
Then, refactor it a bit. Put everything between about 'if(!isGrid)' and the end of the bit that spawns the grid into a new function:
function ToggleGrid()
{
// put it here!
}
Then to activate it, do this:
function Update()
{
if(Input.GetButtonDown("Fire1"))
{
IsGrid = !IsGrid;
ToggleGrid();
}
}
Remember to delete the previous pattern before instantiating the new one.
hey, thanks a lot, I'm very newbie scripting and don't know if i understood you very well, so let me paste the code again to get the chance of feedback, ok?
var prefab : GameObject;
var gridX = 5;
var gridY = 4;
var spacing = 2.0;
var numberOfObjects : int = 20;
var radius = 2;
var IsGrid : boolean = true;
var newObj : GameObject = Instantiate(prefab, pos, Quaternion.identity);
newObj.transform.parent = transform;
function Start ()
{
if(Input.GetButtonDown("Fire1"))
IsGrid = !IsGrid;
for(var trans : Transform in transform)
{
Destroy(trans.gameObject);
}
function ToggleGrid ()
{
if(IsGrid == false)
{
for(var i = 0; i<numberOfObjects;i++){
var angle = i * $$anonymous$$athf.PI * 2 / numberOfObjects;
var pos = Vector3 ($$anonymous$$athf.Cos(angle),0,$$anonymous$$athf.Sin(angle))*radius;
Instantiate(prefab,pos,Quaternion.identity);
}
}
else
{
for (var y = 0; y < gridY; y++) {
for (var x = 0; x < gridX; x++) {
var pos2 = Vector3 (x, 0, y) * spacing;
Instantiate(prefab, pos, Quaternion.identity);
}
}
}
}
}
function Update()
{
if(Input.GetButtonDown("Fire1"))
{
IsGrid = !IsGrid;
ToggleGrid();
}
}
bytheway i got this error: expecting (, found 'ToggleGrid'
thanks again,
You declared the function 'ToggleGrid' inside another function!!! You can't possibly expect that to work. You need to understand how functions work in c-like languages: in this case, anything inside the 'Start' function (the bits between the curly braces) will only run when the object gets created. You should remove that entirely, since it's only causing problems for you. You should add the bit for removing the existing grid into the beginning of the 'ToggleGrid' function- don't put it in Start, either.