在 Unity 中调用繁重函数时避免游戏冻结的最简单方法是什么?



我目前正在开发一个元井字游戏AI,以便在Unity中与之对抗。我想在玩家移动时实例化粒子。但是,当调用AI的移动评估函数时,粒子会冻结。在计算机计算最佳移动时,使粒子继续移动的最简单方法是什么?我已经阅读了有关 unity 作业系统的文档,但作业结构不能包含引用类型,这是一个问题。

public void Play (List<Move> moves) {
int[,] grid = gB.stateGrid;
Move bestMove = new Move();
if (firstTurn)
{
bestMove.col = 4;
bestMove.row = 4;
firstTurn = false;
}
else
{
foreach (Move m in moves)
{
int e = EvalMove(m, level, true, grid, gB.subgridsStates, Mathf.NegativeInfinity, Mathf.Infinity);
m.value = e;
}
int best = moves.Select(x => x.value).Max();
List<Move> bestMoves = moves.Where(x => x.value == best).ToList();
bestMove = bestMoves[Random.Range(0, bestMoves.Count - 1)];
}
gB.PlaceToken(bestMove);
}

该函数计算所有可能的移动中的 bestMove,然后要求游戏板脚本将相应的令牌放在网格上。

您可以使用Coroutine来完成繁重的任务并避免冻结。

将方法返回类型更改为IEnumerator

IEnumerator Heavy() 
{
// some real heavy task
for (int i = 1; i < 10000000; i++) 
{
balh();
yield return new WaitForEndOfFrame();
}
}

简单地这样称呼它:

StartCoroutine(Heavy());

你只需要在MonoBehaviour上运行它。 就是这样。

最新更新