Способы оптимизации условно? - PullRequest
0 голосов
/ 30 мая 2018

Я делаю игру в Unity3D и в настоящее время создаю ИИ для врага.Враг должен ходить и искать игрока, не врезаясь в стены.

Враг всегда движется вперед по своей локальной оси z, пока не встретит препятствие или луч, сделанный Raycast, попадет на объект.Когда Raycast попадает на объект, являющийся частью окружающей среды, он Raycast во всех 7 направлениях по диагонали, из стороны в сторону и спереди назад, чтобы проверить наличие рядом препятствий, как показано на этом изображении.

Raycast Example

Путь, по которому он идет, определяется тем, попадают ли эти лучи в другой объект и идут ли в том направлении, в котором луч ничего не ударили это самое оптимальное направление.

По самое оптимальное Я имею в виду в следующем порядке:

  1. fl ИЛИ fr
  2. l ИЛИ r
  3. bl ИЛИ br
  4. b

На основе этих данных мне нужно решить, в каком направлении повернуть.Если в случае, когда, скажем, fl и fr оба имеют значение true, я бы случайно выбрал между двумя направлениями.

Я хочу оптимизировать этот процесс, чтобы мне не приходилось использовать несколько операторов if.Я думал об использовании методов битовой маскировки, поскольку есть 8 направлений, если вы включите вперед, и каждый бит может представлять направление.

Любые идеи, конструктивная критика и т. Д. Приветствуются.Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Не оптимизируйте преждевременно, это корень всего зла, как говорят некоторые.Это был бы идеальный пример.

Причина, по которой мы кодируем на C #, а не на ассемблере (или даже на C), заключается не в производительности, а в удобочитаемости.Хотя возможно, что ваш код будет работать немного быстрее, результаты могут быть даже не поддающимися измерению.ветвь IF здесь все еще довольно крошечная, и я бы настоятельно рекомендовал не заменять ее чем-либо еще - вы потеряете много читабельности, но при этом не достигнете большого, а если вообще вообще не улучшите, производительности.Методы битовой маски начинают становиться эффективными, когда вы имеете дело с тысячами объектов (т. Е. Сущностью), но если ваша ветвь if умещается на нескольких страницах, я бы не стал ее трогать, если бы не обнаружил, что она представляет собой серьезное сопротивление, измеряя ее впрофилировщик.Если вы не уверены в том, что делаете, не так сложно заставить ваш код работать медленнее.Приоритет состоит в том, чтобы сделать код читабельным (определенно в вашем случае, поскольку вы не будете выполнять его в тесном цикле), и легко модифицировать.В некоторых случаях лучше развернуть код в более многословную ветвь, чем упаковывать ее в какой-то причудливый цикл - помните, что цикл - это тоже инструкция.

0 голосов
/ 30 мая 2018

G, день!

В последнее время я много читал о новой системе поиска пути в Unity 2018. Мне было интересно, проверяли ли вы ее еще?

Если выхотел создать его с нуля, сумасшедший реквизит для вас - однако я бы следовал документации (на сайте Unity), чтобы создать скрипт обновления на вражеском GameObject, который бы нашел кратчайший путь к позиции трансформации игрока GameObject, убедившись, чтоприспособиться к препятствиям.

Просмотрите также на YouTube - есть куча отличных учебных пособий.

В противном случае - если вы хотите сделать это самостоятельно, то, как я лично это сделаю (что, вероятно, не будет наиболее оптимальным) будет происходить в каждом кадре, сканируя возможные пути, а затем находя самый короткий и действуя на него, перемещая противника на основе заранее определенной скорости * time.deltaTime.Отличную визуализацию системы можно найти на веб-сайте Девона Кроуфорда (ссылка ниже).

Документация Unity Ссылка: https://docs.unity3d.com/Manual/Navigation.html Веб-сайт Девона Кроуфорда: http://www.devoncrawford.io/software/pathfinding

...