Ich verwende Unity 3D-Engine, um ein 2D-Spiel zu erstellen. Ich möchte endlos wiederholtes Gelände schaffen. Ich habe es nahtlos wiederholt, abgesehen von der Tatsache, dass manchmal zwei Terrains gleichzeitig spawnen. Es geschieht zufällig und ohne guten Grund. Irgendeine Hilfe?Mein endlos laichendes Gelände erscheint manchmal einmal und manchmal auch zweimal. Warum?
Das ist mein Terrain Respawn Code:
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));
}
}
}
Dieses Skript mit dem ersten Geländestück angebracht ist, innerhalb des Spiels:
Click here to see an image of the game screen
Es ist auch an den beiden anderen angebracht ist, Fertighäuser. Jedes dieser Prefabs hat auch ein Skript, das sie langsam über den Bildschirm bewegt. Wenn der obere Teil den oberen Teil der Kamera erreicht, sollte ein anderer oberhalb der Kamera erscheinen. Dann bewegt es sich und wiederholt sich. Sehen Sie, dass ich die canSpawn-Variable verwendet habe, um sicherzustellen, dass sie nur einmal spawnt. Nach dem Zufallsprinzip erscheinen jedoch zwei Terrains übereinander. Kann mir jemand eine Lösung für dieses Problem geben?
Oh. Ich danke dir sehr! –
Kein Problem. Bitte markieren Sie die Antwort als akzeptiert, wenn es für Sie funktioniert hat. – wablab
Das ist nicht das einzige Problem gelöst, Sie müssen verwenden "IF ELSEIF" nicht nur "IF IF IF IF IF" ... – matiaslauriti