Advertisement
Krubbs

Untitled

Dec 11th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.38 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class EnemyScript2 : MonoBehaviour
  5. {
  6.     // Ссылка на компонент NavMeshAgent. В Unity 5.4 и ниже, необходимо удалить символы перед NavMeshAgent
  7.     UnityEngine.AI.NavMeshAgent agent;
  8.  
  9.     // Ссылка на объект-кружок под юнитом, который будет визуально показывать, выбран ли текущий юнит
  10.     public GameObject isHoveredObject;
  11.  
  12.     // Здоровье юнита
  13.     public float HP = 100;
  14.     // Булевая переменная, используется для идентификации, наведен ли курсор на него в скрипте CursorController
  15.     public bool hovered;
  16.     // Булевая переменная, используется для идентификации, выбран ли этот объект в скрипте CursorController
  17.     public bool selected;
  18.     // Ссылка на вероятного врага
  19.     public EnemyScript2 myEnemy;
  20.  
  21.     // Ссылка на CursorController, скрипт будет автоматически найден в сцене в строка 28
  22.     CursorController controller;
  23.  
  24.     // Выполняется в момент запуска игры
  25.     void Start ()
  26.     {
  27.         // Находим CursorController в сцене, используя FindObjectOfType() и приводим результат в необъходимый тип CursorController
  28.         controller = (CursorController)FindObjectOfType(typeof(CursorController));
  29.         // Так как агент не публичная переменная, и по сути будет нам лишь мешаться в инспекторе, используем GetComponent для выбора компонента с объекта.
  30.         // В Unity 5.4 и ниже, необходимо удалить символы перед NavMeshAgent, строка будет выглядеть так: "agent = GetComponent<NavMeshAgent>();"
  31.         agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
  32.     }
  33.  
  34.     // Вызывается в каждом кадре
  35.     void Update ()
  36.     {
  37.         // Используем Color.Lerp() для плавного изменения цвета юнита в зависимости от запаса здоровья.
  38.         // Сначала обращаемся к компоненту Renderer, затем выбираем материал, цвет
  39.         GetComponent<Renderer>().material.color = Color.Lerp(Color.white, Color.red, 1 - HP / 100f);
  40.  
  41.         // Если здоровье меньше нуля..
  42.         if (HP <= 0)
  43.         {
  44.             // Уничтожаем объект со сцены
  45.             Destroy(gameObject);
  46.             // Используя "return;" прекращаем выполнение функции Update(). Все дальнейшие строки кода не будут исполнены во избежание ошибок из-за удаления объекта со сцены
  47.             return;
  48.         }
  49.  
  50.         // Булевую hovered приравниваем к результату сравнения наведенного объекта у CursorController с текущим скриптом
  51.         hovered = controller.hoveredObject == this;
  52.         // Булевую selected приравниваем к результату сравнения выбранного объекта у CursorController с текущим скриптом
  53.         selected = controller.selectedObject == this;
  54.  
  55.         // Используя только что высчитанные hovered и selected, показываем круг под юнитом на основе записи "активно, если hovered или selected правдивы". Символы || по-русски звучат как "или"
  56.         isHoveredObject.SetActive(hovered || selected);
  57.  
  58.         // Красим круг под персонажем на основе булевой selected.
  59.         // Такая форма записи позволяет задавать любые значения используя значения булевой переменной
  60.         // [что угодно] = [булевая] ? [значение, если true] : [значение, если false];
  61.         // Такая запись позволяет сэкономить место, вместо того чтобы писать
  62.         //
  63.         // if(selected)
  64.         //      isHoveredObject.GetComponent<Renderer>().material.color = Color.yellow;
  65.         // else
  66.         //      isHoveredObject.GetComponent<Renderer>().material.color = Color.white;
  67.         //
  68.         isHoveredObject.GetComponent<Renderer>().material.color = selected ? Color.yellow : Color.white;
  69.  
  70.         // Если указан myEnemy
  71.         if (myEnemy != null)
  72.         {
  73.             // Непрерывно двигаемся в позицию нашего соперника, используя функцию SetDestination(Vector3 target), доступную у компонента NavMeshAgent
  74.             agent.SetDestination(myEnemy.transform.position);
  75.  
  76.             // Высчитываем дистанцию до нашей цели
  77.             float distance = Vector3.Distance(transform.position, myEnemy.transform.position);
  78.             // Если дистанция меньше 1.5 метров...
  79.             if (distance < 1.5f)
  80.                 myEnemy.DamageMe(this);     // Вызываем у цели функцию DamageMe, передавая в качестве аргумента текущий скрипт, дабы противник знал, кто его атакует
  81.         }
  82.     }
  83.  
  84.     // Функция вызывается другими юнитами, когда те подошли достаточно близко к нам. В качестве аргумента принимается скрипт-контроллер противника, который нас атакует. См. строку 80
  85.     public void DamageMe(EnemyScript2 enemy)
  86.     {
  87.         // Уменьшаем здоровье на 10 ед каждую секунду (ведь функция вызывается соперником в Update()
  88.         HP -= Time.deltaTime * 10;
  89.  
  90.         // Если мы никого сами не атаковали, но нас начали бить...
  91.         if (myEnemy == null)
  92.             myEnemy = enemy;    // Выбираем атакущего в качестве нашей цели. Дадим сдачи :)
  93.     }
  94.  
  95.     // Функция вызывается из CursorController в случае, когда происходит клик правой кнопкой мыши по ландшафту
  96.     public void SetDestination(Vector3 position)
  97.     {
  98.         // Здесь обращаемся к локальной переменной agent, ведь мы не могли ее использовать из CursorController. Для того и была создана эта функция, переменная agent не публичная
  99.         // Двигаемся в указанную позицию, используя функцию SetDestination(Vector3 target), доступную у компонента NavMeshAgent
  100.         agent.SetDestination(position);
  101.     }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement