123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class SelectionObject : MonoBehaviour
- {
- // Start is called before the first frame update
- void Start()
- {
- }
- bool isSelecting = false;
- Vector3 mousePosition1;
- void Update()
- {
- // Если нажимаем на левую кнопку мыши, то
- // сохраняем координаты курсора мыши и начинаем выбор
- if (Input.GetMouseButtonDown(0))
- {
- isSelecting = true;
- mousePosition1 = Input.mousePosition;
- }
- // Если мы отпускаем левую кнопку мыши - конец выбора
- if (Input.GetMouseButtonUp(0))
- isSelecting = false;
- }
- /// <summary>
- /// Рисуем область выделения
- /// </summary>
- public static class Utils
- {
- static Texture2D _whiteTexture;
- public static Texture2D WhiteTexture
- {
- get
- {
- if (_whiteTexture == null)
- {
- _whiteTexture = new Texture2D(1, 1);
- _whiteTexture.SetPixel(0, 0, Color.white);
- _whiteTexture.Apply();
- }
- return _whiteTexture;
- }
- }
- public static void DrawScreenRect(Rect rect, Color color)
- {
- GUI.color = color;
- GUI.DrawTexture(rect, WhiteTexture);
- GUI.color = Color.white;
- }
- /// <summary>
- /// Отображение границ прямоугольника
- /// </summary>
- /// <param name="rect"></param>
- /// <param name="thickness"></param>
- /// <param name="color"></param>
- public static void DrawScreenRectBorder(Rect rect, float thickness, Color color)
- {
- // верх
- Utils.DrawScreenRect(new Rect(rect.xMin, rect.yMin, rect.width, thickness), color);
- // лево
- Utils.DrawScreenRect(new Rect(rect.xMin, rect.yMin, thickness, rect.height), color);
- // право
- Utils.DrawScreenRect(new Rect(rect.xMax - thickness, rect.yMin, thickness, rect.height), color);
- // низ
- Utils.DrawScreenRect(new Rect(rect.xMin, rect.yMax - thickness, rect.width, thickness), color);
- }
- /// <summary>
- /// Рисуем мышью прямоугольную область выбора
- /// </summary>
- public static Rect GetScreenRect(Vector3 screenPosition1, Vector3 screenPosition2)
- {
- // Перемещение координат из левого нижнего в левый верхний угол
- screenPosition1.y = Screen.height - screenPosition1.y;
- screenPosition2.y = Screen.height - screenPosition2.y;
- // Рассчитать углы
- var topLeft = Vector3.Min(screenPosition1, screenPosition2);
- var bottomRight = Vector3.Max(screenPosition1, screenPosition2);
- // Создать прямоугольник
- return Rect.MinMaxRect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
- }
- /// <summary>
- /// Выбор юнитов в Unity
- /// </summary>
- /// <param name="camera"></param>
- /// <param name="screenPosition1"></param>
- /// <param name="screenPosition2"></param>
- /// <returns></returns>
- public static Bounds GetViewportBounds(Camera camera, Vector3 screenPosition1, Vector3 screenPosition2)
- {
- var v1 = Camera.main.ScreenToViewportPoint(screenPosition1);
- var v2 = Camera.main.ScreenToViewportPoint(screenPosition2);
- var min = Vector3.Min(v1, v2);
- var max = Vector3.Max(v1, v2);
- min.z = camera.nearClipPlane;
- max.z = camera.farClipPlane;
- var bounds = new Bounds();
- bounds.SetMinMax(min, max);
- return bounds;
- }
- }
- void OnGUI()
- {
- if (isSelecting)
- {
- // Создаем прямоугольник на основе начальных и конечных координат курсора
- var rect = Utils.GetScreenRect(mousePosition1, Input.mousePosition);
- Utils.DrawScreenRect(rect, new Color(0.8f, 0.8f, 0.95f, 0.25f));
- Utils.DrawScreenRectBorder(rect, 2, new Color(0.8f, 0.8f, 0.95f));
- }
- }
- public bool IsWithinSelectionBounds(GameObject gameObject)
- {
- if (!isSelecting)
- return false;
- var camera = Camera.main;
- var viewportBounds =
- Utils.GetViewportBounds(camera, mousePosition1, Input.mousePosition);
- return viewportBounds.Contains(
- camera.WorldToViewportPoint(gameObject.transform.position));
- }
- }
|