Degulleo3D/Assets/JAY/Scripts/PlayerController.cs
2025-04-18 13:17:30 +09:00

106 lines
2.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlayerState { None, Idle, Move, Attack, Hit, Dead }
public class PlayerController : CharacterBase
{
// 외부 접근 가능 변수
[Header("Movement")]
[SerializeField] private float rotationSpeed = 10f;
[Header("Attach Points")]
[SerializeField] private Transform rightHandTransform;
[SerializeField] private Transform headTransform;
// 내부에서만 사용하는 변수
private CharacterController _characterController;
private bool _isBattle;
private GameObject weapon;
// 상태 관련
private PlayerStateIdle _playerStateIdle;
private PlayerStateMove _playerStateMove;
// 외부에서도 사용하는 변수
public VariableJoystick joystick { get; private set; }
public PlayerState CurrentState { get; private set; }
private Dictionary<PlayerState, IPlayerState> _playerStates;
public Animator PlayerAnimator { get; private set; }
public CharacterController CharacterController => _characterController;
private void Awake()
{
PlayerAnimator = GetComponent<Animator>();
_characterController = GetComponent<CharacterController>();
if (joystick == null)
{
joystick = FindObjectOfType<VariableJoystick>();
}
}
private void Start()
{
// 상태 초기화
_playerStateIdle = new PlayerStateIdle();
_playerStateMove = new PlayerStateMove();
_playerStates = new Dictionary<PlayerState, IPlayerState>
{
{ PlayerState.Idle, _playerStateIdle },
{ PlayerState.Move, _playerStateMove },
};
PlayerInit();
}
private void Update()
{
if (CurrentState != PlayerState.None)
{
_playerStates[CurrentState].Update();
}
}
#region
private void PlayerInit()
{
SetState(PlayerState.Idle);
InstantiateWeapon();
weapon.SetActive(_isBattle);
}
private void InstantiateWeapon()
{
if (weapon == null)
{
GameObject weaponObject = Resources.Load<GameObject>("Player/Weapon/Chopstick");
weapon = Instantiate(weaponObject, rightHandTransform);
// .GetComponent<WeaponController>();
}
}
#endregion
public void SetState(PlayerState state)
{
if (CurrentState != PlayerState.None)
{
_playerStates[CurrentState].Exit();
}
CurrentState = state;
_playerStates[CurrentState].Enter(this);
}
public void SwitchBattleMode()
{
_isBattle = !_isBattle;
weapon.SetActive(_isBattle);
}
}