Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

언리얼/문법

[Unreal5] 블루프린트 FSM, Controller, GameMode

새벽_글쓴이 2024. 11. 22. 15:51
반응형

블루프린트 게임모드

게임의 기본 규칙과 설정을 정의하는 중요한 클래스

기본기능

- 게임의 승리/패배 조건 설정
- 플레이어 리스폰 위치와 방식 관리
- 기본 폰(Pawn) 클래스 지정
- 기본 플레이어 컨트롤러 클래스 지정
- 게임 상태(GameState) 관리

 

주요이벤트

- BeginPlay: 게임모드가 시작될 때 실행
- RestartPlayer: 플레이어 리스폰 시 호출
- StartPlay: 실제 게임플레이 시작 시 호출
- HandleStartingNewPlayer: 새로운 플레이어 참가 시 처리

 

설정방법

 

- 블루프린트 에디터에서 GameMode 클래스를 상속받아 새로운 블루프린트 생성
- World Settings에서 GameMode Override 설정
- Project Settings의 Maps & Modes에서 기본 게임모드 설정

World Settings에서 GameMode Override 설정

1) 월드 아웃라이너(World Outliner)에서 'Settings' 버튼 클릭
2) World Settings 패널 열기
3) 'Game Mode' 섹션 찾기
4) 'GameMode Override' 드롭다운에서 원하는 게임모드 선택

 

특징

 

- 이 방법은 현재 레벨에만 특정 게임모드를 적용할 때 사용
- 다른 레벨에는 영향을 주지 않음
- 레벨별로 다른 게임모드를 사용하고 싶을 때 유용
- Override이므로 Project Settings의 기본 설정보다 우선 적용됨

 

 

Project Settings의 Maps & Modes 설정

1) Edit → Project Settings 메뉴 선택

2) 'Maps & Modes' 카테고리 선택

3) Default Modes 섹션
- Default GameMode: 프로젝트 전체의 기본 게임모드 설정
- Default Pawn Class: 기본 폰 클래스 설정
- Game Instance Class: 게임 인스턴스 클래스 설정

 

특징

- 프로젝트 전체에 적용되는 기본 게임모드 설정
- 특정 레벨에서 Override하지 않는 한 이 설정이 사용됨
- 여러 레벨에서 동일한 게임모드를 사용할 때 효율적
- 프로젝트의 기본 설정으로 작동

 

사용 전략

대부분의 레벨이 같은 게임모드를 사용

Project Settings에서 기본 게임모드 설정
예외적인 레벨만 World Settings에서 Override

 

레벨마다 다른 게임모드가 필요

Project Settings에서 가장 많이 사용되는 게임모드를 기본값으로 설정
각 레벨의 World Settings에서 필요에 따라 Override

 

테스트 시

World Settings의 Override를 임시로 사용하여 특정 게임모드 테스트
테스트 후 원래 설정으로 되돌리기 용이

 

정리

멀티플레이어 게임이나 여러 게임모드를 전환해야 하는 경우에 이러한 설정의 이해가 중요

일반적인 사용 사례

- 점수 시스템 구현
- 플레이어 생성 및 초기화
- 게임 규칙 설정
- 매치 타이머 관리
- 멀티플레이어 게임 규칙 정의

 

게임모드는 프로젝트의 요구사항에 따라 확장하여 사용할 수 있으며, 특히 멀티플레이 게임에서 중요한 역할은 한다

FSM( Finite State Machine, 유한 상태 기계 )

FSM 기본개념

- 시스템이 가질 수 있는 모든 상태를 정의하고, 상태 간의 전환 조건을 명확히 정의한 프로그래밍 모델
- 한 번에 오직 하나의 상태만 가질 수 있음
- 특정 조건이 충족되면 다른 상태로 전환됨

 

FSM 주요 구성 요소

1) 상태(State)
- 시스템이 가질 수 있는 조건이나 상황
- 예: 캐릭터의 Idle, Walk, Run, Jump 등

2) 전환(Transition)
- 한 상태에서 다른 상태로 변경되는 것
- 특정 조건이나 이벤트에 의해 발생

3) 이벤트/조건(Event/Condition)
- 상태 전환을 발생시키는 트리거
- 예: 키 입력, 타이머, 충돌 등

 

FSM 예시

상태

- Idle(대기)
- 진입 조건: 이동 입력 없음
- 행동: 제자리에 서있음
- 전환 가능: Walk, Jump, Attack

- Walk(걷기)
- 진입 조건: 이동 키 입력
- 행동: 걷기 애니메이션 재생, 이동
- 전환 가능: Idle, Run, Jump

- Run(달리기)
- 진입 조건: Walk 상태에서 달리기 키 입력
- 행동: 달리기 애니메이션 재생, 빠른 이동
- 전환 가능: Walk, Jump

