2

这仅与游戏引擎 Unity3D 有关。

所以假设我有一行代码,然后是另一行。我将如何在这两行代码之间进行延迟。再说一遍,我也在为 Unity3D 做这个。

我到处看了,但没有任何效果。

4

2 回答 2

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);
    }

如果您更擅长编码,则可以使用“协程”。协程是访问运行循环的一种非常简单的方法。例子:

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");
    }
}
于 2015-10-10T18:21:19.953 回答
-1

我将如何在这两行代码之间进行延迟。

通常,您最不想在游戏中放置的东西是线程 sleep,即使它在工作线程中也是如此。

正如上面提到的venerik

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

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

我可能会问“你一开始延迟的意图是什么?”

如果是为了每帧更新 1000 个游戏对象的状态,那么线程休眠不是一个明智的选择。

StackOverflow 的我如何写一个好的答案?有这样的说法:

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

有了这个,我给你我的建议:

代码行之间的逻辑延迟

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

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

例如

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使用延迟处理来计算车辆的路径,以便在不影响帧速率的情况下到达目的地。

好处

  • 没有线程休眠
  • 线程池上没有作业排队
  • 没有耗尽线程池

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

于 2015-10-11T00:34:20.463 回答