Advertisement
EagleOwle

BotAi

Nov 14th, 2015
1,031
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 21.83 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. //Список основных состояний бота.
  6. public enum BotAiState
  7. {
  8.     Guard,//Охрана места(не реализовано)
  9.     FreeHunt,//Бот находит случайную точку в игровом мире и движется туда
  10.     CaptureBase,//Бот стремится на захват вражеской базы
  11.     CaptureFactory,//Бот стремится на захват нейтральных и вражеских заводов
  12.     Repear,//Бот стремится к месту ремонта
  13. }
  14.  
  15. //Виды текущих (динамических) состояний
  16. public enum BotActionState
  17. {
  18.     Wait,//Ожидание
  19.     FindPath,//Поиск пути
  20.     NoPath,//Не может создать путь в выбранную точку
  21.     Move,//Движение по пути
  22.     EndPath,//Дошёл до конца пути
  23.     Fight,//В бою
  24.     Repear,//Ремонтируется
  25. }
  26.  
  27. //Это дополнительные динамические состояния для реализации выполнения нескольких действий
  28. public enum BotDubleActionState
  29. {
  30.     None,
  31.     Capture,//Захват базы или завода
  32. }
  33.  
  34. public class BotAi : MonoBehaviour
  35. {
  36.     private CaptureState captureState;//Ссылка на класс (скрипт, в котором прописана логика захвата базы или завода)
  37.     private BotMove botMove;//(скрипт, в котором прописана логика движения бота)
  38.     public BotState botState;//(скрипт, в котором прописаны ключевые состояния бота и различные параметры (здоровье, скорость и т.п.))
  39.     public BotBodyState botBodyState;//(скрипт, в котором прописана логика поворота головы, башни танка и т.п.)
  40.     public BotAiState botAiState;//
  41.     public BotActionState botActionState;
  42.     public BotDubleActionState botDubleActionState;
  43.     public GameObject wayPointPrefab;//Префаб обьекта случайной точки(в данном префабе описана логика проверки на свободное место)
  44.     public GameObject repearPlaceObj;//Обьект "Место ремонта"
  45.     public GameObject moveTargetObj;//Обьект цель для пути
  46.     public GameObject enemyTargetObj;//Обьект враг. Бот будет вести боевые действия по отношению к этому обьекту
  47.     public GameObject wayPointObj;//Обьекта случайной точки. Если место занято, там где данный обьект создан, обьект сам удаляется, а бот пытается создать такой же в другой случайной позиции
  48.    
  49.     private NavMeshPath path;//Путь созданный по NavMesh
  50.     private Vector3[] wayPoints;//массив точек на пути
  51.     private int nextPoint;//следующая точка на пути
  52.     private Vector3 currentPoint;//текущая точка на пути
  53.     public int myRandomCheckTime;//локальный контроллер времени при его соответствии с глобальным временем срабатывает поиск вражеских ботов
  54.     public int myTime;//локальный контроллер времени
  55.     private int tmpObjArray;// уже не помню, индекс данного обьекта в массиве, наверное ;)
  56.     public float timeFight;//Счетчик времени, которое бот находится в бою. Каждый раз, когда бот обнаруживает врага, этот счетчик становится  равен timeDangers, и уменьшается в процессе. Когда становится равен 0, бот выходит из состояния боя.
  57.     public float timeDangers = 1000;//Время, которое бот будет в состоянии боя после потери контакта с врагом
  58.     private Color color;//Определял цвет отрисовки пути. Вспомогательняя переменная.
  59.     private BotAiState oldAiState;//Запоминаем старое состояние, что бы вернутся к нему, когад выполение текущего состояния закончено
  60.  
  61.     void Start()
  62.     {
  63.         //TimerEmult класс счётчик времени, для отсчёта минут и секунд в игре
  64.         myRandomCheckTime = TimerEmult.timersecond;
  65.         myTime = TimerEmult.timersecond;
  66.         botMove = GetComponent<BotMove>();
  67.         botState = GetComponent<BotState>();
  68.     }
  69.  
  70.     void Update()
  71.     {
  72.         if (botState.botStatus != BotStatus.EndGame)
  73.         {
  74.             AiUpdate();
  75.             CheckTime();
  76.         }
  77.     }
  78.  
  79.     void AiUpdate()
  80.     {
  81.         if (botState.botStatus == BotStatus.IsOn)
  82.         {
  83.             CreateCharacter();
  84.         }
  85.  
  86.         if (botState.botStatus == BotStatus.AiControl)
  87.         {
  88.             if (myTime == TimerEmult.timersecond)
  89.             {
  90.                 if (botAiState == BotAiState.CaptureBase)
  91.                 {
  92.                     LogicCuptureBase();
  93.                 }
  94.  
  95.                 if (botAiState == BotAiState.CaptureFactory)
  96.                 {
  97.                     LogicCuptureFactory();
  98.                 }
  99.  
  100.                 if (botAiState == BotAiState.FreeHunt)
  101.                 {
  102.                     LogicFreeHunt();
  103.                 }
  104.  
  105.                 if (botAiState == BotAiState.Repear)
  106.                 {
  107.                     LogicRepear();
  108.                 }
  109.             }
  110.  
  111.             ActionAi();
  112.         }
  113.  
  114.         if (botState.botStatus == BotStatus.PlayerControl)
  115.         {
  116.             ProcessRepear();
  117.             ProcessCapture();
  118.         }
  119.     }
  120.  
  121.     void ActionAi()
  122.     {
  123.         CheckRepear();
  124.         TimeFight();
  125.  
  126.         if (botActionState == BotActionState.Move)
  127.         {
  128.             LogicMove();
  129.         }
  130.  
  131.         if (botActionState == BotActionState.Fight)
  132.         {
  133.             LogicFight();
  134.         }
  135.  
  136.         if (botDubleActionState == BotDubleActionState.Capture)
  137.         {
  138.             if (botState.startCapture == true)
  139.             {
  140.                 ProcessCapture();
  141.             }
  142.         }
  143.  
  144.         if (botActionState == BotActionState.Repear)
  145.         {
  146.             if (botState.startRepear == true)
  147.             {
  148.                 ProcessRepear();
  149.             }
  150.             else
  151.             {
  152.                 botState.botStatus = BotStatus.IsOn;
  153.             }
  154.         }
  155.     }
  156.  
  157.     void LogicCuptureBase()
  158.     {
  159.         if (botActionState == BotActionState.Wait)
  160.         {
  161.             if (moveTargetObj != null)
  162.             {
  163.                 CreatePath(transform.position, moveTargetObj.transform.position);
  164.             }
  165.             else
  166.             {
  167.                 FindBaseArray();
  168.             }
  169.         }
  170.  
  171.         if (botActionState == BotActionState.EndPath)
  172.         {
  173.             if (botState.placeCapture == true)
  174.             {
  175.                 Vector3 randomPlace = new Vector3(Random.Range(3, -3), 0, Random.Range(3, -3));
  176.                 CreatePath(transform.position, moveTargetObj.transform.position + randomPlace);
  177.                 botActionState = BotActionState.Move;
  178.                 botDubleActionState = BotDubleActionState.Capture;
  179.                 botState.startCapture = true;
  180.  
  181.             }
  182.             else
  183.             {
  184.                 botActionState = BotActionState.Wait;
  185.             }
  186.         }
  187.     }
  188.  
  189.     void LogicCuptureFactory()
  190.     {
  191.         if (botActionState == BotActionState.Wait)
  192.         {
  193.             if (moveTargetObj != null)
  194.             {
  195.                 CreatePath(transform.position, moveTargetObj.transform.position);
  196.             }
  197.             else
  198.             {
  199.                 FindFactoryArray();
  200.             }
  201.         }
  202.  
  203.         if (botActionState == BotActionState.EndPath)
  204.         {
  205.             if (botState.placeCapture == true)
  206.             {
  207.                 Vector3 randomPlace = new Vector3(Random.Range(3, -3), 0, Random.Range(3, -3));
  208.                 CreatePath(transform.position, moveTargetObj.transform.position + randomPlace);
  209.                 botActionState = BotActionState.Move;
  210.                 botDubleActionState = BotDubleActionState.Capture;
  211.                 botState.startCapture = true;
  212.  
  213.             }
  214.             else
  215.             {
  216.                 botActionState = BotActionState.Wait;
  217.             }
  218.         }
  219.     }
  220.  
  221.     void LogicFreeHunt()
  222.     {
  223.         if (botActionState == BotActionState.Wait)
  224.         {
  225.             if (wayPointObj != null)
  226.             {
  227.                 moveTargetObj = wayPointObj;
  228.                 CreatePath(transform.position, moveTargetObj.transform.position);
  229.             }
  230.             else
  231.             {
  232.                 CreateWayPointObj(3, new Vector3(Random.Range(50, -50), transform.position.y, Random.Range(50, -50)));
  233.             }
  234.         }
  235.  
  236.         if (botActionState == BotActionState.EndPath)
  237.         {
  238.             if (moveTargetObj != null)
  239.             {
  240.                 Destroy(moveTargetObj);
  241.                 botActionState = BotActionState.Wait;
  242.             }
  243.         }
  244.     }
  245.  
  246.     void LogicFight()
  247.     {
  248.         if (enemyTargetObj != null)
  249.         {
  250.             /////////////////////////////////////////////
  251.             if (botBodyState != null)
  252.             {
  253.                 botBodyState.bodyTarget = enemyTargetObj.transform.position + Vector3.up;//назначаем башне точку, куда необходимо смотреть (вращаться)
  254.             }
  255.             /////////////////////////////////////////////
  256.             //-= Если дистанция до противника большая=-//
  257.             if (Vector3.Distance(transform.position, enemyTargetObj.transform.position) > 30)
  258.             {
  259.                 if (myRandomCheckTime == TimerEmult.timersecond)
  260.                 {
  261.                     //-=Идем прямо к противнику=-//
  262.                     botMove.aiDirection = new Vector3(0f, 0f, 0.1f);
  263.                 }
  264.             }
  265.             else
  266.             {
  267.                 if (myRandomCheckTime == TimerEmult.timersecond)
  268.                 {
  269.                     //Выбираем случайное направление
  270.                     RandomPosition();
  271.                 }
  272.             }
  273.             /////////////////////////////////////////////
  274.             if (Vector3.Angle(transform.position, enemyTargetObj.transform.position) > 5f)
  275.             {
  276.                 //-=Поворачиваемся=-//
  277.                 botMove.rotateDirection = Quaternion.LookRotation(enemyTargetObj.transform.position - transform.position);
  278.             }
  279.         }
  280.         else
  281.         {
  282.             botActionState = BotActionState.Wait;
  283.         }
  284.     }
  285.  
  286.     void LogicRepear()
  287.     {
  288.         if (botActionState == BotActionState.Wait)
  289.         {
  290.             if (repearPlaceObj != null)
  291.             {
  292.                 moveTargetObj = repearPlaceObj;
  293.                 CreatePath(transform.position, moveTargetObj.transform.position);
  294.             }
  295.             else
  296.             {
  297.                 botAiState = oldAiState;
  298.             }
  299.         }
  300.  
  301.         if (botActionState == BotActionState.EndPath)
  302.         {
  303.             botActionState = BotActionState.Repear;
  304.             if (botState.placeRepear == true)
  305.             {
  306.                 botState.startRepear = true;
  307.                 botState.startReload = true;
  308.             }
  309.            
  310.         }
  311.     }
  312.  
  313.     //-=Движемя по пути=-//
  314.     void LogicMove()
  315.     {
  316.         if (Vector3.Distance(transform.position, currentPoint) < 1f)
  317.         {
  318.             //-=Если есть еще точки на пути=-//
  319.             if (nextPoint + 1 < wayPoints.Length)
  320.             {
  321.                 //-=Определяем следующую точку=-//
  322.                 nextPoint += 1;
  323.                 currentPoint = wayPoints[nextPoint];
  324.             }
  325.             else
  326.             {
  327.                 //-=Дошли до конечной точки=-//
  328.                 botMove.aiDirection = new Vector3(0f, 0f, 0f);
  329.                 botActionState = BotActionState.EndPath;
  330.             }
  331.         }
  332.         else
  333.         {
  334.             //-=Движемся по пути=-//
  335.             currentPoint.y = transform.position.y;
  336.  
  337.             if (myTime == TimerEmult.timersecond)
  338.             {
  339.                 botMove.rotateDirection = Quaternion.LookRotation(currentPoint - transform.position);
  340.                 botMove.aiDirection = new Vector3(0f, 0f, 0.1f);
  341.  
  342.                 if (botBodyState != null)
  343.                 {
  344.                     if (botBodyState.bodyTarget != currentPoint)
  345.                     {
  346.                         botBodyState.bodyTarget = currentPoint;
  347.                     }
  348.                 }
  349.             }
  350.         }
  351.     }
  352.  
  353.     void CreateWayPointObj(float radius, Vector3 position)
  354.     {
  355.         if (wayPointPrefab != null)
  356.         {
  357.             wayPointObj = Instantiate(wayPointPrefab, new Vector3(position.x, position.y + radius, position.z), transform.rotation) as GameObject;
  358.             wayPointObj.transform.localScale = new Vector3(radius, radius, radius);
  359.             wayPointObj.name = "WayPointObj";
  360.         }
  361.         else
  362.         {
  363.             Debug.Log("No prefab wayPointPrefab");
  364.         }
  365.     }
  366.  
  367.     //-=Создаем путь=-//
  368.     void CreatePath(Vector3 startPosition, Vector3 endPosition)
  369.     {
  370.         path = new NavMeshPath();
  371.        
  372.         if (NavMesh.CalculatePath(startPosition, endPosition, NavMesh.AllAreas, path))
  373.         {
  374.             GetComponent<ShowGoldenPath>().path = path;
  375.             SetColorPath();
  376.             GetComponent<ShowGoldenPath>().color = color;
  377.             wayPoints = path.corners;
  378.             nextPoint = 0;
  379.             currentPoint = startPosition;
  380.             botActionState = BotActionState.Move;
  381.         }
  382.         else
  383.         {
  384.             Debug.Log("NoPath");
  385.             botActionState = BotActionState.NoPath;
  386.         }
  387.     }
  388.  
  389.     //-=Ищем обьект базу=-//
  390.     void FindBaseArray()
  391.     {
  392.         float distanceToBase = 1000;//Расстояние до завода
  393.         if (GlobalRoomConfig.arrayBaseState.Count > 0)
  394.         {
  395.             for (int i = 0; i < GlobalRoomConfig.arrayBaseState.Count; i++)
  396.             {
  397.                 if (GlobalRoomConfig.arrayBaseState[i].captureState.team != botState.myTeam)
  398.                 {
  399.                     if (distanceToBase > Vector3.Distance(GlobalRoomConfig.arrayBaseState[i].transform.position, transform.position))
  400.                     {
  401.                         distanceToBase = Vector3.Distance(GlobalRoomConfig.arrayBaseState[i].transform.position, transform.position);
  402.                         moveTargetObj = GlobalRoomConfig.arrayBaseState[i].gameObject;
  403.                         captureState = GlobalRoomConfig.arrayBaseState[i].GetComponent<CaptureState>();
  404.                     }
  405.                 }
  406.             }
  407.         }
  408.  
  409.         if (moveTargetObj == null)
  410.         {
  411.             for (int i = 0; i < GlobalRoomConfig.arrayBotStateBotRed.Count; i++)
  412.             {
  413.                 GlobalRoomConfig.arrayBotStateBotRed[i].botStatus = BotStatus.EndGame;
  414.             }
  415.  
  416.             for (int i = 0; i < GlobalRoomConfig.arrayBotStateBotBlue.Count; i++)
  417.             {
  418.                 GlobalRoomConfig.arrayBotStateBotBlue[i].botStatus = BotStatus.EndGame;
  419.             }
  420.         }
  421.     }
  422.  
  423.     void FindFactoryArray()
  424.     {
  425.         if (GlobalRoomConfig.arrayFactoryState.Count > 0)
  426.         {
  427.             int rnd = Random.Range(0, GlobalRoomConfig.arrayFactoryState.Count);
  428.             if (rnd == 0)
  429.             {
  430.                 float distanceToBase = 1000;
  431.                 for (int i = 0; i < GlobalRoomConfig.arrayFactoryState.Count; i++)
  432.                 {
  433.                     if (GlobalRoomConfig.arrayFactoryState[i].captureState.team != botState.myTeam)
  434.                     {
  435.                         if (distanceToBase > Vector3.Distance(GlobalRoomConfig.arrayFactoryState[i].transform.position, transform.position))
  436.                         {
  437.                             distanceToBase = Vector3.Distance(GlobalRoomConfig.arrayFactoryState[i].transform.position, transform.position);
  438.                             moveTargetObj = GlobalRoomConfig.arrayFactoryState[i].gameObject;
  439.                             captureState = GlobalRoomConfig.arrayFactoryState[i].GetComponent<CaptureState>();
  440.                         }
  441.                     }
  442.                 }
  443.             }
  444.             else
  445.             {
  446.                 if (GlobalRoomConfig.arrayFactoryState[rnd] != null)
  447.                 {
  448.                     if (GlobalRoomConfig.arrayFactoryState[rnd].captureState.team != botState.myTeam)
  449.                     {
  450.                         moveTargetObj = GlobalRoomConfig.arrayFactoryState[rnd].gameObject;
  451.                         captureState = GlobalRoomConfig.arrayFactoryState[rnd].GetComponent<CaptureState>();
  452.                     }
  453.                 }
  454.             }
  455.         }
  456.        
  457.  
  458.         if (moveTargetObj == null)
  459.         {
  460.             botAiState = BotAiState.CaptureBase;
  461.         }
  462.     }
  463.  
  464.     void RandomPosition()
  465.     {
  466.         int rnd = Random.Range(0, 4);
  467.  
  468.         if (rnd == 0)
  469.         {
  470.             botMove.aiDirection = new Vector3(0f, 0f, -0.1f);
  471.         }
  472.  
  473.         if (rnd == 1)
  474.         {
  475.             botMove.aiDirection = new Vector3(-0.1f, 0f, 0f);
  476.         }
  477.  
  478.         if (rnd == 2)
  479.         {
  480.             botMove.aiDirection = new Vector3(0.1f, 0f, 0f);
  481.         }
  482.  
  483.         if (rnd == 3)
  484.         {
  485.             botMove.aiDirection = new Vector3(0, 0f, -0.1f);
  486.         }
  487.     }
  488.  
  489.     //контроль времени после потери контакта с противником
  490.     void TimeFight()
  491.     {
  492.         if (timeFight <= 0)
  493.         {
  494.             timeFight = 0;
  495.  
  496.             if (botActionState == BotActionState.Fight)
  497.             {
  498.                 enemyTargetObj = null;
  499.                 botActionState = BotActionState.Wait;
  500.             }
  501.         }
  502.         else
  503.         {
  504.             timeFight--;
  505.         }
  506.     }
  507.  
  508.     void CheckTime()
  509.     {
  510.         if (myRandomCheckTime >= 60)
  511.         {
  512.             myRandomCheckTime = 0;
  513.         }
  514.  
  515.         if (myRandomCheckTime == TimerEmult.timersecond)
  516.         {
  517.             myRandomCheckTime += Random.Range(2,5);
  518.         }
  519.  
  520.         if (myTime >= 60)
  521.         {
  522.             myTime = 0;
  523.         }
  524.  
  525.         if (myTime == TimerEmult.timersecond)
  526.         {
  527.             myTime += 1;
  528.         }
  529.     }
  530.  
  531.     void CheckRepear()
  532.     {
  533.         if (repearPlaceObj != null)
  534.         {
  535.             if (botActionState != BotActionState.Fight)
  536.             {
  537.                 if (botState.health < 100)
  538.                 {
  539.                     if (botAiState != BotAiState.Repear)
  540.                     {
  541.                         oldAiState = botAiState;
  542.                         botAiState = BotAiState.Repear;
  543.                         botActionState = BotActionState.Wait;
  544.                     }
  545.                 }
  546.             }
  547.         }
  548.     }
  549.  
  550.     void ProcessRepear()
  551.     {
  552.         if (botState.startRepear == true)
  553.         {
  554.             if (botState.health < 100)
  555.             {
  556.                 botMove.animator.SetBool("repear", true);  //проигрываем анимацию ремонт
  557.                 botState.health += 1 * Time.deltaTime;
  558.             }
  559.             else
  560.             {
  561.                 botMove.animator.SetBool("repear", false);  //проигрываем анимацию ремонт
  562.                 botState.startRepear = false;
  563.                 botState.health = 100;
  564.                 moveTargetObj = null;
  565.             }
  566.         }
  567.     }
  568.  
  569.     void ProcessCapture()
  570.     {
  571.         if (myTime == TimerEmult.timersecond)
  572.         {
  573.             if (botState.startCapture == true)
  574.             {
  575.                 if (captureState.team != botState.myTeam)
  576.                 {
  577.                     if (botState.myTeam == "Red")
  578.                     {
  579.                         captureState.captureRed += 10;
  580.                         captureState.captureBlue -= 10;
  581.                     }
  582.  
  583.                     if (botState.myTeam == "Blue")
  584.                     {
  585.                         captureState.captureBlue += 10;
  586.                         captureState.captureRed -= 10;
  587.                     }
  588.                 }
  589.                 else
  590.                 {
  591.                     moveTargetObj = null;
  592.                     captureState = null;
  593.                     botState.startCapture = false;
  594.                     botActionState = BotActionState.Wait;
  595.                     botDubleActionState = BotDubleActionState.None;
  596.                 }
  597.             }
  598.         }
  599.     }
  600.  
  601.     void CreateCharacter()
  602.     {
  603.         int tmp = Random.Range(0, 2);
  604.         if (tmp == 0) { botAiState = BotAiState.CaptureFactory; }
  605.         if (tmp == 1) { botAiState = BotAiState.CaptureFactory; }
  606.        
  607.         botActionState = BotActionState.Wait;
  608.         botState.botStatus = BotStatus.AiControl;
  609.         myRandomCheckTime = TimerEmult.timersecond;
  610.         myTime = TimerEmult.timersecond;
  611.     }
  612.  
  613.     void SetColorPath()
  614.     {
  615.         if (botState.myTeam == "Red")
  616.         {
  617.             color = Color.red;
  618.         }
  619.  
  620.         if (botState.myTeam == "Blue")
  621.         {
  622.             color = Color.blue;
  623.         }
  624.  
  625.         if (botAiState == BotAiState.Repear)
  626.         {
  627.             color = Color.green;
  628.         }
  629.     }
  630. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement