这仅与游戏引擎 Unity3D 有关。
所以假设我有一行代码,然后是另一行。我将如何在这两行代码之间进行延迟。再说一遍,我也在为 Unity3D 做这个。
我到处看了,但没有任何效果。
作为一个基于帧的游戏引擎,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");
}
}
我将如何在这两行代码之间进行延迟。
通常,您最不想在游戏中放置的东西是线程 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使用延迟处理来计算车辆的路径,以便在不影响帧速率的情况下到达目的地。
只是游戏主循环全速运行!