AI для мобов (врагов)

Программирование на Юнити.

AI для мобов (врагов)

Сообщение zarex 16 ноя 2015, 13:55

Пытаюсь сделать AI чуть более интересный чем движение по оси X по прямой. Запутался.
На Asset Store есть куча отдельных модулей для AI и не понятно как это всё вместе должно работать?
В каком порядке их надо ставить на сцену (на юнита) и настраивать?

Допустим Advanced AI Pro - классный ассет по логике юнита но нет поддержки анимаций Mechanim, только Legacy :-(
Pathfinding Pro - хорошая библиотека для подзадачи поиска пути... но как на ней сделать например чтобы моб переключал оружие по ситуации?
RAIN - бесплатная альтернатива для создания Navmesh но тоже надо что-то дописывать из коробки не работает....
Вот если бы их все три объединить и чтобы это не занимало более 50 мегабайт (для мобильных игры пишем)...

Есть у кого-то рабочий пример или инструкция? Или хотя бы алгоритм действий в каком порядке их делать?

Допустим нужно чтобы юнит имел несколько типов поведения, умел использовать оружие (на нём скрипт) и правильные анимации из Humanoid.
zarex
UNITрон
 
Сообщения: 178
Зарегистрирован: 31 июл 2015, 19:49

Re: AI для мобов (врагов)

Сообщение EagleOwle 16 ноя 2015, 14:38

EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: AI для мобов (врагов)

Сообщение zarex 16 ноя 2015, 16:36

BotAI не запускается. Допустим мы хотим сделать базовый универсальный AI для адвенчура. Чтобы мобы патрулировали, не натыкались на стены, и видя игрока атаковали включая скрипт на оружии и анимацию, а если игрок убегает снова патрулировали с остановками в некотором радиусе. Как это сделать с помощью этого BotAI? Сколько компонентов (скриптов итп) должно быть на одного юнита? А если у нас сто моделек, что каждой писать свой скрипт???
zarex
UNITрон
 
Сообщения: 178
Зарегистрирован: 31 июл 2015, 19:49

Re: AI для мобов (врагов)

Сообщение EagleOwle 16 ноя 2015, 18:05

Если ты не понимаешь, что там в скрипте написано, может лучше поковырять уроки с ютуба. Там множество простых логик АI.
А вообще в Pastebin добавил не много коментов в скрипт, может поможет.
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: AI для мобов (врагов)

Сообщение EagleOwle 16 ноя 2015, 18:35

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

Чтобы мобы патрулировали


Назначаешь боту состояние 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;//Время, которое бот будет в состоянии боя после потери контакта с врагом
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: AI для мобов (врагов)

Сообщение EagleOwle 16 ноя 2015, 18:46

Вот скрипт движения бота, может поможет
http://pastebin.com/MY23n8qG
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: AI для мобов (врагов)

Сообщение zarex 17 ноя 2015, 09:35

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SimpleSolderAI : MonoBehaviour {

// simple solder AI (based on enemy AI simple)

// простой AI без behaviour и без сложного ориентирования в пространстве (без Pathfinding)
// 1. монстр стоит на месте
// 2. монстр видит игрока если он подошел к нему на определенную дистанцию и бежит на игрока с некоторой скоростью
// 3. при приближении к игроку (или игрока) монстр активирует скрипт на оружии или кастует атаку или скилл из префаба (играет анимацию, делает некое действие, диалог итд но всё это в отдельном скрипте на объект оружия)
       
        public Animator anim;
       
        public GameObject weaponObject;
       
    //дистанция от которой он начинает видеть игрока
    public float seeDistance = 20f;
    //дистанция до атаки
    public float attackDistance = 2f;
    //скорость енеми
    public float speed = 4;
       
        public float speedwhileattack = 1;
   
        //игрок
       
        public string EnemyTag="Player";
    private Transform target;
   
    void Start ()
    {      
        target = GameObject.FindWithTag(EnemyTag).transform;
    }
   
    void Update ()
    {
        if (Vector3.Distance (transform.position, target.transform.position) < seeDistance) {
            if (Vector3.Distance (transform.position, target.transform.position) > attackDistance) {
                    //walk
                                        anim.Play("Basic_Walk_01");
                    transform.LookAt (target.transform);
                    transform.Translate (new Vector3 (0, 0, speed * Time.deltaTime));
                                       
            } else {
                                // attack
                                anim.Play("Pistol");
                                transform.LookAt (target.transform);
                                transform.Translate (new Vector3 (0, 0, speedwhileattack * Time.deltaTime));
                               
                                // weapon activate
                                // тут название скрипта на оружии
                                weaponObject.GetComponent<Done_WeaponController>().enabled = true;
                        }
        } else {
                       
                        // weapon deactivate
                        // тут название скрипта на оружии
                                weaponObject.GetComponent<Done_WeaponController>().enabled = false;
                               
            anim.Play("HumanoidIdle");
        }
    }
}
 


Спасибо за комментарии. Немного стало яснее. Написали вот такую реализацию, концепция бота в целом работает (анимации играются на Animator с ригами типа Humanoid, сами анимации скачиваются отдельно). Работает и против игрока и против друг друга и достаточно универсально.
Баги этой реализации: 1) моб видит игрока через стены насквозь а должен видеть только если видит... 2) в стейт idle нужно дописать патрулинг в радиусе X 3) моб иногда "подтягивается" к игроку если стоит вплотную и как бы отрывается от земли вверх немного взлетает
Последний раз редактировалось zarex 24 ноя 2015, 08:26, всего редактировалось 2 раз(а).
zarex
UNITрон
 
