2016-06-30 14 views
-1

Я использую движок Unity 3D для создания 2D-игры. Я хочу создать бесконечно повторяющуюся местность. Я получил это, чтобы повторить это легко, за исключением того, что иногда появляются две местности. Это случается случайным образом и без веской причины. Любая помощь?Моя бесконечно нерестилища иногда порождает один раз, а иногда икру появляется дважды. Зачем?

Это моя местность коды респауна:

using UnityEngine; 
using System.Collections; 
using PlayerPrefs = GamePlayerPrefs; 
public class SelfTerrainSpawn : MonoBehaviour { 
    // terrain references 
    public GameObject first; 
    public GameObject second; 
    public GameObject third; 
    public GameObject fourth; 
    public GameObject fifth; 
    public GameObject sixth; 
    public GameObject seventh; 
    public float spawnXPos = 0.0f; 
    public float respawnCoordinate = 30.4f; 
    public float respawnTriggerCoordinate = -21.7f; 
    public bool canSpawn = true; 
    public bool starting = true; 
    public float random; 

    void Start() { 
     this.gameObject.transform.position = new Vector2 (0.0f, 31.4f); 
     this.gameObject.transform.eulerAngles = new Vector3 (0, 0, 90.0f); 
    } 


    void Update() 
    { 
     // if the camera is farther than the number last position minus 16 terrain is spawned 
     // a lesser number may make the terrain 'pop' into the scene too early 
     // showing the player the terrain spawning which would be unwanted 
     if (this.gameObject.transform.position.y <= respawnTriggerCoordinate && canSpawn) 
     { 
      // turn off spawning until ready to spawn again 
      random = Random.Range(0,18); 
      SpawnTerrain (random); 
      canSpawn = false; 
     } 
     if (this.gameObject.transform.position.y <= respawnTriggerCoordinate - 10) { 
      Destroy (this.gameObject); 
     } 
    } 
    void SpawnTerrain(float rand) { 
     if ((rand == 0)) { 
      Instantiate (first, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 1) && (rand <= 4)) { 
      Instantiate (second, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 5) && (rand <= 8)) { 
      Instantiate (third, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 9) && (rand <= 10)) { 
      Instantiate (fourth, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 10) && (rand <= 13)) { 
      Instantiate (fifth, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 13) && (rand <= 15)) { 
      Instantiate (sixth, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
     if ((rand >= 15) && (rand <= 18)) { 
      Instantiate (seventh, new Vector3 (respawnCoordinate, spawnXPos, 0), Quaternion.Euler (0, 0, 0)); 
     } 
    } 
} 

Этот скрипт прикреплен к первой части местности, внутри игр:

Click here to see an image of the game screen

Он также прикреплен к другим двум префабы. Каждый из этих сборников также имеет скрипт, который медленно перемещает их по экрану. В принципе, когда ваш верх достигает верхней части камеры, другой должен появиться над камерой. Затем он перемещается вниз и повторяется. Смотрите, что я использовал переменную canSpawn, чтобы убедиться, что она только разражается. Однако, случайным образом, две местности будут возникать друг над другом. Может ли кто-нибудь дать мне решение этой проблемы?

ответ

2

Когда rand будет 10, 13 или 15, вы создадите две территории, потому что ваш диапазон проверяет совпадение для этих значений.

+0

Ох. Спасибо огромное! –

+1

Нет проблем. Пожалуйста, отметьте ответ как принятый, если он сработает для вас. – wablab

+0

Это не единственная проблема, которую вы разрешили, вы ДОЛЖНЫ использовать 'IF ELSEIF' не только' ЕСЛИ ЕСЛИ ЕСЛИ ЕСЛИ' ... – matiaslauriti