Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public class EnemyScript2 : MonoBehaviour
- {
- // Ссылка на компонент NavMeshAgent. В Unity 5.4 и ниже, необходимо удалить символы перед NavMeshAgent
- UnityEngine.AI.NavMeshAgent agent;
- // Ссылка на объект-кружок под юнитом, который будет визуально показывать, выбран ли текущий юнит
- public GameObject isHoveredObject;
- // Здоровье юнита
- public float HP = 100;
- // Булевая переменная, используется для идентификации, наведен ли курсор на него в скрипте CursorController
- public bool hovered;
- // Булевая переменная, используется для идентификации, выбран ли этот объект в скрипте CursorController
- public bool selected;
- // Ссылка на вероятного врага
- public EnemyScript2 myEnemy;
- // Ссылка на CursorController, скрипт будет автоматически найден в сцене в строка 28
- CursorController controller;
- // Выполняется в момент запуска игры
- void Start ()
- {
- // Находим CursorController в сцене, используя FindObjectOfType() и приводим результат в необъходимый тип CursorController
- controller = (CursorController)FindObjectOfType(typeof(CursorController));
- // Так как агент не публичная переменная, и по сути будет нам лишь мешаться в инспекторе, используем GetComponent для выбора компонента с объекта.
- // В Unity 5.4 и ниже, необходимо удалить символы перед NavMeshAgent, строка будет выглядеть так: "agent = GetComponent<NavMeshAgent>();"
- agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
- }
- // Вызывается в каждом кадре
- void Update ()
- {
- // Используем Color.Lerp() для плавного изменения цвета юнита в зависимости от запаса здоровья.
- // Сначала обращаемся к компоненту Renderer, затем выбираем материал, цвет
- GetComponent<Renderer>().material.color = Color.Lerp(Color.white, Color.red, 1 - HP / 100f);
- // Если здоровье меньше нуля..
- if (HP <= 0)
- {
- // Уничтожаем объект со сцены
- Destroy(gameObject);
- // Используя "return;" прекращаем выполнение функции Update(). Все дальнейшие строки кода не будут исполнены во избежание ошибок из-за удаления объекта со сцены
- return;
- }
- // Булевую hovered приравниваем к результату сравнения наведенного объекта у CursorController с текущим скриптом
- hovered = controller.hoveredObject == this;
- // Булевую selected приравниваем к результату сравнения выбранного объекта у CursorController с текущим скриптом
- selected = controller.selectedObject == this;
- // Используя только что высчитанные hovered и selected, показываем круг под юнитом на основе записи "активно, если hovered или selected правдивы". Символы || по-русски звучат как "или"
- isHoveredObject.SetActive(hovered || selected);
- // Красим круг под персонажем на основе булевой selected.
- // Такая форма записи позволяет задавать любые значения используя значения булевой переменной
- // [что угодно] = [булевая] ? [значение, если true] : [значение, если false];
- // Такая запись позволяет сэкономить место, вместо того чтобы писать
- //
- // if(selected)
- // isHoveredObject.GetComponent<Renderer>().material.color = Color.yellow;
- // else
- // isHoveredObject.GetComponent<Renderer>().material.color = Color.white;
- //
- isHoveredObject.GetComponent<Renderer>().material.color = selected ? Color.yellow : Color.white;
- // Если указан myEnemy
- if (myEnemy != null)
- {
- // Непрерывно двигаемся в позицию нашего соперника, используя функцию SetDestination(Vector3 target), доступную у компонента NavMeshAgent
- agent.SetDestination(myEnemy.transform.position);
- // Высчитываем дистанцию до нашей цели
- float distance = Vector3.Distance(transform.position, myEnemy.transform.position);
- // Если дистанция меньше 1.5 метров...
- if (distance < 1.5f)
- myEnemy.DamageMe(this); // Вызываем у цели функцию DamageMe, передавая в качестве аргумента текущий скрипт, дабы противник знал, кто его атакует
- }
- }
- // Функция вызывается другими юнитами, когда те подошли достаточно близко к нам. В качестве аргумента принимается скрипт-контроллер противника, который нас атакует. См. строку 80
- public void DamageMe(EnemyScript2 enemy)
- {
- // Уменьшаем здоровье на 10 ед каждую секунду (ведь функция вызывается соперником в Update()
- HP -= Time.deltaTime * 10;
- // Если мы никого сами не атаковали, но нас начали бить...
- if (myEnemy == null)
- myEnemy = enemy; // Выбираем атакущего в качестве нашей цели. Дадим сдачи :)
- }
- // Функция вызывается из CursorController в случае, когда происходит клик правой кнопкой мыши по ландшафту
- public void SetDestination(Vector3 position)
- {
- // Здесь обращаемся к локальной переменной agent, ведь мы не могли ее использовать из CursorController. Для того и была создана эта функция, переменная agent не публичная
- // Двигаемся в указанную позицию, используя функцию SetDestination(Vector3 target), доступную у компонента NavMeshAgent
- agent.SetDestination(position);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement