- 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
 
             