Сообщения: 178
Зарегистрирован: 31 июл 2015, 19:49

Re: AI для мобов (врагов)

Сообщение samana 17 ноя 2015, 09:40

zarex писал(а):Баги этой реализации: 1) моб видит игрока через стены насквозь а должен видеть только если видит...

Обычно это решается предварительным запуском луча (Raycast) в сторону объекта. Если луч не наткнулся ни на что, кроме объекта - значит объект "виден".
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: AI для мобов (врагов)

Сообщение mr_pixel92 13 авг 2018, 11:55

Короче:
Здесь https://github.com/Unity-Technologies/NavMeshComponents качаете архив с дополнением. Затем распаковываете и находите в папке этого "проекта" папку Assets и оттуда кидаете в Ваш проект NavMeshComponents. Затем создаёте (c#) скрипт и пишете:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //Для контроля нашего моба

public class ZombieControll : MonoBehaviour { //У меня так называется скрипт
    private NavMeshAgent agent;
    public Transform player;
    private Animation anim; //Для добавления анимации(требуется риг на модели типа Legacy, можно указать в настройках импорта)
       
        void Start () {
        agent = GetComponent<NavMeshAgent>()
        anim = GetComponent<Animation>();
        }
       
        // Update is called once per frame
        void Update () {
        anim.Play(walk) //У меня анимация Walk а у Вас может быть VasyaPupkinPoshol
        agent.SetDestination(player.position); //Задаем позицию цели(да, да, так просто)
        }
 

После этого кидаете на врага компоненты Animation, NavMeshAgent и этот скрипт. Далее создаёте пустышку, располагаете её над землёй и кидаете туда скрип NavMeshSurface из ранее скачанного дополнения и нажимаете кнопку Bake и ждём пока запечётся навигационная сетка. Можете поиграться с параметрами NavMeshAgent. Для атаки можете прописать в void Update это условие:
Синтаксис:
Используется csharp
if(Vector3.Distance(transform.position, agent.destination))
{
//Здесь прописываете анимации, урон, тайминг его нанесения и Т.Д;
}
 
mr_pixel92
UNец
 
Сообщения: 21
Зарегистрирован: 30 мар 2018, 12:31

Re: AI для мобов (врагов)

Сообщение lawsonilka 13 авг 2018, 14:25

mr_pixel92

а вы вовремя!
lawsonilka
UNIверсал
 
Сообщения: 390
Зарегистрирован: 21 окт 2014, 14:48


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11