CapersProject/Assets/02.Scripts/Character/Npc/Customer.cs
Nam Tae Gun 87aa509cfc #7, #8 타이쿤 손님 테이블 상호작용 및 손님 Ai 추가
+ ItemTable excel, json, so 수정
+ 손님 추가 -> 빈 자리 찾기 -> 음료 주문 -> 퇴장 구현
+ 일부 BehaviorTree Action 변경
2024-06-19 03:16:19 +09:00

168 lines
4.7 KiB
C#

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<Rigidbody>();
CharacterCollider = GetComponent<CapsuleCollider>();
BehaviorTree = GetComponent<BehaviorTree>();
VisualLook = transform.Find("VisualLook");
MeshRenderer = VisualLook.GetComponent<MeshRenderer>();
SpineController = GetComponent<SpineController>();
AIMovement = GetComponent<AiMovement>();
_astarAi = GetComponent<IAstarAI>();
}
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
}
}