Давай разберемся. Сразу скажу, готовой логики нет, придется все самому прописывать.
Чтобы мобы патрулировали
Назначаешь боту состояние FreeHunt.
botAiState = BotAiState.FreeHunt. В этом случае он будет находить случайную точку в определённом радиусе и идти к ней.
Метод в строке 232: CreateWayPointObj(3, new Vector3(Random.Range(50, -50), transform.position.y, Random.Range(50, -50)));
Создает обьект wayPointObj. В этом обьекте есть скрипт, который проверяет, занято его место или нет. Если занято, удаляет сам себя.
Далее в логике void LogicFreeHunt() бот смотрит, if (wayPointObj != null) то создает путь и переходит в состояние движения.
Если обьекта wayPointObj нету, то снова пытается создать такой обьект в случайной точке.
не натыкались на стены
Это прописано в скрипте движения и здесь тебе придется переписать все под свои условия, так как у меня специфический вариант перемещения ботов.
Тебе важно знать что данный скрипт передает в нужный момент направление движения botMove.aiDirection = new Vector3(0f, 0f, 0.1f);
А уже как ты будешь реализовывать само перемещение и анимацию, это дело частное.
и видя игрока атаковали включая скрипт на оружии и анимацию
Здесь, бот оценивает расстояние до противника и идёт либо вперед, либо в случайном направлении (стрейфит). Взгляд так же определяется из этого скрипта в методе void LogicFight().
botBodyState.bodyTarget = enemyTargetObj.transform.position + Vector3.up;//назначаем башне точку, куда необходимо смотреть (вращаться)
А наведение оружия на цель и стрельба реализованы в других скриптах. Т.е. оружие наводится всегда туда, куда смотрит голова бота. А выстрел происходит когда оружие наведено на цель. За счет различных скоростей вращения бота, головы и оружия получается грамотный эффект наведения на цель, не точные выстрелы, задержка в реагировании на нового врага и т.п.
а если игрок убегает снова патрулировали
public float timeFight;//Счетчик времени, которое бот находится в бою. Каждый раз, когда бот обнаруживает врага, этот счетчик становится равен timeDangers, и уменьшается в процессе. Когда становится равен 0, бот выходит из состояния боя.
public float timeDangers = 1000;//Время, которое бот будет в состоянии боя после потери контакта с врагом