CapersProject/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs
2024-10-28 18:10:34 +09:00

177 lines
6.4 KiB
C#

using BlueWater.Interfaces;
using BlueWater.Tycoons;
using BlueWater.Uis;
using Sirenix.OdinInspector;
using Spine.Unity;
using UnityEngine;
using UnityEngine.InputSystem;
namespace BlueWater.Players.Tycoons
{
public static class TycoonPlayerSpineAnimation
{
public const string Idle = "Idle";
public const string Walking = "Run";
public const string ServingIdle = "ServingIdle";
public const string Serving = "Serving";
public const string CleaningFloor = "CleaningFloor";
public const string CleaningTable = "CleaningTable";
public const string MakingCocktail = "BeerMaker";
}
[DefaultExecutionOrder(-1)]
public class TycoonPlayer : MonoBehaviour
{
// Variables
#region Variables
// Components
[field: SerializeField]
public Rigidbody Rigidbody { get; private set; }
[field: SerializeField]
public CapsuleCollider CharacterCollider { get; private set; }
[field: SerializeField]
public PlayerInput PlayerInput { get; private set; }
[field: SerializeField]
public Transform VisualLook { get; private set; }
[field: SerializeField]
public SkeletonAnimation SkeletonAnimation { get; private set; }
[field: SerializeField]
public InteractionCanvas InteractionCanvas { get; private set; }
[field: SerializeField]
public SpineController SpineController { get; private set; }
[field: SerializeField]
public PlayerHealthPoint PlayerHealthPoint { get; private set; }
[field: SerializeField]
public TycoonInput TycoonInput { get; private set; }
[field: SerializeField]
public TycoonMovement TycoonMovement { get; private set; }
[field: SerializeField]
public TycoonPickupHandler TycoonPickupHandler { get; private set; }
public bool IsCleaningFloor { get; set; }
public bool IsCleaningTable { get; set; }
public bool IsMakingCocktail { get; set; }
// State
public IStateMachine<TycoonPlayer> CurrentStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> IdleStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> WalkingStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> ServingIdleStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> ServingStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> CleaningFloorStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> CleaningTableStateMachine { get; private set; }
public IStateMachine<TycoonPlayer> MakingCocktailStateMachine { get; private set; }
#endregion
// Unity events
#region Unity events
private void Awake()
{
InitializeComponents();
if (!GameManager.Instance.CurrentTycoonPlayer)
{
GameManager.Instance.SetCurrentTycoonPlayer(this);
}
}
private void Start()
{
TycoonInput.OnMoveInputReceived += TycoonMovement.HandleInputMovement;
EventManager.OnDead += Die;
var balloonUi = InteractionCanvas.BalloonUi;
EventManager.OnCocktailStarted += balloonUi.PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted += balloonUi.SetItemImage;
EventManager.OnCocktailDiscarded += balloonUi.DiscardItem;
EventManager.OnCocktailServedToCustomer += balloonUi.GiveItem;
IdleStateMachine = new IdleStateMachine();
WalkingStateMachine = new WalkingStateMachine();
ServingIdleStateMachine = new ServingIdleStateMachine();
ServingStateMachine = new ServingStateMachine();
CleaningFloorStateMachine = new CleaningFloorStateMachine();
CleaningTableStateMachine = new CleaningTableStateMachine();
MakingCocktailStateMachine = new MakingCocktailStateMachine();
CurrentStateMachine = IdleStateMachine;
CurrentStateMachine.EnterState(this);
}
private void Update()
{
CurrentStateMachine.UpdateState(this);
}
private void OnDestroy()
{
TycoonInput.OnMoveInputReceived -= TycoonMovement.HandleInputMovement;
EventManager.OnDead -= Die;
var balloonUi = InteractionCanvas.BalloonUi;
EventManager.OnCocktailStarted -= balloonUi.PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted -= balloonUi.SetItemImage;
EventManager.OnCocktailDiscarded -= balloonUi.DiscardItem;
EventManager.OnCocktailServedToCustomer -= balloonUi.GiveItem;
}
#endregion
// Initialize methods
#region Initialize methods
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
Rigidbody = GetComponent<Rigidbody>();
CharacterCollider = GetComponent<CapsuleCollider>();
PlayerInput = GetComponent<PlayerInput>();
VisualLook = transform.Find("VisualLook");
SkeletonAnimation = VisualLook.GetComponent<SkeletonAnimation>();
InteractionCanvas = transform.GetComponentInChildren<InteractionCanvas>();
SpineController = GetComponent<SpineController>();
PlayerHealthPoint = GetComponent<PlayerHealthPoint>();
TycoonInput = GetComponent<TycoonInput>();
TycoonMovement = GetComponent<TycoonMovement>();
TycoonPickupHandler = GetComponent<TycoonPickupHandler>();
var renderer = VisualLook.GetComponent<Renderer>();
renderer.sortingLayerName = "Default";
renderer.sortingOrder = 5;
}
#endregion
// Methods
#region Methods
private void Die()
{
var saveGold = TycoonManager.Instance.TycoonStatus.CurrentGold / 2;
ES3.Save("Gold", saveGold);
}
public void TransitionToState(IStateMachine<TycoonPlayer> newStateMachine)
{
CurrentStateMachine.ExitState(this);
CurrentStateMachine = newStateMachine;
CurrentStateMachine.EnterState(this);
}
#endregion
}
}