Какой самый простой способ избежать зависания игры при вызове тяжелых функций в единстве? - PullRequest
0 голосов
/ 28 сентября 2019

В настоящее время я разрабатываю мета-тактический ИИ для игры в 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 среди всех возможных ходов, а затем запрашивает игровое поле.скрипт для размещения соответствующего токена на сетке.

1 Ответ

0 голосов
/ 29 сентября 2019

Вы можете использовать Coroutine, чтобы выполнить тяжелую задачу и избежать зависания.

Измените тип возвращаемого вами метода на IEnumerator

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

И простоНазовите это так:

StartCoroutine(Heavy());

Вам просто нужно запустить его на MonoBehaviour.это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...