using BehaviorDesigner.Runtime; using BlueWater.Enemies; using BlueWater.Players; using BlueWater.Players.Tycoons; using Pathfinding; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Npcs.Customers { public class Customer : MonoBehaviour { // Variables #region Variables // Components [field: SerializeField] public Rigidbody Rigidbody { get; private set; } [field: SerializeField] public CapsuleCollider CharacterCollider { get; private set; } [field: SerializeField] public BehaviorTree BehaviorTree { get; private set; } [field: SerializeField] public Transform VisualLook { get; private set; } [field: SerializeField] public MeshRenderer MeshRenderer { get; private set; } // Classes [field: SerializeField, Required] public SpineController SpineController { get; private set; } [field: SerializeField, Required] public AiMovement AIMovement { get; private set; } [field: SerializeField] public FoodBalloonUi FoodBalloonUi { get; private set; } private IAstarAI _astarAi; public TableSeat TableSeat { get; private set; } private bool _isMoving; public bool IsMoving { get => _isMoving; set { if (_isMoving == value) return; _isMoving = value; SpineController.PlayAnimation(_isMoving ? TycoonPlayerSpineAnimation.run.ToString() : TycoonPlayerSpineAnimation.idle.ToString(), true); } } private Vector3 _currentDirection = Vector3.right; public Vector3 CurrentDirection { get => _currentDirection; set { if (value == Vector3.zero) return; _currentDirection = value; } } private bool _isQuitting; #endregion // Unity events #region Unity events private void Awake() { InitializeComponents(); } private void OnApplicationQuit() { _isQuitting = true; } private void Update() { HandleMovement(); FlipVisualLook(); } private void OnDestroy() { if (_isQuitting) return; RestaurantManager.Instance.CustomerManager.UnregisterCustomer(this); } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] protected virtual void InitializeComponents() { Rigidbody = GetComponent(); CharacterCollider = GetComponent(); BehaviorTree = GetComponent(); VisualLook = transform.Find("VisualLook"); MeshRenderer = VisualLook.GetComponent(); SpineController = GetComponent(); AIMovement = GetComponent(); _astarAi = GetComponent(); } public void Initialize() { BehaviorTree.EnableBehavior(); } #endregion // Methods #region Methods private void HandleMovement() { if (!_astarAi.canMove || _astarAi.isStopped) { IsMoving = false; return; } CurrentDirection = _astarAi.velocity.normalized; IsMoving = _astarAi.velocity != Vector3.zero || _astarAi.velocity != Vector3.positiveInfinity; } private void FlipVisualLook() { var localScale = VisualLook.localScale; localScale.x = CurrentDirection.x switch { > 0.01f => -Mathf.Abs(localScale.x), < -0.01f => Mathf.Abs(localScale.x), _ => localScale.x }; VisualLook.localScale = localScale; } public void SetFoodBalloonUi(FoodBalloonUi foodBalloonUi) => FoodBalloonUi = foodBalloonUi; public void SetTableSeat(TableSeat tableSeat) => TableSeat = tableSeat; public void SetCurrentDirection(Vector3 normalDirection) => CurrentDirection = normalDirection; public void SetTableSeatPositionAndDirection() { transform.position = TableSeat.SeatTransform.position; SetCurrentDirection(TableSeat.TableDirection); } #endregion } }