- Jump(점프)
- 진입 조건: 점프 키 입력
- 행동: 점프 애니메이션 재생, 수직 이동
- 전환 가능: Idle(착지 시)

 

FSM 실제 활용 예시

AI 행동 패턴

- Patrol(순찰)
→ 적 발견 → Chase(추적)
→ 적 공격 범위 → Attack(공격)
→ 적 시야 벗어남 → Search(수색)
→ 적 미발견 → Return(귀환)
→ 초기 위치 도달 → Patrol(순찰)

 

UI시스템

- MainMenu(메인 메뉴)
→ Play 버튼 → InGame(게임 중)
→ Escape 키 → PauseMenu(일시정지)
→ Resume → InGame
→ Quit → MainMenu

 

FSM 장점

- 코드 구조가 명확하고 이해하기 쉬움
- 디버깅이 용이함 상태와 전환 조건이 명확히 정의됨
- 새로운 상태 추가가 쉬움
- 예측 가능한 동작 보장
- FSM의 실제 활용 예시

 

주의사항

- 상태가 너무 많아지면 관리가 어려워질 수 있음
- 복잡한 조건의 경우 계층적 FSM이나 다른 패턴 고려
- 동시에 여러 상태가 필요한 경우 다른 패턴 검토 필요

 

고급 FSM 개념

1) 계층적 FSM
- 상태 안에 하위 상태를 포함
- 더 복잡한 행동 모델링 가능

2) 병렬 FSM
- 여러 FSM이 동시에 실행
- 예: 상체와 하체 애니메이션 별도 제어

3) 푸시다운 오토마타
- 상태 스택을 사용
- 이전 상태로 돌아가기 가능

 

정리

FSM은 게임 개발에서 매우 유용한 패턴이며, 특히 캐릭터 컨트롤, AI 행동, UI 시스템 등에서 광범위하게 사용된다
또한, 이해하기 쉽고 구현이 직관적이어서 많은 게임 개발자들이 선호하는 패턴이다

 

 

블루프린트에서 FSM 만드는 다양한 방법

1. State Machine Graph (애님 블루프린트)

1) 애니메이션 블루프린트에서 제공하는 내장 State Machine

2) AnimGraph에서 'Add New State Machine' 노드 사용

3) 장점:
- 시각적으로 상태와 전환을 확인 가능
- 애니메이션 전환이 쉬움
- 내장 기능 활용 가능

4) 주로 캐릭터 애니메이션 상태 관리에 사용

 

적합한 상황

- 캐릭터 애니메이션 상태 관리가 주 목적일 때
- 애니메이션 전환이 많고 복잡할 때
- 시각적으로 상태 흐름을 확인해야 할 때

 

예시

- 플레이어 캐릭터 애니메이션
- NPC 동작 애니메이션
- 몬스터 행동 패턴과 애니메이션 연동

 

2. Behavior Tree

1) AI 컨트롤러에서 사용하는 의사결정 시스템

2) Behavior Tree Editor 사용

3) 장점:
- AI 행동 설계에 최적화
- 복잡한 의사결정 로직 구현 가능
- Task, Decorator, Service 등 다양한 노드 제공

4) AI 행동 패턴 구현에 적합

 

적합한 상황

- AI 의사결정 시스템이 필요할 때
- 복잡한 조건과 우선순위가 있는 행동이 필요할 때
- 동적인 의사결정이 필요할 때

 

예시

- 적 AI 구현
- NPC 일상 행동 패턴
- 복잡한 경로찾기와 결정making이 필요한 상황

 

3. Interface + Function 시스템

1) 인터페이스를 통한 상태 관리

2) 구현:
- 각 상태를 인터페이스 함수로 정의
- 상태 전환을 이벤트로 처리

3) 장점:
- 모듈화가 쉬움
- 코드 재사용성 높음
- 유연한 구현 가능

 

적합한 상황

- 코드 재사용성이 중요할 때
- 다양한 객체가 같은 상태 패턴을 공유할 때
- 유연한 확장이 필요할 때

 

예시

- 여러 타입의 적 캐릭터 관리
- 상호작용 가능한 오브젝트 시스템
- 무기나 아이템 시스템

 

4. Data Table + Switch 시스템

1) 데이터 테이블로 상태 정의

2) 구현:
- 상태와 전환 조건을 테이블로 관리
- Switch 노드로 상태 처리

3) 장점:
- 데이터 중심 설계
- 상태 관리가 용이
- 런타임 중 상태 수정 가능

 

적합한 상황

- 기획자가 직접 상태와 조건을 수정해야 할 때
- 많은 상태와 전환 규칙이 있을 때
- 런타임 중 상태 규칙 변경이 필요할 때

 

