OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Unit/UnitSelection.cs
NTG_Lenovo 7fa593f6ee #8 유닛 이동, 공격 테스트 중
- Ai프리팹 이동속도 변경, 애니메이션 및 애니메이션 이벤트 추가 및 변경
- Enemy의 화살이 안맞는 오류 수정
- 유닛 생성시 UnitName이 아무 값도 안들어있으면 자동 이름변경
- 인터페이스(IAiMover, IFieldOfView, IDamageable) 구조 변경
- 유닛 선택 구조 변경(여러 유닛 겹쳐서 선택하던 오류 수정)
2023-08-17 16:57:46 +09:00

140 lines
4.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
// 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") | LayerMask.GetMask("Enemy");
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") | LayerMask.GetMask("Enemy");
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<UnitController>();
if (unitController == null) return;
// 선택된 부대가 없었을 때,
if (SelectedUnitController == null)
{
foreach (var soldier in unitController.unit.soldierList)
{
soldier.SelectedHighlight();
}
SelectedUnitController = unitController;
GameManager.Inst.SlowSpeedMode();
}
// 선택된 부대가 이미 선택된 부대일 때,
else if (SelectedUnitController == unitController)
{
foreach (var soldier in SelectedUnitController.unit.soldierList)
{
soldier.ResetHighlight();
}
SelectedUnitController = null;
GameManager.Inst.DefaultSpeedMode();
}
// 다른 부대가 선택될 때,
else
{
foreach (var soldier in unitController.unit.soldierList)
{
soldier.SelectedHighlight();
}
foreach (var soldier in SelectedUnitController.unit.soldierList)
{
soldier.ResetHighlight();
}
SelectedUnitController = unitController;
}
}
// 부대를 클릭하지 않았을 때,
else
{
// 선택된 부대가 없었을 때,
if (SelectedUnitController == null) return;
// 선택된 부대가 있었을 때,
foreach (var soldier in SelectedUnitController.unit.soldierList)
{
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.soldierList)
{
soldier.ResetHighlight();
}
SelectedUnitController = null;
GameManager.Inst.DefaultSpeedMode();
}
#endregion
}
}