CapersProject/Assets/02.Scripts/Character/Player/Tycoon/TycoonInput.cs

195 lines
5.6 KiB
C#
Raw Normal View History

using System;
2024-10-29 06:45:18 +00:00
using System.Collections;
using System.Collections.Generic;
using BlueWater.Interfaces;
2024-08-14 10:52:35 +00:00
using BlueWater.Tycoons;
using BlueWater.Uis;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
namespace BlueWater.Players.Tycoons
{
public class TycoonInput : MonoBehaviour
{
// variables
#region variables
// Components
[SerializeField]
private PlayerInput _playerInput;
private List<IPlayerInteraction> _playerInteractions = new();
private IPlayerInteraction _closestInteraction;
private IPlayerInteraction _previousInteraction;
// Events
public event Action<Vector2> OnMoveInputReceived;
#endregion
#region Unity events
private void Awake()
{
InitializeComponents();
}
private void Start()
{
2024-10-29 06:45:18 +00:00
StartCoroutine(nameof(Initialize));
}
private void Update()
{
_closestInteraction = GetClosestInteraction();
if (_closestInteraction != null)
{
_closestInteraction.ShowInteractionUi();
if (_previousInteraction != null && _closestInteraction != _previousInteraction)
{
_previousInteraction.HideInteractionUi();
}
_previousInteraction = _closestInteraction;
}
else
{
_previousInteraction?.CancelInteraction();
_previousInteraction?.HideInteractionUi();
_previousInteraction = null;
}
}
#endregion
// Initialize methods
#region Initialize methods
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
_playerInput = GetComponent<PlayerInput>();
}
2024-10-29 06:45:18 +00:00
private IEnumerator Initialize()
{
PlayerInputKeyManager.Instance.SetCurrentPlayerInput(_playerInput);
2024-10-29 06:45:18 +00:00
yield return new WaitUntil(() => _playerInput.IsInitialized());
PlayerInputKeyManager.Instance.DisableAllActionMaps();
PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.Tycoon);
2024-10-29 06:45:18 +00:00
EventManager.InvokeInitializedPlayerInput();
}
#endregion
// Player input methods
#region Player input methods
// Tycoon
public void OnMove(InputAction.CallbackContext context)
{
var movementInput = context.ReadValue<Vector2>();
OnMoveInputReceived?.Invoke(movementInput);
}
public void OnInteraction(InputAction.CallbackContext context)
{
if (context.performed)
{
_closestInteraction?.Interaction();
}
2024-09-09 12:27:15 +00:00
else if (context.canceled)
{
_closestInteraction?.CancelInteraction();
}
}
public void OnDevelopKey01(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-22 12:41:31 +00:00
EventManager.InvokeCreateServerCrew();
EventManager.InvokeCreateCleanerCrew();
EventManager.InvokeCreateBartenderCrew();
}
}
2024-10-28 09:09:18 +00:00
public void OnManual(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
TycoonUiManager.Instance.ManualBook.Open();
2024-10-28 09:09:18 +00:00
}
}
// TycoonUi
public void OnCancel(InputAction.CallbackContext context)
{
if (context.performed)
{
2024-10-29 06:45:18 +00:00
PopupUiController.CloseLastPopup();
}
}
2024-10-28 09:09:18 +00:00
public void OnCancelManual(InputAction.CallbackContext context)
{
if (context.performed)
{
TycoonUiManager.Instance.ManualBook.Close();
}
}
2024-08-14 10:52:35 +00:00
// Bar
public void OnPour(InputAction.CallbackContext context)
{
var bar = FindAnyObjectByType<Bar>();
if (!bar) return;
if (context.performed)
{
bar.ActiveIsPouring();
}
else if (context.canceled)
{
bar.InActiveIsPouring();
}
}
#endregion
#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)
{
if (!interaction.CanInteraction()) continue;
var distance = Vector3.Distance(transform.position, interaction.CenterTransform.position);
if (distance > interaction.InteractionRadius || distance >= closestDistance) continue;
closestDistance = distance;
closestInteraction = interaction;
}
return closestInteraction;
}
#endregion
}
}