- Home /
Help me understand this script please, im desperate
Hello, im programming infinite runner game and i made a script that randomly spawns tiles behind eachother and deletes tiles that are behind the player. That way my player has infinite level which he can run on. But i have tiles with certain PrefabIndexes that cannot be spawned after eachother otherwise it would be impossible to get from one to another. In my Script i wanna add something like : if lastPrefabIndex = 1,2,3 go spawn any tiles except tiles 1,2,3,4 I will be really thankfull for any help or solution.
public GameObject[] tilePrefabs;
private Transform playerTransform;
private float SpawnZ = -25.0f;
private float tileLenght = 50.0f;
private float safeZone = 55.0f;
private int amountTilesOnScreen = 9;
private int lastPrefabIndex = 0;
private List<GameObject> activeTiles;
private void Start ()
{
activeTiles = new List<GameObject>();
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
for(int i = 0; i < amountTilesOnScreen; i++)
{
if (i < 2)
SpawnTile(0);
else
SpawnTile();
}
}
// Update is called once per frame
private void Update () {
if(playerTransform.position.z - safeZone > (SpawnZ - amountTilesOnScreen* tileLenght))
{
SpawnTile();
DeleteTile();
}
}
private void SpawnTile(int prefabIndex = -1)
{
GameObject go;
if (prefabIndex == -1)
go = Instantiate(tilePrefabs[RandomPrefabIndex()]) as GameObject;
else
go = Instantiate(tilePrefabs[prefabIndex]) as GameObject;
go.transform.SetParent(transform);
go.transform.position = Vector3.forward * SpawnZ;
SpawnZ += tileLenght;
activeTiles.Add(go);
}
private void DeleteTile()
{
Destroy(activeTiles[0]);
activeTiles.RemoveAt(0);
}
private int RandomPrefabIndex()
{
if (tilePrefabs.Length <= 1)
return 0;
int randomIndex = lastPrefabIndex;
while (randomIndex == lastPrefabIndex)
{
randomIndex = Random.Range (0, tilePrefabs.Length);
}
lastPrefabIndex = randomIndex;
return randomIndex;
}
Answer by FogCZ · Jul 05, 2020 at 06:48 PM
private int RandomPrefabIndex()
{
if (tilePrefabs.Length <= 1)
return 0;
int randomIndex = lastPrefabIndex;
while (randomIndex == lastPrefabIndex)
{
randomIndex = Random.Range(0, tilePrefabs.Length);
}
while (lastPrefabIndex == 1 && randomIndex == 1 || lastPrefabIndex == 1 && randomIndex == 2 || lastPrefabIndex == 1 && randomIndex == 3 || lastPrefabIndex == 2 && randomIndex == 1 || lastPrefabIndex == 2 && randomIndex == 2 || lastPrefabIndex == 2 && randomIndex == 3 || lastPrefabIndex == 3 && randomIndex == 1 || lastPrefabIndex == 3 && randomIndex == 2 || lastPrefabIndex == 3 && randomIndex == 3 )
{
randomIndex = Random.Range(0, tilePrefabs.Length);
}
lastPrefabIndex = randomIndex;
return randomIndex;
}
Fixed my problem!
Answer by UnityedWeStand · Jul 04, 2020 at 08:28 PM
I recommend you use some property of the tile prefab to determine rules on which tiles are allowed to be spawned after a given tile. for example, you could say that the transform.position.x
of the next tile must be within 4 units of the transform.position.x
of the previous tile. Then, in your section of code where you grab a new random prefab index, you can check if the new prefab fulfills this rule; if not, the code tries again with a different random prefab index until it finds a valid new prefab.
Yes thats exactly what i want, my problem is that i dont know how to write this code :/ I dont know how to write like spawn everything from the list, except prefabs with index a,b,c
private int RandomPrefabIndex()
{
if (tilePrefabs.Length <= 1)
return 0;
bool isValidTile = false;
while (!isValidTile)
{
randomIndex = Random.Range (0, tilePrefabs.Length);
if($$anonymous$$athf.Abs(tilePrefabs[randomIndex].transform.x - tilePrefabs[lastPrefabIndex].transform.x) < 4)
{
isValidTile = true;
}
}
lastPrefabIndex = randomIndex;
return randomIndex;
}
Okay thanks for the script, so how excatly works this script different and what it lets me achieve ? Im sorry im really a beginnner and this is my first such a complex script im working with, so please be patient with me
Your answer
