CapersProject/Assets/02.Scripts/Character/Player/Combat/CombatInput.cs

250 lines
7.4 KiB
C#
Raw Normal View History

2024-06-03 18:26:03 +00:00
using System;
using System.Collections.Generic;
using BlueWater.Interfaces;
using BlueWater.Maps;
2024-06-03 18:26:03 +00:00
using BlueWater.Uis;
using BlueWater.Utility;
using Sirenix.OdinInspector;
2024-06-03 18:26:03 +00:00
using UnityEngine;
using UnityEngine.InputSystem;
namespace BlueWater.Players.Combat
{
public class CombatInput : MonoBehaviour
{
// variables
#region variables
// Components
[SerializeField]
2024-06-03 18:26:03 +00:00
private PlayerInput _playerInput;
[SerializeField]
protected float InteractionRadius = 2f;
[SerializeField]
private Vector3 _interactionUiOffset = new(0f, 1.5f, 0f);
private List<IPlayerInteraction> _playerInteractions = new();
private IPlayerInteraction _closestInteraction;
private IPlayerInteraction _previousInteraction;
2024-06-03 18:26:03 +00:00
// Events
public event Action<Vector2> OnMoveInputReceived;
public event Action OnDashInputReceived;
public event Action<bool> OnAttackInputReceived;
public event Action<string> OnActivateMainSkillInputReceived;
2024-06-03 18:26:03 +00:00
#endregion
private void Awake()
{
InitializeComponents();
}
private void Start()
{
Initialize();
}
private void Update()
{
_closestInteraction = GetClosestInteraction();
if (_closestInteraction != null)
{
_closestInteraction.ShowInteractionUi();
if (_previousInteraction != null && _closestInteraction != _previousInteraction)
{
_previousInteraction.HideInteractionUi();
}
_previousInteraction = _closestInteraction;
}
else
{
_previousInteraction?.HideInteractionUi();
_previousInteraction = null;
}
}
2024-06-03 18:26:03 +00:00
// Initialize methods
#region Initialize methods
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
_playerInput = GetComponent<PlayerInput>();
}
private void Initialize()
2024-06-03 18:26:03 +00:00
{
_playerInput.enabled = true;
2024-06-03 18:26:03 +00:00
PlayerInputKeyManager.Instance.SetCurrentPlayerInput(_playerInput);
PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.Combat);
}
#endregion
// Player input methods
#region Player input methods
public void OnMove(InputAction.CallbackContext context)
{
var movementInput = context.ReadValue<Vector2>();
OnMoveInputReceived?.Invoke(movementInput);
}
public void OnDash(InputAction.CallbackContext context)
{
if (context.performed)
{
OnDashInputReceived?.Invoke();
}
}
public void OnAttack(InputAction.CallbackContext context)
{
if (context.performed)
{
var device = context.control.device;
bool usedMouse;
switch (device)
{
case Keyboard:
usedMouse = false;
break;
case Mouse:
usedMouse = true;
break;
default:
return;
}
OnAttackInputReceived?.Invoke(usedMouse);
}
}
public void OnActivateMainSkill(InputAction.CallbackContext context)
{
if (context.performed)
{
OnActivateMainSkillInputReceived?.Invoke(null);
2024-06-03 18:26:03 +00:00
}
}
public void OnInteraction(InputAction.CallbackContext context)
{
if (context.performed)
{
_closestInteraction?.Interaction();
}
}
2024-06-03 18:26:03 +00:00
public void OnOpenItemInventory(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
CombatUiManager.Instance.CombatItemInventoryUi.Open();
2024-06-03 18:26:03 +00:00
}
}
public void OnCloseItemInventory(InputAction.CallbackContext context)
{
if (context.performed)
{
if (!CombatUiManager.Instance.CombatItemInventoryUi.gameObject.activeSelf) return;
CombatUiManager.Instance.CombatItemInventoryUi.Close();
}
}
public void OnOpenMenu(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
CombatUiManager.Instance.CombatMenuPopupUi.Open();
2024-06-03 18:26:03 +00:00
}
}
public void OnOpenDevelopMenu(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
CombatUiManager.Instance.DevelopMenuPopupUi.Open();
}
}
public void OnForceKillBoss(InputAction.CallbackContext context)
{
if (context.performed)
{
MapManager.Instance.ForceKillCurrentBoss();
}
}
public void OnHealthPointMax(InputAction.CallbackContext context)
{
if (context.performed)
{
GameManager.Instance.CurrentCombatPlayer.SetCurrentHealthPointMax();
}
}
2024-06-03 18:26:03 +00:00
public void OnCancel(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
PopupUiController.CloseLastPopup();
2024-06-03 18:26:03 +00:00
}
}
public void OnInteractionUi(InputAction.CallbackContext context)
{
if (context.performed)
{
if (CombatUiManager.Instance.CombatTutorialUi.CurrentTutorialState == TutorialState.First)
{
CombatUiManager.Instance.CombatTutorialUi.SecondFirstTutorialUi();
}
else if (CombatUiManager.Instance.CombatTutorialUi.CurrentTutorialState == TutorialState.Second)
{
CombatUiManager.Instance.CombatTutorialUi.EndTutorialUi();
}
}
}
#endregion
// Methods
#region Methods
public void RegisterPlayerInteraction(IPlayerInteraction playerInteraction)
{
Utils.RegisterList(_playerInteractions, playerInteraction);
}
public void UnregisterPlayerInteraction(IPlayerInteraction playerInteraction)
{
Utils.UnregisterList(_playerInteractions, playerInteraction);
}
private IPlayerInteraction GetClosestInteraction()
{
IPlayerInteraction closestInteraction = null;
var closestDistance = float.MaxValue;
foreach (var interaction in _playerInteractions)
{
var distance = Vector3.Distance(transform.position, interaction.CenterTransform.position);
if (distance > InteractionRadius || distance >= closestDistance) continue;
closestDistance = distance;
closestInteraction = interaction;
}
return closestInteraction;
}
#endregion
2024-06-03 18:26:03 +00:00
}
}