Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public class CursorController : MonoBehaviour
- {
- // Объект в сцене, который будем перемещать вслед за рейкастом. Курсор в сцене
- public GameObject cursor;
- // Не путать с GameObject. Здесь - любой объект или компонент, на который наведен курсор
- public Object hoveredObject;
- // Тот же тип, допускает указание на любой компонент в игре. В эту переменную запоминаем выбранного юнита
- public Object selectedObject;
- // Вызывается в каждом кадре
- void Update ()
- {
- // Перед началом кадра обнуляем объект, на который мог быть наведен курсор.
- // Сделано для того, чтобы в случае, когда курсор "уйдет" с объекта, переменная это отобразила путем обнуления
- hoveredObject = null;
- // Переменная для запоминания информации о пуске луча
- RaycastHit hitInfo;
- // Луч, запущенный из основной камеры по координатам мыши
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- // Пускаем рейкаст, используя луч, описанный с строке 24
- if(Physics.Raycast( ray, out hitInfo))
- {
- // Перемещаем "объект-курсор" в координаты попадания луча
- cursor.transform.position = hitInfo.point;
- // Проверяем наличие компонента EnemyScript2 у объекта, по которому попал луч
- if (hitInfo.transform.GetComponent<EnemyScript2>())
- {
- // Если компонент EnemyScript2 найден, записываем его в переменную hoveredObject
- hoveredObject = hitInfo.transform.GetComponent<EnemyScript2>();
- }
- // Если хоть что-то есть в hoveredObject (курсор мыши наведен на подходящий объект) и нажимаем левую кнопку мыши,...
- if (hoveredObject != null && Input.GetMouseButtonDown(0))
- selectedObject = hoveredObject; // Записываем в selectedObject то, что было в hoveredObject. То есть по ЛКМ мы "выбираем" юнита
- // Однако, если курсор не наведен ни на один из подходящих объектов, и нажимается левая кнопка мыши...
- if (hoveredObject == null && Input.GetMouseButtonDown(0))
- selectedObject = null; // Очищаем "выбранного" юнита. То есть сбрасываем выделение, если оно было
- // Если есть выбранный объект и нажимаем правую кнопку мыши...
- if (selectedObject != null && Input.GetMouseButtonDown(1))
- {
- //Проверка типа выбранного объекта. Проверяем, является ли объект типа EnemyScript2
- if (selectedObject.GetType() == typeof(EnemyScript2))
- {
- // В случае успешной проверки, объявляем временную переменную EnemyScript2, в которую заводим переведенный в тип EnemyScript2 переменную selectedObject.
- // То есть, это работает аналогично округлению дробных чисел. Только более сложный сценарий использования, нежели простое округление "int result = (int)4.23f;"
- EnemyScript2 enemy = (EnemyScript2)selectedObject;
- // Так как в 48 строке мы проверили и нажатие на ПКМ, отдаем приказ юниту проследовать в позицию курсора. Это публичная функция, написанная в EnemyScript2, строка 96
- enemy.SetDestination(hitInfo.point);
- // Обнуляем переменную myEnemy у выбранного юнита, дабы отменить приказ атаковать цель, если такой приказ был
- enemy.myEnemy = null;
- // Если курсор наведен на какой-нибудь объект, а тип объекта == EnemyScript2,...
- if (hoveredObject != null && hoveredObject.GetType() == typeof(EnemyScript2))
- {
- // Указываем нашему выбранному юниту соперника, которого необходимо атаковать. Т.е. отдаем приказ атаковать цель, см. код скрипта EnemyScript2
- enemy.myEnemy = (EnemyScript2)hoveredObject;
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement