En este momento estás viendo La función Unity WaitForSeconds no funciona correctamente [closed]

 – Unity

La función Unity WaitForSeconds no funciona correctamente [closed] – Unity

La función Unity WaitForSeconds no funciona correctamente [closed]

– UnityAssets3Free

bienvenido , me llamo Juan y en esta ocasion os traigo
esta pregunta

Cerrado. Esta pregunta necesita detalles de depuración. Actualmente no está aceptando respuestas.

Edite la pregunta para incluir el comportamiento deseado, un problema o error específico y el código más corto necesario para reproducir el problema. Esto ayudará a otros a responder la pregunta.

Cerrado el año pasado.

mejorar esta pregunta

Estoy tratando de implementarlo para que puedas disparar 2 veces por segundo. Estoy haciendo esto disparando y retrasando el guión de control de armas durante 0,5 segundos, pero no funciona. Estoy tratando de usar la función WaitForSeconds.

Con suerte, cuando hago clic, se produce un disparo de inmediato, y durante los siguientes 0,5 segundos, el clic no tendrá ningún efecto mientras el resto del juego continúa normalmente, y después de ese tiempo, al hacer clic una vez se disparará nuevamente, causando otro retraso y así sucesivamente.

En cambio, puedo disparar una y otra vez sin que nada se interponga en el camino.

Aquí está mi guión:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunController : MonoBehaviour

    public Transform firePoint;
    public GameObject bulletPrefab;
    public string gunType;

    private void Update()
    
        if (Input.GetMouseButtonDown(0))
        
            switch (gunType)
            
                case "pistol":
                    StartCoroutine(ShootThenDelay(0.5f));
                    break;
            
        
    


    IEnumerator ShootThenDelay(float seconds)
    
        Shoot();
        yield return new WaitForSeconds(seconds);
    

    void Shoot()
    
        GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);

    


2 respuestas 2

Un Coroutine no retrasa el método que lo está iniciando (con una excepción, ver más abajo). De lo contrario, toda su aplicación se congelaría.

Podría simplemente agregar una bandera como por ejemplo

bool canShoot = true;

IEnumerator ShootThenDelay(float seconds)

    canShoot = false;
    Shoot();
    yield return new WaitForSeconds(seconds);
    canShoot = true;

y luego verifique

if (canShoot && Input.GetMouseButtonDown(0))

Alternativamente, en su caso, puede esperar directamente hasta que la rutina termine usando

// Yes! If you make Start return IEnumerator then Unity 
// automatically runs it as a Coroutine
private IEnumerator Start()

    // Looks dangerous but is totally fine for a Coroutine as long as you yield inside
    while(true)
    
        if (Input.GetMouseButtonDown(0))
        
            switch (gunType)
            
                case "pistol":
                    // "Runs" the shoot routine and waits until it finished
                    // This way a yield at the end actually has an effect
                    yield return ShootThenDelay(0.5f));
                    break;

                default:
                    // Note: This is very important! Make sure all paths within the while yield at least for one frame!
                    yield return null;
                    break;
            
        
        else
        
            // Note: This is very important! Make sure all paths within the while yield at least for one frame!
            yield return null;
        
    


IEnumerator ShootThenDelay(float seconds)

    Shoot();
    yield return new WaitForSeconds(seconds);

Esto se debe a que después de esperar 0,5 segundos, la corrutina regresa al punto del código donde se interrumpió la ejecución, en su ejemplo, regresa a la línea que viene después:
yield return new WaitForSeconds(seconds);
Sin embargo, no hay nada, así que no pasa nada. Si haces algo como esto:

IEnumerator ShootThenDelay(float seconds)

    Shoot();
    yield return new WaitForSeconds(seconds);
    Shoot();

la bala debe dispararse dos veces con un retraso de 0,5 segundos. Te recomiendo que consultes la documentación la próxima vez 🙂

https://docs.unity3d.com/ScriptReference/WaitForSeconds.html

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

eso es todo,espero que te funcione

Deja una respuesta