примеры AI.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

примеры AI.

Сообщение Almost Crazy 13 ноя 2015, 21:05

Всем добрый вечер! Продолжаю потихоньку мучить вас своими вопросами на счёт реализации игры. Собираюсь добавить в игру врагов, которые будут как-либо двигаться, иногда уклоняться и стрелять в игрока. Поскольку это мой первый опыт написания игры, то и как правильно сделать более менее хороший AI я не знаю. Как уже и говорил в предыдущих темах делаю я космический шутер, где действия происходят в 2D пространстве (вид сверху), но сам проект 3D т.к. игровые объекты объемные.
Игру делаю по данному курсу https://unity3d.com/ru/learn/tutorials/ ... list=17147, но с значительными изменениями. В данном курсе корабль смотрит в одном направлении и все враги движутся сверху вниз, а у меня они появляются со всех сторон и корабль игрока следит за курсором, поэтому просто летящие враги сверху вниз для моего проекта не подходят. В интернете уже искал примеры AI схожие с тем, что нужно мне, но результаты оказались тщетны.
Пока толком и не знаю как точно враги будут себя вести. Для начала буду рад примерам, как сделать, чтобы когда вражеский корабль появился за камерой и "прилетел" в область видимости камеры, где происходят действия игры начал двигаться в определенной последовательности.
Almost Crazy
UNIт
 
Сообщения: 50
Зарегистрирован: 19 окт 2015, 22:40

Re: примеры AI.

Сообщение Almost Crazy 14 ноя 2015, 17:47

Ну хоть примеры перемещения по заданным траектория можете привести, чтобы враги как-то перемещались по сцене?
Almost Crazy
UNIт
 
Сообщения: 50
Зарегистрирован: 19 окт 2015, 22:40

Re: примеры AI.

Сообщение EagleOwle 14 ноя 2015, 21:45

Ai это сложная штука и одним скриптом здесь не обойдёшься. Даже ассеты, предложенные на сторе требуют отдельного изучения, а вы хотите готовое решение.
Мой вариант движения по пути. Тут много тебе не нужного, почистишь сам.
Вот полный скрипт, если интересно http://pastebin.com/UtNAvkjz
Основная логика поведения
Синтаксис:
Используется csharp
public enum BotAiState
{
    Guard,
    FreeHunt,
    CaptureBase,
    CaptureFactory,
    Repear,
}
 


Логика текущего действия
Синтаксис:
Используется csharp
public enum BotActionState
{
    Wait,
    FindPath,
    NoPath,
    Move,
    EndPath,
    Fight,
    Repear,
}
 


Выполняется в Update
Синтаксис:
Используется csharp
    void AiUpdate()
    {
        if (botState.botStatus == BotStatus.IsOn)//Начальное состояние бота. На старте игры. Определяется в другом классе.
        {
            CreateCharacter();
        }

        if (botState.botStatus == BotStatus.AiControl)//Возможны варианты когда игрок управляет ботом, потому добавлена эта проверка
        {
          if (botAiState == BotAiState.FreeHunt)
           {
             LogicFreeHunt();
           }

            ActionAi();
        }
    }
 


Синтаксис:
Используется csharp
 void LogicFreeHunt()
    {
        if (botActionState == BotActionState.Wait)
        {
            if (wayPointObj != null)
            {
                moveTargetObj = wayPointObj;
                CreatePath(transform.position, moveTargetObj.transform.position);
            }
            else
            {
                CreateWayPointObj(3, new Vector3(Random.Range(50, -50), transform.position.y, Random.Range(50, -50)));
            }
        }

        if (botActionState == BotActionState.EndPath)
        {
            if (moveTargetObj != null)
            {
                Destroy(moveTargetObj);
                botActionState = BotActionState.Wait;
            }
        }
    }
 


Синтаксис:
Используется csharp
    void ActionAi()
    {
        if (botActionState == BotActionState.Move)
        {
            LogicMove();
        }

        if (botActionState == BotActionState.Fight)
        {
            LogicFight();
        }

        if (botDubleActionState == BotDubleActionState.Capture)
        {
            if (botState.startCapture == true)
            {
                ProcessCapture();
            }
        }

        if (botActionState == BotActionState.Repear)
        {
            if (botState.startRepear == true)
            {
                ProcessRepear();
            }
            else
            {
                botState.botStatus = BotStatus.IsOn;
            }
        }
    }
 


Синтаксис:
Используется csharp
 void LogicMove()
    {
        if (Vector3.Distance(transform.position, currentPoint) < 1f)
        {
            //-=Если есть еще точки на пути=-//
            if (nextPoint + 1 < wayPoints.Length)
            {
                //-=Определяем следующую точку=-//
                nextPoint += 1;
                currentPoint = wayPoints[nextPoint];
            }
            else
            {
                //-=Дошли до конечной точки=-//
                botMove.aiDirection = new Vector3(0f, 0f, 0f);
                botActionState = BotActionState.EndPath;
            }
        }
        else
        {
            //-=Движемся по пути=-//
            currentPoint.y = transform.position.y;

            if (myTime == TimerEmult.timersecond)
            {
                botMove.rotateDirection = Quaternion.LookRotation(currentPoint - transform.position);
                botMove.aiDirection = new Vector3(0f, 0f, 0.1f);
            }
        }
    }
 


Синтаксис:
Используется csharp
    //-=Создаем путь=-//
    void CreatePath(Vector3 startPosition, Vector3 endPosition)
    {
        path = new NavMeshPath();
       
        if (NavMesh.CalculatePath(startPosition, endPosition, NavMesh.AllAreas, path))
        {
            GetComponent<ShowGoldenPath>().path = path;
            SetColorPath();
            GetComponent<ShowGoldenPath>().color = color;
            wayPoints = path.corners;
            nextPoint = 0;
            currentPoint = startPosition;
            botActionState = BotActionState.Move;
        }
        else
        {
            Debug.Log("NoPath");
            botActionState = BotActionState.NoPath;
        }
    }
 


Синтаксис:
Используется csharp
void CreateCharacter()
    {
        botAiState = BotAiState.CaptureBase;
        botActionState = BotActionState.Wait;
        botState.botStatus = BotStatus.AiControl;
    }
 


Синтаксис:
Используется csharp
void CreateWayPointObj(float radius, Vector3 position)
    {
        if (wayPointPrefab != null)
        {
            wayPointObj = Instantiate(wayPointPrefab, new Vector3(position.x, position.y + radius, position.z), transform.rotation) as GameObject;
            wayPointObj.transform.localScale = new Vector3(radius, radius, radius);
            wayPointObj.name = "WayPointObj";
        }
        else
        {
            Debug.Log("No prefab wayPointPrefab");
        }
    }
 
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: примеры AI.

Сообщение EagleOwle 14 ноя 2015, 21:52

Нав мешь агент нужен ;)
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: примеры AI.

Сообщение Almost Crazy 14 ноя 2015, 21:58

Благодарю за информацию. Буду разбираться)
Almost Crazy
UNIт
 
Сообщения: 50
Зарегистрирован: 19 окт 2015, 22:40


Вернуться в Почемучка

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

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