본문 바로가기
카테고리 없음

장르에 따른 플레이어 코드 분류(feat.Game Programming Patterns)

by mazayong 2025. 4. 13.

유니티 플레이어 코드를 설계하는데 고민이 있어서, 찾아본 내용을 간단하게 정리해놓으려고 한다.

레퍼런스는 Game Programming Patterns, Unity 공식 튜토리얼 등이고, 목차는 아래와 같다.

 

0. 게임 장르별로 플레이어 코드 패턴을 다르게 선택하는 이유

1. 액션 게임

2. 퍼즐 게임

3. RPG 게임

4. FPS 게임

5. 후기

 

 

 

0. 게임 장르별로 플레이어 코드 패턴을 다르게 선택하는 이유

간단하게 생각했을 때는 게임 장르별로 플레이어에게 요구되는 기능이 다르기 때문이다. 즉, 게임 장르마다 요구하는 플레이어 경험, 시스템 구조, 동작의 복잡도가 다르기 때문이다. 해당 부분을 구체화해서 생각하면 아래와 같다.

 

* 게임 플레이 경험

- 액션 : 실시간 반응, 정밀한 입력, 상태 전이

- 퍼즐 : 논리적 사고, 예측 가능성, 이전 상태로 되돌리기

- RPG : 다양한 조합, 선택, 성장

- FPS : 빠른 반응, 실시간 UI, 에임 정확성

 

이와 같이 플레이 경험이 다르기 때문에 플레이어의 행동 구조, 상태 전이 과정이 다르다.

* 플레이어의 행동 구조

