c# - probabilidad - Engendrar objeto de juego al azar?
juegos de azar y probabilidad (3)
Lo que tienes se ve bien hasta ahora. Tener una matriz pública adjunta a su mono comportamiento le permitirá arrastrar elementos prefabricados del inspector que puede usar para engendrar
En tu método ''SpawnWall ()'' solo necesitarías seleccionar un prefabricado de tu matriz
GameObject randPrefab = spawnObject[spawnObjectIndex];
Entonces usarías
GameObject newObstacle = GameObject.Instantiate(randPrefab) as GameObject;
Y haga el código de posición que desee a través de su transformación
Yo recomendaría cambiar el nombre de su matriz a algo así como ''obstaclePrefabs'' ya que ''spawnObject'' realmente no describe una lista de obstáculos para engendrar.
Mi problema es que quiero que mi generador de obstáculos, que se encuentra a una distancia establecida frente a la nave espacial del jugador, seleccione aleatoriamente entre un conjunto de prefabs de obstáculos diferentes cada vez que crea un obstáculo. He encontrado muchos hilos sobre cómo aleatorizar la posición, pero eso no es lo que estoy buscando. He visto muchas referencias a listas y etiquetas, pero parece que no puedo encontrar la forma de implementarlas correctamente. Voy a publicar mi script de generador a continuación con comentarios en los que "creo" que se supone que se realizarán cambios.
using UnityEngine;
using System.Collections;
public class RandomSpawner : MonoBehaviour
{
public GameObject[] spawnObject; //somehow change this to incorporate multiple gameobject prefabs, will an array support that?
//Would I create public variables for each prefab I want to be randomly chosen from, or would those be contained in the array above?
public float xRange = 1.0f;
public float yRange = 1.0f;
public float minSpawnTime = 1.0f;
public float maxSpawnTime = 10.0f;
void Start()
{
Invoke("SpawnWall", Random.Range(minSpawnTime,maxSpawnTime));
}
void SpawnWall()
{
float xOffset = Random.Range(-xRange, xRange);
float yOffset = Random.Range(-yRange, yRange);
int spawnObjectIndex = Random.Range(0,spawnObject.Length);
//above line will have to change to reflect whatever goes above Start, possibly below as well
Otro método para cargar GameObjects durante el tiempo de ejecución es colocar elementos en una carpeta llamada "Recursos" y luego usar la siguiente llamada:
GameObject obstacle = Resources.Load("myGameObject") as GameObject;
si el artículo está dentro de una carpeta dentro de la carpeta de Recursos, entonces simplemente llame:
GameObject obstacle = Resources.Load(@"myFolder/myGameObject") as GameObject;
Tenga en cuenta, sin embargo, que con este método, habrá un ligero retraso en el desove del elemento mientras se carga en el juego.
Use a de un generador de números aleatorios. Asigne a cada obstáculo un "caso" y en cada caso dígale qué hacer. En mi script, necesitaba una variedad de plataformas para que aparecieran al azar, pero a intervalos establecidos.
usando UnityEngine;
clase pública Generar: MonoBehaviour {public GameObject prefab1;
public GameObject prefab2;
public GameObject prefab3;
public GameObject prefab4;
public GameObject prefab5;
public GameObject prefab6;
public int platform;
// Use this for initialization
void Start()
{
InvokeRepeating("CreateObstacle", 1f, 1.5f); //generate
}
void CreateObstacle()
{
platform = Random.Range (1, 7); //radom number generator b/w 1 and 7
float randomY = Random.Range(-5f, 5f); // appear b/w -5 and 5 in y-axis
float rightScreenBound = 10; // spawn this much right of the screen
switch (platform)
{
case 1:
Instantiate(prefab1, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
case 2:
Instantiate(prefab2, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
case 3:
Instantiate(prefab3, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
case 4:
Instantiate(prefab4, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
case 5:
Instantiate(prefab5, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
case 6:
Instantiate(prefab6, new Vector3(rightScreenBound, randomY, 0), Quaternion.identity);
break;
}
}