Добрый день
В данной статье будут показаны основы разработки искусственного интеллекта в движке Unreal Engine. Будет показано как собирать ИИ и создавать базовые команды(включая таски, декорации и сервисы)
Сначала создается дерево поведения и доска, которая сразу связывается с древом.
И сразу, чтобы потом не переключаться между другими окнами, добавим таск. Но сразу из ROOT нельзя подключить таск, сначала идут особые функции. Так что сначала подключается Sequence, а потом добавляется таск на передвижение к точке, либо к актору.
Но в таком случае никто ничего делать не будет. Т.к. логично, что ему сначала надо привязать то, куда он будет идти. Для этого потребуется использовать доску(blackboard) и создать переменную Vector(переменная, которая хранит в себе данные трехмерного пространства, т.е. длина, ширина, высота), в которую будет записываться случайная точка.
После этого, нам же надо в эту переменную что-то записать. Поэтому воспользуемся сервисом.
Также, сервисы, таски и декорации можно создавать и вручную, т.е. выбрать требуемую папку, и при создании блупринта выбрать тип decoration, task или services соответственно.
Для начала работы сервиса, требуется две вещи: 1. Нод, который запустит процессы после запуска сервиса, этим нодом будет Event Activation AI; 2. То как мы будем записывать данные в переменную с доски. Для этого нам потребуется публичная переменная типа Blackboard key.
Но так как это другой тип переменной, мы не можем напрямую записать данные в blackboard. Для этого нам потребуется отдельный нод, который записует данные с определенным видом. Этим нодом является Set Blackboard Value as...
Теперь для передвижения нам потребуется получить текущее местоположение ИИ и найти случайную точку в определенной области.
Но при использовании анимаций, есть одна проблема. При создания случайной точки, она может быть создана очень близко с ИИ. И из-за этого он может дергаться и просто неправильно себя вести.
Расстояние между двумя точками в Unreal Engine
В Unreal Engine есть встроенная функция, которая помогает найти расстояние, но она работает не так как задумано, так что для того чтобы найти расстояние прийдется прибегнуть к математике, и немного изменить сервис.
Для начала мы создадим ещё одну переменную, в которую сохраним текущую случайную точку. Т.к. если её не сохранить, результат будет постоянно отличаться. После этого, случайную точку и текущее местоположении ИИ мы разбиваем на координаты. Нам потребуются только X и Y.
После этого используем математическую формулу нахождения расстояния между двумя точками. Ну или же sqrt((x2-x1)^2+(y2-y1)^2). После этого мы получаем расстояние между двумя точками. Однако есть один нюанс. Расстояние в Unreal Engine измеряется в юнитах, и поэтому, либо результат надо будет разделить на 100, и получатся метры, либо требуемый результат умножить на 100 (т.е. если вам нужно, чтобы точка находилась дальше 4 метров, надо в условии ставить чтобы расстояние до точки было больше 400 юнитов). В моем случае, я поставил чтобы расстояние было больше 3 метров. Иначе оно возвращается и опять пытается найти случайную точку.
Компилируем и переходим в древо поведения. Нажимаем правой кнопкой мыши на таск, выбираем "Add Services" и выбираем наш сервис.
После этого нажимаем на таск и сервис, и в поле "Blackboard key" ставим нашу переменную типа Vector.
Теперь создаем контроллер. В данный момент для него не потребуется много усилий. После создания, достаточно зайти в граф, создать нод "Run BehaviorTree" и в поле BTAsset выбрать созданное нами древо.
Теперь можно перейти к оболочке ИИ. Я сильно замарачиваться не буду, и просто создам передвигающийся куб.
P.S. При создании ИИ, создается блупринт класса Character, чтобы он мог передвигаться. Но в случае чего, можно будет делать и класс actor, или pawn.
После добавления Модели, или просто заглушки, необходимо зайти в основную часть блупринта(Class Default), найти после AIController и поставить туда созданный нами контроллер.
Но ИИ всё ещё не можете передвигаться, для этого требуется выделить возможную область, где он сможет передвигаться. Для этого воспользуемся Nav Mesh Bounds Volume. Чтобы точно видеть, какие области он задевает можно нажать английскую клавишу P.
После этого можно расположить наш ИИ в эту область, и смотреть на результат.
Благодарю за внимание.