繁体   English   中英

如何在 Unity 中设置时间循环

[英]How do I set up a time loop in Unity

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

public class Spawner : MonoBehaviour
{
    public GameObject enemy;
    float defaultSpawnTime = 1f;
    float spawnTime = 1f;
    float realTime = 4f;
    
    void Start()
    {
        
    }

    void Update()
    {
        spawnTime-= Time.deltaTime;
        realTime += Time.deltaTime;
        if (spawnTime < 0 && realTime<30f && realTime>5f)
        {
            GameObject go = Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.Euler(0, 0, 0)) as GameObject;
            GameObject go1 = Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.Euler(0, 0, 0)) as GameObject;
      
            spawnTime = defaultSpawnTime;
            if (realTime > 30f)
            {
                realTime = 0f;
            }
        }
    }
}

我的游戏是二维的。 在游戏中,每 2 秒就会有一颗陨石从上方落下。 玩家在这些方面挣扎。

但由于游戏很累,我不希望陨石每30秒下5秒,所以玩家才有机会休息。

我还想创建一个时间变量并实时增加它。 我试着让流星雨发生,前提是时间在 5 到 30 之间。

如果时间大于 30,我想将它返回到 0 并循环它,但是 30 之后它继续进行。 我不知道我哪里出错了,你能帮帮我吗?

添加几个计时器后,很难像这样管理时间。 尝试使用协程,例如:

void Start(){
    StartMeteorShower(5f);
}

void StartMeteorShower(float time){
    StartCoroutine(StartMeteorShowerDelayed(time);
}

IEnumerator StartMeteorShowerDelayed(float delay){
    yield return new WaitForSeconds(delay);
    StartCoroutine(MeteorShowerCoroutine());
}

IEnumerator MeteorShowerCoroutine(){
    var startTime = Time.time;
    var delay = new WaitForSeconds(1f);

    do
    {
        SpawnMeteor();
        yield return delay;
    }
    while(Time.time - startTime < _meteorShowerDuration);

    //here you can queue next meteor shower
    StartMeteorShower(30f);
}

只需将 if 语句移到第一个 if 之外。 因为在 realtime > 30 之后,您的条件“ && realTime<30f && ”不满足

void Update()
{
    spawnTime-= Time.deltaTime;
    realTime += Time.deltaTime;
    
    if (spawnTime < 0 && realTime<30f && realTime>5f)
    {
        GameObject go = Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.Euler(0, 0, 0)) as GameObject;
        GameObject go1 = Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.Euler(0, 0, 0)) as GameObject;

        spawnTime = defaultSpawnTime;
    }

    if (realTime > 30f)
    {
        realTime = 0f;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM