캐릭터 상태패턴 적용

달봉·2024년 4월 15일

언리얼엔진5

목록 보기
2/12

캐릭터의 움직임 기능을 개발 하던 중 앉기 걷기 공격대기중 달리기 등의 여러 상황에서 상황에 따라 움직이는 속도, 회전할때 몸의 기울기, 회전속도 등 각기 다른 디테일한 움직임을 주기로 결정했습니다.

각 기능들에서 걷기가 아닐때 공격대기중이 아닐때 등으로 처리하면 당장은 쉽지만
기능들이 커지고 다양해지면 각각 상태에 따른 조건이 얽히고 설켜서 ifelse 지옥이 펼쳐질 수 있습니다..

이때 상태 패턴(State Pattern)을 적용하면 이런 문제점을 어느정도 미연에 방지할 수 있습니다.

상태 패턴 ( State Pattern )

  • 상태 패턴을 적용하지 않았을때
  • 상태 패턴을 적용했을 때

상태 패턴 적용

간단하게 적용해보면 현재 상태에 따라 각기 다른 기능을 사용하도록 분리시킬 수 있습니다

class Player(){
	State PlayerState;
    
    void Move() {
    	switch(State)
        {
        case Idle : IdleMove();
        break;
        case Run : RunMove();
        break;
        }
    }
}

하지만 본래 취지에 맞게 사용자가 if나 switch문 없이 직관적으로 동작하도록 상속에 따른 기능 캡슐화를 도입할 수 있습니다

class Player(){
	State* pPlayerState;
    
    void Move() {
    	pPlayerState->Move();
    }
}

이런 경우 인터페이스 혹은 추상클래스로 State를 만들어두고 그 클래스를 상속받는 형태의 기능들을 만들어서 구현할 수 있습니다

class State(){
	virtual void Move() = 0;
}

class IdleState() : public State {
	void Move() override { IdleMove기능 }
}

class RunState() : public State {
	void Move() override { RunMove기능;}
}

  • 현재 상태에 따라 바뀐 이동기능

+덤

해당 상태들은 소유권을 여러명이 갖고 있을 필요가 없으니 관리할 컨트롤러에서 unique_ptr을 사용하여 생성하면 자원 관리에 도움이 될 수 있습니다.

상태 변경 시 상태 진입, 탈출 함수를 만들어두고 탈출->변경->진입 하도록 작성하면 상태 변경마다 작동하는 기능을 도입할 수 있습니다.

profile
개발 블로그

0개의 댓글