예시

- RPG 퀘스트 시스템
- 대화 시스템
- 게임 밸런싱이 자주 필요한 시스템

 

5. Event Dispatcher 시스템

1) 이벤트 기반 상태 관리

2) 구현:
- 각 상태를 이벤트로 정의
- Event Dispatcher로 상태 전환 처리

3) 장점:
- 느슨한 결합
- 이벤트 기반 프로그래밍
- 확장성이 좋음

 

적합한 상황

- 느슨한 결합이 필요할 때
- 여러 시스템 간의 통신이 필요할 때
- 이벤트 기반의 게임플레이가 주를 이룰 때

 

예시

- UI 상태 관리
- 성취/업적 시스템
- 게임 이벤트 처리 시스템

 

각 시스템의 특성을 이해하고 적절한 상황에 맞게 선택하는 것이 중요하다

 

블루프린트 컨트롤러 (Controller)

기본 개념

- Pawn/Character를 제어하는 역할
- 입력을 처리하고 Pawn에게 명령을 전달
- AI 로직을 구현하는데 사용

두 가지 주요 타입
1) PlayerController: 플레이어 입력 처리
2) AIController: AI 로직 처리

 

PlayerController의 주요 기능

1) 입력 처리
- Input Action/Axis Mapping 설정
- 키보드, 마우스, 게임패드 입력 관리

2) 폰 소유권(Possession)
- Possess: 폰 제어 시작
- Unpossess: 폰 제어 해제

3) HUD/UI 관리
- Widget 생성 및 표시
- HUD 요소 제어

4) 카메라 제어
- 시점 조절
- 카메라 설정 관리

5) 네트워크 기능
- 서버-클라이언트 통신
- RPC(Remote Procedure Calls) 처리

 

AIController의 주요 기능

1) AI 행동 제어
- Behavior Tree 실행
- Navigation 처리

2) 감지 시스템
- Sight 감지
- Hearing 감지
- AI Perception 시스템

3) 경로찾기
- NavMesh 사용
- 경로 계산 및 이동

 

주요 이벤트와 함수

1) 기본 이벤트
- BeginPlay
- Tick
- OnPossess
- OnUnpossess

2) 입력 관련
- Input Action/Axis Events
- Enable Input
- Disable Input

3) UI 관련
- Create Widget
- Add to Viewport
- Show Mouse Cursor

4) 네트워크 관련
- Server Functions
- Client Functions
- Multicast Functions

 

일반적인 사용 예시

PlayerController

1) 캐릭터 이동 제어
Input Axis "MoveForward"
→ Get Controlled Pawn
→ Add Movement Input

2) 마우스 시점 제어
Input Axis "Turn"
→ Add Controller Yaw Input

3) UI 표시
Create Widget (PauseMenu)
→ Add to Viewport
→ Set Show Mouse Cursor

 

AIController

1) AI 초기화
Begin Play
→ Run Behavior Tree
→ Start AI Perception

2) 타겟 추적
On Target Perceived
→ Move To Actor
→ Rotate To Face Actor

 

일반적인 사용 패턴

플레이어 시스템

- 입력 → Controller → Character → Movement
- UI 요청 → Controller → Widget
- 카메라 제어 → Controller → Camera

 

AI 시스템

- Perception → Controller → Behavior Tree
- Navigation → Controller → Character
- Target Selection → Controller → Blackboard

 

장점

- 깔끔한 코드 구조
- 재사용 가능한 로직
- 효율적인 네트워크 처리
- 유연한 AI 시스템
- 쉬운 디버깅

 

이러한 설명을 읽어봐도 이해가 잘 안가는 부분이 많았기 때문에 더 찾아보았다

Actor나 레벨 블루프린트와 같이 다른 클래스에서 입력과 컨트롤러의 입력 처리 차이점

PlayerController에서 입력 처리

장점
- 멀티플레이어 게임에 적합
- 폰이 파괴되거나 변경되어도 입력 처리 유지
- 네트워크 리플리케이션에 최적화
- 여러 폰을 전환하며 제어 가능
- UI 입력과 게임플레이 입력 관리가 용이
- 보안적으로 더 안전 (클라이언트 권한 관리)

단점
- 구현이 약간 복잡할 수 있음
- 추가적인 참조 설정 필요

 

Actor/Character에서 직접 입력 처리

장점
- 구현이 간단하고 직관적
- 빠른 프로토타이핑에 유용
- 독립적인 기능 구현이 쉬움
- 직접적인 참조로 성능상 이점

단점
- 멀티플레이어 구현이 복잡해짐
- 폰이 파괴되면 입력 처리도 사라짐
- 보안에 취약할 수 있음
- 여러 폰 전환 시 재구현 필요

 

