在Unity3D游戏引擎中,如何延迟?

时间:2015-10-10 17:58:49

标签: unity3d unity5

这只与游戏引擎Unity3D有关。

所以,假设我有一行代码,然后是另一行代码。我如何在这两行代码之间做出延迟。重复一下,我也是为Unity3D做的。

我到处寻找,但没有任何作用。

2 个答案:

答案 0 :(得分:3)

作为一个 基于框架的 游戏引擎,Unity当然显然具有内置的所有可以想象的计时器和运行循环控制。

制作计时器绝对是微不足道的......

   Debug.Log("Race begins!");
   // 3 seconds later, make the crowd cheer
   Invoke("CrowdCheers", 3f);
   // 7 seconds later, show fireworks
   Invoke("Fireworks", 3f);

   private void CrowdCheers()
    {
    crowd.Play();
    }

   private void Fireworks()
    {
    fireworks.SetActive(true);
    }

如果您对编码更先进,可以使用" coroutines"。协同程序是一种访问运行循环的简单方法。例子:

using UnityEngine;
using System.Collections;

public class demo : MonoBehaviour {
    // Details at: http://docs.unity3d.com/Manual/Coroutines.html

    // Use this for initialization
    void Start () {
        // Some start up code here...
        Debug.Log("Co-1");
        StartCoroutine("OtherThing");
        Debug.Log("Co-2");
    }

    IEnumerator OtherThing()
    {
        Debug.Log("Co-3");
        yield return new WaitForSeconds(0f);
        Debug.Log("Co-4");
        DoOneThing();
        yield return new WaitForSeconds(1f);
        Debug.Log("Co-5");
        DoOtherThing();
    }

    void DoOneThing()
    {
        Debug.Log("Co-6");
    }

    void DoOtherThing()
    {
        Debug.Log("Co-7");
    }
}

答案 1 :(得分:-1)

  

如何在这两行代码之间做出延迟。

一般来说,你想要放在游戏中的最后一件事是线程睡眠,即使它在工作线程中也是如此。

如上所述venerik

  

我认为你应该采取另一种方法。投入一些时间研究游戏循环。然后,您可以拆分代码以执行某些操作(第一行),然后在经过一些Time.deltaTime之后执行其他操作(第二行)。 Thread.Sleep几乎总是一个非常大的禁忌

当然你可以使用yield return和Unity3D的WaitForSeconds(),但是这样的方法不能扩展并且很可能吞噬线程池,特别是如果你调用这个方法通常每帧每个对象!

我可能会问“你最初的延迟意图是什么?”

如果是每帧更新1000个游戏对象的状态,那么线程睡眠 将是明智的选择。

StackOverflow的How do I write a good answer?有这样的说法:

  

答案可能是“不要那样做”,但它也应该包括“试试这个”。

有了这个,我向你提出我的建议:

代码行之间的逻辑延迟

相反,常见的技术是延迟处理。在其中你安排什么时候开始,然后你跳过任何处理。它有助于避免您必须同时处理许多事情的情况。相反,您可以在一段时间内延长处理时间。它有助于减少处理峰值和帧速率下降。

在下面的例子中,我有1000辆汽车的游戏,所有汽车都有GPS,必须定期更新以找到到达目的地的最佳路径。而不是每帧执行这个计算(这将是低效的),我每辆车每3秒执行一次。汽车被分成10个批次,以避免在等待3秒后立即处理它们。

e.g。

class CarWithGps
{
    private DateTime _lastUpdate = DateTime.MinValue;

    public CarWithGps()
    {

    }

    public DateTime UpdateAt { get; set; }
    public TimeSpan UpdateInterval { get; set; }

    public void Update()
    {
        if (UpdateAt>DateTime.Now)
        {
            return;
        }

        // calculate new optimised GPS path
.
.
.
        UpdateAt = DateTime.Now + UpdateInterval;
    }
}

public class GpsGame : MonoBehaviour
{
    private List<CarWithGps> _cars;

    void Start()
    {
        _cars = new List<CarWithGps>();
        for (int i = 0; i < 1000; i++)
        {
            _cars.Add(new CarWithGps {UpdateAt = DateTime.Now.AddSeconds(i/10), UpdateInterval = TimeSpan.FromSeconds(3)});

        }
    }

    void Update()
    {
        // update car GPS optimal path ever few seconds
        _cars.ForEach(x => x.Update());
    }
}

游戏 Cities:Skylines 使用延迟处理来计算车辆在不妨碍帧速率的情况下到达目的地的路径。

优势

  • 没有线程睡觉
  • 不通过线程池排队作业
  • 没有用尽线程池

只是游戏主循环全速运行!