feat: 플레이어 행동 상태 통합 및 이상상태 디버그 추가
- PlayerActionState로 이동, 점프, 스킬 입력 가능 여부를 통합 - 기절과 침묵 이상상태 데이터 및 효과 에셋을 추가 - 로컬 플레이어용 이상상태 디버그 HUD와 자동 검증 러너를 추가 - 플레이어 이동, 스킬 입력, 네트워크 상태를 새 행동 상태 기준으로 정리
This commit is contained in:
104
Assets/_Game/Scripts/Player/PlayerActionState.cs
Normal file
104
Assets/_Game/Scripts/Player/PlayerActionState.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using UnityEngine;
|
||||
|
||||
using Colosseum.Abnormalities;
|
||||
using Colosseum.Skills;
|
||||
|
||||
namespace Colosseum.Player
|
||||
{
|
||||
/// <summary>
|
||||
/// 플레이어의 전투 행동 가능 여부를 한 곳에서 판정하는 상태 관리자.
|
||||
/// 이동, 점프, 스킬 사용 가능 여부를 사망/이상 상태/관전/시전 상태와 연동합니다.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public class PlayerActionState : MonoBehaviour
|
||||
{
|
||||
[Header("References")]
|
||||
[Tooltip("플레이어 네트워크 상태")]
|
||||
[SerializeField] private PlayerNetworkController networkController;
|
||||
|
||||
[Tooltip("이상 상태 관리자")]
|
||||
[SerializeField] private AbnormalityManager abnormalityManager;
|
||||
|
||||
[Tooltip("스킬 실행 관리자")]
|
||||
[SerializeField] private SkillController skillController;
|
||||
|
||||
[Tooltip("관전 관리자")]
|
||||
[SerializeField] private PlayerSpectator spectator;
|
||||
|
||||
/// <summary>
|
||||
/// 사망 상태 여부
|
||||
/// </summary>
|
||||
public bool IsDead => networkController != null && networkController.IsDead;
|
||||
|
||||
/// <summary>
|
||||
/// 기절 상태 여부
|
||||
/// </summary>
|
||||
public bool IsStunned => abnormalityManager != null && abnormalityManager.IsStunned;
|
||||
|
||||
/// <summary>
|
||||
/// 침묵 상태 여부
|
||||
/// </summary>
|
||||
public bool IsSilenced => abnormalityManager != null && abnormalityManager.IsSilenced;
|
||||
|
||||
/// <summary>
|
||||
/// 관전 상태 여부
|
||||
/// </summary>
|
||||
public bool IsSpectating => spectator != null && spectator.IsSpectating;
|
||||
|
||||
/// <summary>
|
||||
/// 스킬 애니메이션 재생 중 여부
|
||||
/// </summary>
|
||||
public bool IsCastingSkill => skillController != null && skillController.IsPlayingAnimation;
|
||||
|
||||
/// <summary>
|
||||
/// 입력을 받아도 되는지 여부
|
||||
/// </summary>
|
||||
public bool CanReceiveInput => !IsDead && !IsSpectating;
|
||||
|
||||
/// <summary>
|
||||
/// 플레이어가 직접 이동 입력을 사용할 수 있는지 여부
|
||||
/// </summary>
|
||||
public bool CanMove => CanReceiveInput && !IsStunned && !IsCastingSkill;
|
||||
|
||||
/// <summary>
|
||||
/// 점프 가능 여부
|
||||
/// </summary>
|
||||
public bool CanJump => CanMove;
|
||||
|
||||
/// <summary>
|
||||
/// 스킬 사용 가능 여부
|
||||
/// </summary>
|
||||
public bool CanUseSkills => CanReceiveInput && !IsStunned && !IsSilenced && !IsCastingSkill;
|
||||
|
||||
/// <summary>
|
||||
/// 회피 사용 가능 여부
|
||||
/// </summary>
|
||||
public bool CanEvade => CanUseSkills;
|
||||
|
||||
/// <summary>
|
||||
/// 현재 이동 속도 배율
|
||||
/// </summary>
|
||||
public float MoveSpeedMultiplier
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!CanReceiveInput || IsStunned)
|
||||
return 0f;
|
||||
|
||||
return abnormalityManager != null ? abnormalityManager.MoveSpeedMultiplier : 1f;
|
||||
}
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (networkController == null)
|
||||
networkController = GetComponent<PlayerNetworkController>();
|
||||
if (abnormalityManager == null)
|
||||
abnormalityManager = GetComponent<AbnormalityManager>();
|
||||
if (skillController == null)
|
||||
skillController = GetComponent<SkillController>();
|
||||
if (spectator == null)
|
||||
spectator = GetComponentInChildren<PlayerSpectator>();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user