using BlueWater.Interfaces; 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 CurrentStateMachine { get; private set; } public IStateMachine IdleStateMachine { get; private set; } public IStateMachine WalkingStateMachine { get; private set; } public IStateMachine ServingIdleStateMachine { get; private set; } public IStateMachine ServingStateMachine { get; private set; } public IStateMachine CleaningFloorStateMachine { get; private set; } public IStateMachine CleaningTableStateMachine { get; private set; } public IStateMachine 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(); CharacterCollider = GetComponent(); PlayerInput = GetComponent(); VisualLook = transform.Find("VisualLook"); SkeletonAnimation = VisualLook.GetComponent(); InteractionCanvas = transform.GetComponentInChildren(); SpineController = GetComponent(); PlayerHealthPoint = GetComponent(); TycoonInput = GetComponent(); TycoonMovement = GetComponent(); TycoonPickupHandler = GetComponent(); var renderer = VisualLook.GetComponent(); renderer.sortingLayerName = "Default"; renderer.sortingOrder = 5; } #endregion // Methods #region Methods private void Die() { // VisualFeedbackManager.Instance.SetBaseTimeScale(0f); } public void TransitionToState(IStateMachine newStateMachine) { CurrentStateMachine.ExitState(this); CurrentStateMachine = newStateMachine; CurrentStateMachine.EnterState(this); } #endregion } }