我目前正在开发一个元井字游戏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
上运行它。 就是这样。