- 액션 : 기본 이동과 점프, 빠른 공격 연계(예시 : 콤보 시스템, 회피와 패링 등 입력 타이밍 민감

- 퍼즐 : 티일 기반 이동, 오브젝트와의 상호작용, Undo/Redo 기능 필수

- RPG : 다양한 전략 기반의 스킬 존재, 평상시 이동하다 전투 진입 후 스킬 선택, 그 외 퀘스트 등 다양한 요소 존재.

- FPS : UI와 실시간 연동, 이동 & 점프 & 조준 & 사격 & 재장전 & 능력 사용

 

* 플레이어의 상태 전이

- 액션 : 빠르고 프레임 단위로 처리, 행동 중 캔슬 가능 여부가 중요, 다양한 상태 간 연결 필요

- 퍼즐 : 실시간 처리가 아닌 입력에 의한 처리로만 반응, Undo가 존재.

- RPG : 상태간 전이는 비동기적, 행동 구조는 전략 선택 기반, 다양한 스킬과 무기와 스탯이 추가되므로 유연한 구조 필요

- FPS : 대부분 비상태 기반으로 입력 기반 처리, UI나 외부 시스템은 이벤트로 통신 필요.

 

1. 액션 게임

액션 게임은 플레이어가 다양한 상태를 갖고 있고, 해당 상태들로 전이가 이루어진다. 그리고 입력시 실시간으로 캐릭터의 행동이 반영되어야 하고, 상태 간 상호작용이 유동적으로 이루어져야 한다. 또한 상태 전환과 애니메이션의 동기화가 이루어져 전환시 애니메이션 타이밍이 잘 맞게 실행되어야 한다.

즉, 플레이어의 상태와 입력 타이밍을 잘 제어하는 패턴이어야 하는 것이다.

 

해당 조건을 충족하기 위해 사용하는 패턴들은 아래와 같다.

* 상태 패턴

- 플레이어의 상태별 로직을 클래스화해서 관리해 책임을 분리시키고, 확장성을 높이기 위해서이다.

 

* 커맨드 패턴

- 액션 게임에서 입력과 행동을 분리하고, 입력 기록을 저장하거나 재생, 취소하기 위해서이다.

(콤보 기록, 리플레이 시스템 등)

 

* 전략 패턴

- 플레이어의 상태나 무기에 따라 플레이어의 행동이 바뀌기 때문에 플레이어 로직을 유연하게 적용하기 위해서이다.

 

* 옵저버 패턴

- 플레이어의 상태 변화에 따라 UI, 이팩트, 사운드 등에 알림을 보내기 위해서이다.

(느슨한 연결을 통해 서로 독립적이고 기능들 분리해서 사용하기 용이하다.)

 

 

2. 퍼즐 게임

퍼즐 게임은 오브젝트 간 조건부 상호작용, Undo와 Redo, 논리적 퍼즐 구성이 중요하다.

그러므로 행동을 저장하고 되돌리는 시스템, 오브젝트 간 상호작용 구조, 속성 기반 오브젝트 조합을 구현하기 좋은 패턴을 이용해야 한다.

 

해당 조건을 충족하기 위해 사용되는 패턴은 아래와 같다.

 

* 커맨드 패턴

- 퍼즐에서 플레이어의 행동을 기록하고, Undo / Redo를 실행하기 위해 행동 자체를 객체로 기록해야 하기 때문이다.

- 다양한 커맨드를 일관된 방식으로 처리하기 용이하다.

 

* 이벤트 패턴 / 옵저버 패턴

- 오브젝트간 상호작용이 상황에 따라 다르게 일어나고, 다양한 상호작용이 존재하기 때문에 느슨하게 연결해야 한다.

- 오브젝트 간 직접 참조 없이 트리거 -> 반응 구조를 구현 가능하다.

 

* 컴포지션

- 여러 속성(Hot, Cold, Meltable..etc) 등을 조합해서 구성되는 경우가 많은데, 기능 단위로 조립해서 조합의 개수를 다양하게 구현하기 위해서이다.

- 기능 조합이 쉽고, 재사용성과 테스트가 용이하다.

 

* 상태 패턴(선택적)

- 다양한 상태를 가질 경우 선택적으로 사용하기도 하지만, 선택적으로 상황에 맞게 사용하면 된다.

 

3. RPG 게임

RPG는 단순한 플레이어 이동 뿐만 아니라 다양한 전투 방식, 능력치/성장 시스템, 장비와 스킬 시스템, 상태이상과 버프/디버프, 무기와 스킬 조합 등 조건 기반 로직과 같이 다양한 기능들이 적용될 수 있다.

그러므로 다양한 동작을 유연하게 바꾸고 확장할 수 있는 구조가 중요하다.

 

해당 조건을 충족하기 위해 사용되는 패턴은 아래와 같다.

 

* 전략 패턴

- 플레이어의 공격 방식, 스킬 방식이 동적으로 바뀌어야 하기 때문이다.

- 새로운 공격 방식 추가가 쉽고, 무기/스킬 시스템과 연동이 쉽다.

 

* 팩토리 패턴

- 수많은 스킬/아이템/몬스터 등을 만들어야 하지만, 매번 생성하기 비효율적이기 때문이다.

 

* 컴포지션/모듈식 시스템

- 플레이어에게 적용되는 효과/장비/버프 등이 유동적으로 차이가 있으므로 유연하게 구현해야 하기 때문이다.

- 컴포넌트를 동적으로 붙이거나 제거함으로써 캐릭터에게 다양한 효과 적용이 용이하다.

 

* 상태 패턴

- 플레이어가 다양한 상태로 전환이 자주 일어나기 때문이다. (턴제 RPG, 스토리 RPG 등에서 중요하다.)

 

* 옵저버 패턴/이벤트 시스템

- 이벤트가 발생할 경우 사운드, UI, 이펙트 같은 여러 효과들이 동시에 일어나기 때문에 해당 효과들을 느슨하게 연결하기 위해서이다. 

 

 

 

4. FPS 게임

FPS는 빠른 입력 반응, 조준 시스템, 무기 교체와 사용 시스템, 애니메이션/리로드 처리, 체력/탄약/피격 효과 등이 실시간으로 연동되는 특징이 있다. 

그러므로 실시간 반응, 빠른 조작, 다양한 시스템 간 연동을 구현하기 좋은 패턴을 사용해야 한다.

 

해당 조건을 충족하기 위해 사용하는 패턴은 아래와 같다.

 

* 옵저버 패턴

- 체력 변화, 탄약 수 등 상태가 바뀌면 효과들이 즉시 반응해야 하기 때문이다.

 

* 전략 패턴

- 무기마다 특성이 전부 다르기 때문에 무기별로 전략을 추상화해서 플레이어가 전략을 교체하는 방식으로 관리하는 것이 효율적이기 때문이다.

 

* 상태 패턴

- 플레이어가 사격 중, 리로드 중, 죽은 상태 등 다양한 상태를 갖는데, 각 상태마다 허용되는 입력, 애니메이션이 다르기 때문이다.

 

* 입력 추상화 / 커맨드 패턴(선택적)

- 다양한 입력기기를 지원하는 경우 또는 입력->행동 간 지연, 조건 처리가 필요할 수 있기 때문이다.

(Input System을 사용해도 좋다.)

 

 

5. 후기

디자인 패턴을 어떤 걸 써야 할지에 대해 개념이 명확하지 않았는데 게임별 중요시하는 포인트를 다시 정리하고, 그에 맞는 구현 방법을 다시 고민해본 기회가 되었다. 그리고 전체적으로 기능을 독립적으로 연결하고, 의존성을 낮추기 위해 옵저버 패턴이 전반적인 게임에서 사용되는 것이 인상적이었다.