OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Unit/UnitSelection.cs
NTG 42f15c5a6e #8 UnitController 이용한 Ai 그룹화 테스트
- 그룹 상호작용에 따른 하이라이트 효과 적용
1. 마우스 커서 올림 - 하얀색 외곽선
2. 그룹 선택 - 파란색 외곽선

- Arrow, Archer 코루틴 문제 구조 변경
- FieldOfView 인터페이스화
- new input system Unit Action 추가
- GameManager 슬로우모드(부대 선택시) 추가
- Ai 전체 프리팹 stat 수치 변경
- 원거리 이동 중에 공격시 멈추면서 공격하도록 변경
- Layer, ProjectSetting Physics 추가 및변경
2023-08-16 05:36:04 +09:00

121 lines
3.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.InputSystem;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class UnitSelection : MonoBehaviour
{
#region Property and variable
[Tooltip("선택된 부대")]
[SerializeField] private UnitController selectedUnitController;
public UnitController SelectedUnitController
{
get => selectedUnitController;
set
{
tempUnitController = selectedUnitController;
selectedUnitController = value;
if (selectedUnitController == null)
{
if (tempUnitController != null)
{
foreach (var soldier in tempUnitController.unit.soldierList)
{
soldier.ResetHighlight();
}
tempUnitController = null;
}
GameManager.Inst.DefaultSpeedMode();
}
else
{
GameManager.Inst.SlowSpeedMode();
}
}
}
[SerializeField] private LayerMask unitLayer;
[SerializeField] private LayerMask groundLayer;
private UnitController tempUnitController;
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)
{
SelectedUnitController = unitController;
foreach (var soldier in selectedUnitController.unit.soldierList)
{
soldier.SelectedHighlight();
}
}
}
else
{
SelectedUnitController = null;
}
}
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);
SelectedUnitController = null;
}
else
{
SelectedUnitController = null;
}
}
#endregion
}
}