State 패턴이란?
적용 사례
상태 기반 설계의 원칙
로밍 → 피격 → 추적 → 벗어남 → 돌아감상태와 입력 함수 분리
상태 변화 함수 작성
SetState 함수로 상태를 변경하고, 그에 따른 초기화 작업 수행.FSM(Finite State Machine)
enum으로 정의:enum class PlayerState
{
Idle, // 대기 상태
Move, // 이동 상태
Skill, // 스킬 사용 상태
JumpFall // 점프 상태
};
Idle, Move, Skill, JumpFall과 같은 명확한 상태 구분.SetState)void Player::SetState(PlayerState state)
{
if (_state == state)
{
return; // 이미 동일한 상태면 무시
}
_state = state; // 상태 변경
}
Tick)void Player::Tick()
{
Super::Tick();
switch (_state)
{
case PlayerState::Idle:
TickIdle();
break;
case PlayerState::Move:
TickMove();
break;
case PlayerState::Skill:
TickSkill();
break;
}
}
PlayerState::Idle → TickIdle() 호출.PlayerState::Move → TickMove() 호출.void Player::TickIdle()
{
// Idle 상태의 동작 정의
}
void Player::TickMove()
{
// Move 상태의 동작 정의
}
void Player::TickSkill()
{
// Skill 상태의 동작 정의
}
void Player::OnComponentBeginOverlap(Collider* collider, Collider* other)
{
BoxCollider* b1 = dynamic_cast<BoxCollider*>(collider);
BoxCollider* b2 = dynamic_cast<BoxCollider*>(other);
if (b1 == nullptr || b2 == nullptr)
{
return;
}
AdjustCollisionPos(b1, b2);
if (b2->GetCollisionLayer() == CLT_GROUND)
{
_state = PlayerState::Move; // 바닥에 닿으면 이동 상태로 변경
}
}
CLT_GROUND)이면 Move 상태로 전환.void Player::Jump()
{
if (_state == PlayerState::JumpFall)
{
return; // 이미 점프 중이면 무시
}
_state = PlayerState::JumpFall; // 상태 변경
_speed.y = -500; // 위로 가속도 부여
}
JumpFall)일 경우 중복 호출 방지.JumpFall로 변경 후 속도 변경.