Unity Spain

Mesa de ayuda => Unity3D => Scripting => Mensaje iniciado por: MetalGore en Febrero 28, 2019, 07:03:24 PM

Título: Necesito ayuda con la función Random
Publicado por: MetalGore en Febrero 28, 2019, 07:03:24 PM
Hola a todos, para empezar aviso que soy muy novato en el Unity. Bueno mi problema es el siguiente, he seguido un tutorial por internet para hacer mi primer juego con Unity y lo he concluido con éxito, pero ahora estoy intentando ir cambiando algunas cosas, algunas las he conseguido pero hay una que se me está atragantando. En el juego se crea un Enemigo cada cierto tiempo con un InvokeRepeating, se crea cada 1.75f (public float generatorTimer = 1.75f), y luego con el (InvokeRepeating("CreateEnemy", 0f, generatorTimer), va creando los enemigos. Pues bien, yo lo que quiero es que el generatorTimer sea aleatorio entre dos valores, lo he intentado con el Random.Range, pero no me funciona, me coge el primer valor aleatorio y lo sigue repitiendo, pero siempre el mismo.
 
Espero ayuda, no se si me explicado bien, pero agradecería algo de ayuda, gracias.
 
Por cierto, este es el tutorial que he seguido: 
 


   
eature=oembed" width="480">

 
 
 
 
Título: Necesito ayuda con la función Random
Publicado por: Alex en Febrero 28, 2019, 08:07:04 PM
Intenta usar el random.range en un Enumerator, así, cada vez que quieras spawnear algo, lo repites con el yield return.
Título: Necesito ayuda con la función Random
Publicado por: leocub58 en Marzo 01, 2019, 04:35:17 PM
Muestra el código del spawn que usas.
Título: Necesito ayuda con la función Random
Publicado por: MetalGore en Marzo 02, 2019, 12:33:04 PM
Gracias por responder Alex y leocub58. Alex, no entiendo muy bien lo que quieres decir, soy muy novato en Unity, lo único que se es lo poco que he aprendido con el tutorial que he seguido y muchas cosas me suenan a chino todavía, pero gracias de todos modos, investigaré un poco lo que me dices haber si consigo algo, Gracias.
 
leocub58 te paso el código, no se exactamente que significa spawn pero creo que será el script que genera los enemigos (lo siento, estoy muy verde)
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyGeneratorController : MonoBehaviour
{
    public GameObject enemyPrefab;
    public float generatorTimer = 1.75f; //Tiempo en el que se genera cada enemigo
 
    // Start is called before the first frame update
    void Start()
    {
       
    }
    // Update is called once per frame
    void Update()
    {
       
    }
    void CreateEnemy()
    {
        Instantiate(enemyPrefab, transform.position, Quaternion.identity);  
    }
    public void StartGenerator()
    {
        InvokeRepeating("CreateEnemy", 0f, generatorTimer);  
    }
    public void CancelGenerator (bool clean = false)
    {
        CancelInvoke("CreateEnemy");
        if (clean)
        {
            Object[] allEnemies = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject enemy in allEnemies)
            {
                Destroy(enemy);
            }
        }
    }
}

 
Yo lo que he intentado es en la parte de la variable de generatorTimer poner un Random.Range (1.75f, 5.75f), pero así no funciona. También he probado a poner un codigo (no me acuerdo ahora, algo que busque por la red) en el "void update" y ahí si que me funcionaba pero me salían enemigos antes de iniciar el juego, en la pantalla de título. Espero vuestra ayuda.
 
Gracias.
Título: Necesito ayuda con la función Random
Publicado por: Samusan en Marzo 15, 2019, 09:22:42 PM
InvokeRepeating solo se ejecuta una vez : 
 
Si haces esto : 
 

InvokeRepeating("CreateEnemy", 0f, Random.Range (1, 5));   

 
Solo se va a ejecutar el Random una vez. (Si el resultado es 2 se va a crear un enemigo cada 2 segundos).
 
InvokeRepeating solo te va a funcionar para ejecutar una función en un tiempo constante. Si quieres que el tiempo sea variable hay 2 formas de hacerlo : 
 
1 .- Hacer un contador : 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyGeneratorController : MonoBehaviour
{
    public GameObject enemyPrefab;

public float minTime = 1; //Tiempo minimo en el que se va a generar un enemigo
public float maxTime = 5; //Tiempo máximo en el que se va a generar un enemigo
private float generatorTime; //Tiempo en el que se genera cada enemigo
private float generatorTimer; //Contador, va a ir desde 0 hasta el valor de generatorTime
    // Start is called before the first frame update
    void Start()
    {
       spawnTime = Random.Range (minTime, maxTime);
    }
private void Update ()
{
   //Si el valor del contador es mayor que el tiempo en el que se genera cada enemigo.
   if (spawnTimer >= spawnTime){
      CreateEnemy();
      spawnTimer = 0; //Reseteamos el contador
      spawnTime = Random.Range (minTime, maxTime); // Volvemos a coger un valor aleatorio.
   }else
   {
      spawnTimer += Time.deltaTime; //Time.deltaTime vale 1 cada segundo.
   }
}
    void CreateEnemy()
    {
        Instantiate(enemyPrefab, transform.position, Quaternion.identity);  
    }
}

 
 
 
2.- Utilizar un corrutina : 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyGeneratorController : MonoBehaviour
{
    public GameObject enemyPrefab;
   
public float minTime = 1;
public float maxTime = 5;

    void CreateEnemy()
    {
        Instantiate(enemyPrefab, transform.position, Quaternion.identity);  
    }
    public void StartGenerator()
    {
        StartCoroutine (EnemyGenerator ());
    }
 
public IEnumerator EnemyGenerator () {
   while (true){
      float generatorTime = Random.Range (minTime, maxTime);
      yield return new WaitForSeconds (generatorTime);
      createEnemy();
   }
}
    public void CancelGenerator (bool clean = false)
    {
        StopAllCoroutines();
        if (clean)
        {
            Object[] allEnemies = GameObject.FindGameObjectsWithTag("Enemy");
            foreach (GameObject enemy in allEnemies)
            {
                Destroy(enemy);
            }
        }
    }
}

 
 
 
No me ha dado tiempo a probar los 2 scripts así que puede ser que falle alguna mayúscula, si tengo tiempo luego los pruebo, pero es para que te hagas una idea. Te recomiendo que busques tutoriales en youtube sobre como hacer un contador ya que es algo que se utiliza muchísimo.
 
Suerte :)
Título: Necesito ayuda con la función Random
Publicado por: MetalGore en Marzo 17, 2019, 11:40:00 AM
Muchas Gracias Samusan!!!!!, en cuanto tenga tiempo lo pruebo.
 
 
 
Lo acabo de probar y funciona!!!!!, muchas gracias, he utilizado la segunda opción (la primera no la he probado todavía, pero supongo que también funcionará) y va perfecto. Ahora intentaré entenderla para sacarle partido, y haré lo que me recomiendas de buscar más información por YouTube sobre como hacer un contador.
 
Muchas Gracias y Un saludo.