레벨 블루프린트에서 입력 처리

장점
- 빠른 프로토타입 제작
- 레벨 특정 기능 구현이 쉬움
- 단순한 기능 테스트에 유용

단점
- 재사용이 어려움
- 코드 관리가 어려워짐
- 멀티플레이어 지원이 어려움
- 레벨 간 이동 시 재구현 필요

 

실제 사용 예시

PlayerController ( 권장되는 구현 방식 )

PlayerController Blueprint:
1) Input Action "Move"
2) Get Controlled Pawn
3) Cast to Character
4) Add Movement Input

장점:
- 폰이 변경되어도 입력 처리 유지
- 멀티플레이어 지원
- 네트워크 동기화 용이

 

복잡한 게임플레이 시스템을 갖추거나 멀티플레이 게임, 상업용 게임 혹은 보안이 중요한 경우 사용한다

 

Actor/Characte ( 단순한 구현 )

Character Blueprint:
1) Input Action "Move"
2) Add Movement Input

장점:
- 간단한 구현
- 직접적인 응답
단점:
- 제한된 확장성

 

단일 플레이어의 프로토타입이나 간단한 게임 혹은 독립적인 기능 테스트 시에 사용한다

 

레벨 블루프린트 ( 테스트용 구현 )

Level Blueprint:
1) Input Action "Move"
2) Get Player Pawn
3) Add Movement Input

장점:
- 빠른 테스트
단점:
- 유지보수 어려움

 

프로토타입이나 임시 기능 구현할 때 사용한다

 

정리

결론적으로 대부분의 경우 PlayerController를 통한 입력 처리가 권장된다.
다른 클래스의 같은 경우는 개발 초기 빠른 프로토타이핑이나 간단한 테스트 정도에만 사용된다고 볼 수 있다

 

AI Controller와 FSM을 같이 사용했을 때에도 어떻게 사용해야 되는지 잘 이해가 안간다

 

 

AI Controller와 Behavior Tree의 관계

AI Contoroller의 핵심역할

1) Behavior Tree와 AI Pawn을 연결하는 브릿지 역할
2) AI Perception(감지 시스템) 관리
3) Blackboard 데이터 관리
4) Navigation 시스템 연동

 

AI 시스템의 구조

AI Controller

Behavior Tree (행동 결정)

Blackboard (데이터 저장)

AI Pawn/Character (실제 행동 수행)

 

구체적인 예시 - 순찰하는 적 AI

AI Controller 설정

Begin Play Event
1) Run Behavior Tree
2) Initialize AI Perception
3) Get Pawn Reference
4) Initialize Blackboard Values

 

AI Perception 이벤트

On Target Perceived
1) Get Perceived Actor
2) Set Blackboard Value "TargetActor"
3) Set Blackboard Value "LastKnownLocation"

 

AI Controller가 하는 일

1) 감지 시스템 관리
- 시야 감지 설정
- 소리 감지 설정
- 감지된 정보를 Blackboard에 전달

2) 네비게이션 처리
- Move To Location
- Move To Actor
- 경로 찾기 요청

3) Blackboard 데이터 관리
- 타겟 정보 업데이트
- 위치 정보 저장
- 상태 변수 관리

4) Behavior Tree 실행 제어
- 시작/정지
- 조건 확인
- 이벤트 처리

 

실제 구현 예시

AI Controller 클래스

1) 초기화
Begin Play
→ Start AI Perception
→ Run Behavior Tree
→ Initialize Blackboard

2) 타겟 감지
On Perception Updated
→ If Sight Stimulus
→ Set Blackboard Value (TargetActor)
→ Set Blackboard Value (LastSeenLocation)

3) 이동 처리
Move To Actor
→ Use AI Navigation
→ Return Success/Failure to BT

4) 공격 범위 확인
Is In Attack Range
→ Check Distance to Target
→ Return Boolean to BT

 

Behavior Tree와의 연동

Behavior Tree

- 순찰
- 추적
- 공격
- 도망

 

AI Controller

1) 순찰 지점 제공
2) 타겟 감지 및 정보 전달
3) 이동 명령 처리
4) 공격 가능 여부 확인

 

AI Controller와 Behavior Tree 의 협업 예시

AI Controller

1) 플레이어 감지
2) 순찰 경로점 관리
3) 이동 처리
4) 공격 가능 거리 계산

 

Behavior Tree

1) 상태 결정 (순찰/추적/공격)
2) 행동 우선순위 결정
3) 조건 체크
4) 행동 시퀀스 실행

 

정리

AI Controller는 Behavior Tree가 결정한 행동을 실제로 실행한다
쉽게 말해, Behavior Tree가 "생각"하고, AI Controller는 "행동" 한다고 볼 수 있을 것 같다
반응형