1.enum 변수들 NONE = 0 -> NONE = -1 변경 2.meleeWeapon -> closeWeapon 이름 변경 3.BaseCharacter(기본캐릭터) 조립형 프리팹 수정
140 lines
4.5 KiB
C#
140 lines
4.5 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.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
|
|
}
|
|
} |