Files
Colosseum/Assets/_Game/Scripts/Player/PlayerActionState.cs
dal4segno e863d108da feat: 플레이어 행동 상태 통합 및 이상상태 디버그 추가
- PlayerActionState로 이동, 점프, 스킬 입력 가능 여부를 통합
- 기절과 침묵 이상상태 데이터 및 효과 에셋을 추가
- 로컬 플레이어용 이상상태 디버그 HUD와 자동 검증 러너를 추가
- 플레이어 이동, 스킬 입력, 네트워크 상태를 새 행동 상태 기준으로 정리
2026-03-19 18:21:39 +09:00

105 lines
3.4 KiB
C#

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>();
}
}
}