using UnityEngine; using UnityEngine.InputSystem; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class UnitSelection : MonoBehaviour { #region Property and variable [Tooltip("선택된 부대")] [field: SerializeField] public UnitController SelectedUnitController { get; private set; } [SerializeField] private LayerMask unitLayer; [SerializeField] private LayerMask groundLayer; private UnitController previousUnitController; private Camera mainCamera; #endregion #region Unity built-in function private void Reset() { unitLayer = LayerMask.GetMask("Pirate"); groundLayer = LayerMask.GetMask("Ground"); } private void Awake() { var controls = new BlueWater(); controls.Unit.LeftClick.performed += OnLeftClick; controls.Unit.RightClick.performed += OnRightClick; controls.Enable(); unitLayer = LayerMask.GetMask("Pirate"); groundLayer = LayerMask.GetMask("Ground"); mainCamera = Camera.main; } #endregion #region New input system private void OnLeftClick(InputAction.CallbackContext context) { if (!context.performed) return; var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue()); // 부대를 클릭 했을 때, if (Physics.Raycast(ray, out var hit, Mathf.Infinity, unitLayer)) { var unitController = hit.collider.transform.parent.GetComponent(); if (unitController == null) return; // 선택된 부대가 없었을 때, if (SelectedUnitController == null) { foreach (var soldier in unitController.unit.UnitList) { soldier.SelectedHighlight(); } SelectedUnitController = unitController; GameManager.Inst.SlowSpeedMode(); } // 선택된 부대가 이미 선택된 부대일 때, else if (SelectedUnitController == unitController) { foreach (var soldier in SelectedUnitController.unit.UnitList) { soldier.ResetHighlight(); } SelectedUnitController = null; GameManager.Inst.DefaultSpeedMode(); } // 다른 부대가 선택될 때, else { foreach (var soldier in unitController.unit.UnitList) { soldier.SelectedHighlight(); } foreach (var soldier in SelectedUnitController.unit.UnitList) { soldier.ResetHighlight(); } SelectedUnitController = unitController; } } // 부대를 클릭하지 않았을 때, else { // 선택된 부대가 없었을 때, if (SelectedUnitController == null) return; // 선택된 부대가 있었을 때, foreach (var soldier in SelectedUnitController.unit.UnitList) { soldier.ResetHighlight(); } SelectedUnitController = null; GameManager.Inst.DefaultSpeedMode(); } } private void OnRightClick(InputAction.CallbackContext context) { if (!context.performed || SelectedUnitController == null) return; var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue()); if (Physics.Raycast(ray, out var hit, Mathf.Infinity, groundLayer)) { var targetPos = hit.point; SelectedUnitController.MoveCommand(targetPos); } foreach (var soldier in SelectedUnitController.unit.UnitList) { soldier.ResetHighlight(); } SelectedUnitController = null; GameManager.Inst.DefaultSpeedMode(); } #endregion } }