using UnityEngine; using UnityEngine.InputSystem; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class UnitSelection : MonoBehaviour { #region Property and variable [Tooltip("선택된 부대")] [field: SerializeField] public bool IsSelectable { get; private set; } = true; [field: SerializeField] public PirateUnit SelectedPirateUnit { get; private set; } [SerializeField] private LayerMask unitLayer; [SerializeField] private LayerMask groundLayer; private PirateUnit previousUnitController; #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.SelectUnit.performed += OnSelectUnit; controls.Unit.CancelSelectedUnit.performed += OnCancelSelectedUnit; controls.Unit.MoveUnit.performed += OnMoveUnit; controls.Enable(); unitLayer = LayerMask.GetMask("Pirate"); groundLayer = LayerMask.GetMask("Ground"); } #endregion #region New input system private void OnSelectUnit(InputAction.CallbackContext context) { if (!context.performed || !IsSelectable) return; var ray = CameraManager.Inst.MainCam.ScreenPointToRay(Mouse.current.position.ReadValue()); // 부대를 클릭 했을 때, if (Physics.Raycast(ray, out var hit, Mathf.Infinity, unitLayer, QueryTriggerInteraction.Collide)) { var pirateUnit = hit.collider.transform.parent.GetComponent(); if (pirateUnit == null) return; // 선택된 부대가 없었을 때, if (SelectedPirateUnit == null) { foreach (var pirateAi in pirateUnit.pirateUnitStat.PirateAiList) { pirateAi.SelectedHighlight(); } SelectedPirateUnit = pirateUnit; GameManager.Inst.SlowSpeedMode(); } // 선택된 부대가 이미 선택된 부대일 때, else if (SelectedPirateUnit == pirateUnit) { foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList) { pirateAi.ResetHighlight(); } SelectedPirateUnit = null; GameManager.Inst.DefaultSpeedMode(); } // 다른 부대가 선택될 때, else { foreach (var pirateAi in pirateUnit.pirateUnitStat.PirateAiList) { pirateAi.SelectedHighlight(); } foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList) { pirateAi.ResetHighlight(); } SelectedPirateUnit = pirateUnit; } } // 부대를 클릭하지 않았을 때, else { // 선택된 부대가 없었을 때, if (SelectedPirateUnit == null) return; // 선택된 부대가 있었을 때, foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList) { pirateAi.ResetHighlight(); } SelectedPirateUnit = null; GameManager.Inst.DefaultSpeedMode(); } } private void OnCancelSelectedUnit(InputAction.CallbackContext context) { if (!context.performed || !IsSelectable || SelectedPirateUnit == null) return; foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList) { pirateAi.ResetHighlight(); } SelectedPirateUnit = null; GameManager.Inst.DefaultSpeedMode(); } private void OnMoveUnit(InputAction.CallbackContext context) { if (!context.performed || !IsSelectable || SelectedPirateUnit == null) return; var ray = CameraManager.Inst.MainCam.ScreenPointToRay(Mouse.current.position.ReadValue()); if (Physics.Raycast(ray, out var hit, Mathf.Infinity, groundLayer, QueryTriggerInteraction.Collide)) { var targetPos = hit.point; SelectedPirateUnit.MoveCommand(targetPos); } foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList) { pirateAi.ResetHighlight(); } SelectedPirateUnit = null; GameManager.Inst.DefaultSpeedMode(); } #endregion } }