득이공간

[언리얼 게임 프레임웍의 이해] 1장. 게임 콘텐츠의 기본 구조 본문

GP/UE5

[언리얼 게임 프레임웍의 이해] 1장. 게임 콘텐츠의 기본 구조

쟁득 2024. 2. 6. 21:33
해당 게시물은 이득우 교수님의 '언리얼 게임 프레임웍의 이해' 강의를 수강하며
학습한 내용을 개인적으로 정리한 글입니다.

📌 목차 - 1장. 게임 콘텐츠의 기본 구조

1-1. 언리얼 엔진 게임 제작 기초
1-2. 캐릭터와 입력 시스템
1-3. 캐릭터 컨트롤 설정


📌 1-1. 언리얼 엔진 게임 제작 기초

1. 게임 콘텐츠 구조의 이해
2. 게임 프레임웍의 구성 요소 살펴보기
3. 단순한 게임 구조에서 출발해 점점 복잡한 게임으로 확장하는 제작 과정을 이해
4. C++ 프로젝트 구성을 위한 기본 설정
5. 게임 구성 요소를 폴더별로 분류하고, 헤더 참조를 최소화하는 규칙 수립

 

* 이번 강의에서 다룬 게임 프레임웍 기능
- 게임: 월드, 모드
- 기믹: 트리거, 스폰
- 플레이어: 입력, 카메라, HUD
- 폰: 이동, 모션

* 게임 프레임웍 (Gameplay Framework)
- 게임: 월드, 모드, 상태
- 기믹: 트리거, 스폰, 물리
- 플레이어: 입력, 카메라, HUD, 상태
- 폰: 이동, 모션, 액션, 위젯
- 데이터: 애셋, 테이블, 설정, 저장
- 인공지능: 길찾기, BT

* 게임 월드의 역할
- 게임 콘텐츠를 담는 공간 (Transform)
- 게임 콘텐츠의 진행 (Tick)
- 게임 흐름을 위한 시간 (Time)
- 기본 환경 설정 (World Setting)
- 월드의 단위 구성 요소 (Actor)

* 게임 모드의 역할
- 플레이어 입장 관리
- 게임의 최종 승패 관리
- 게임의 규칙 관리
- 게임 데이터 검증 (멀티플레이어 게임)

* 기믹의 역할
- 월드 내 사물과 상호 작용을 수행
- 지정된 조건을 만족하면 이벤트를 발생
- 월드에 물체를 스폰(Spawn)시킬 수 있음

* 플레이어의 역할
- 게임에 입장한 사용자와의 1:1 대응
- 사용자의 현재 상태 및 데이터를 관리
- 사용자 입력의 1차 처리 (필요시)
- 사용자 화면에 대응하는 카메라 관리
- 사용자 화면에 나타나는 HUD UI 관리

* 폰의 역할
- 빙의(Possess)를 통해 플레이어와 연결
- 사용자 입력의 실제 처리
- 사용자 화면에 대응되는 카메라 설정
- 기믹과의 상호작용
- 현재 상태에 적합한 애니메이션 재생

* 게임의 제작 과정
1. 게임 월드 설정과 게임 모드 생성
2. 플레이어 폰의 입출력 및 모션 설정
3. 캐릭터에 반응하는 기믹 설계
4. 게임 데이터와 NPC 인공 지능
5. UI 연동 및 게임 제작 마무리

* 프로젝트 소스코드 폴더 규칙
- Game: 게임 모드와 게임 설정에 관련된 클래스
- Gimmick: 기믹 배경 물체에 관련된 클래스
- Player: 플레이어에 관련된 클래스
- Input: 플레이어 입력에 관련된 클래스
- Character: 기본 캐릭터와 PC 및 NPC에 관련된 클래스
- Action: 캐릭터 액션에 관련된 클래스
- Item: 캐릭터 아이템에 관련된 클래스
- Stat: 캐릭터 스탯에 관련된 클래스
- AI: NPC 인공지능에 관련된 클래스
- UI: UI에 관련된 클래스
- Physics: 물리 충돌체 설정에 관련된 전처리기
- Interface: 인터페이스 클래스를 모아둔 폴더

* 클래스 생성 규칙
- 모든 클래스는 PN(ProjectName의 약자)의 접두사로 시작함
- 폴더마다 다른 폴더와의 의존성을 최소화
- 다른 폴더의 클래스에 접근할 때 가급적 인터페이스를 통해 접근
- 헤더 경로를 찾기 쉽도록 모듈.Build.cs 파일에 모듈의 폴더를 인클루드 경로에 설정
// PublicIncludePaths.AddRange(new string[]{"모듈이름"}); 추가


📌 1-2. 캐릭터와 입력 시스템

1. 액터와 컴포넌트 개념의 이해
2. 컴포넌트 속성에 지정자를 추가해 블루프린트로 확장하는 방법의 이해
3. 폰과 캐릭터를 구성하는 3대 구성 요소
4. 언리얼 5.1에서 추가된 향상된 입력 시스템의 사용 방법

 

* 이번 강의에서 다룬 게임 프레임웍 기능
- 플레이어: 입력
- 폰

* 액터의 구조
- 월드에 속한 콘텐츠의 기본 단위
- 트랜스폼 보유, 월드로부터 틱, 시간 서비스 제공받음
- 컴포넌트를 감싸는 포장 박스
- 루트 컴포넌트의 트랜스폼 = 액터의 트랜스폼

* C++ 액터에서 컴포넌트 생성
- UPROPERTY 설정, TobjectPtr 선언
- 컴포넌트 등록: CDO에서 생성시 자동등록, NewObject로 생성시 등록절차(RegisterComponent함수)필수다. 등록된 컴포넌트는 월드 기능 사용 가능, 물리&렌더링 처리에 합류한다.
- 컴포넌트 확장 설계: 에디터 편집 or 블루프린트로 승계 설정, UPROPERTY에 지정자(Specifier)를 설정할 수 있다.
- 컴포넌트 지정자
1. Visible / Edit: 객체타입 또는 값타입으로 사용
2. Anywhere / DefaultsOnly / InstanceOnly: 에디터에서 편집 가능한 영역
3. BluprintReadOnly / BlueprintReadWrite: 블루프린트로 확장시 읽기 혹은 읽기쓰기 권한을 부여
4. Category: 에디터 편집 영역(Detail)에서의 카테고리 지정

* 폰의 구조
- 액터를 상속받은 특별한 액터, 플레이어가 빙의해 입출력을 처리하도록 설계되어 있음
- 길찾기 사용 가능, 세 가지 주요 컴포넌트 구성
1. 충돌 컴포넌트(루트컴포넌트): 기믹과 상호작용 담당
2. 메시 컴포넌트: 시각적인 비주얼 담당
3. 움직임 컴포넌트: 움직임 담당
- 액터컴포넌트: 트랜스폼 없이 기능만 제공하는 컴포넌트 -> 씬컴포넌트: 트랜스폼o

* 캐릭터의 구조
- 인간형 폰을 구성하도록 언리얼이 제공하는 전문 폰 클래스
- 세 가지 주요 컴포넌트 구성
1. 캡슐 컴포넌트(루트컴포넌트): 기믹과 상호작용 담당
2. 스켈레탈 메시 컴포넌트: 애니메이션 캐릭터 표현 담당
3. 캐릭터 무브먼트 컴포넌트: 캐릭터의 움직임 담당

* 입력시스템 동작 방식
- 플레이어의 입력은 컨트롤러를 통해 폰으로 전달된다.
- 입력을 컨트롤러가 처리할 수도, 폰이 처리할 수도 있는데, 일반적으로는 빙의를 담당하는 폰이 입력을 처리하도록 설정한다.

* 향상된 입력시스템(Enhanced Input System)
- 기존의 입력 시스템을 대체하고 5.1 버전부터 새롭게 도입된 시스템
- 사용자의 입력 설정 변경에 유연하게 대처할 수 있도록 구조를 재수립했다.
- 사용자 입력 처리를 네 단계로 세분화하고 각 설정을 독립적인 애셋으로 대체한다.

* 향상된 입력시스템 동작 방식
- 사용자의 입력 데이터를 최종 함수에 매핑하는 과정을 체계적으로 구성
- 플랫폼에 따른 다양한 입력 장치 설정: 게임패드용 입력 매핑 컨텍스트, 키보드용 입력 매핑 컨텍스트
- 입력 값의 변경: AD/WS 입력값을 Y축과 X축으로 변경, 값 반전 처리
- 이벤트 발생 조건의 상세 설정: 일반 버튼, 축 이동, 일정 이상 푸시
- 사용자: 입력 -> 입력 매핑 컨텍스트: 입력 연결 -> 액션: 입력값 변조(Modifier), 이벤트 활성화(Trigger) -> 게임 로직: 함수


📌 1-3. 캐릭터 컨트롤 설정

1. 컨트롤러에 설정된 ControlRotation 속성의 이해
2. 캐릭터의 움직임과 회전을 설정하는 다양한 구성 요소와 설정 값의 이해
3. 입력 매핑 콘텍스트를 활용한 뷰의 변환 구현

 

* 이번 강의에서 다룬 게임 프레임웍 기능
- 플레이어: 카메라
- 폰: 이동

* 캐릭터 컨트롤
- 컨트롤러: 입력자의 의지(목표지점)을 지정할 때 사용된다. ControlRotation 속성
- 폰: 폰의 트랜스폼을 지정한다.
- 카메라: 화면 구도를 설정할 때 사용된다. 주로 1인칭 시점에서 사용
- 스프링 암: 화면 구도를 설정하기 위해 사용된다. 주로 3인칭 시점에서 사용
- 캐릭터 무브먼트: 캐릭터의 이동과 회전을 조정하는 용도로 사용된다.
- Rotation(현재 상태)은 필요시에 Rotation Rate의 각속도로 -> Desired Rotation(의지)까지 회전한다.

* 폰의 이동 함수
- Look 함수: 마우스 입력으로부터 컨트롤러의 컨트롤 회전을 설정
- Move 함수: 컨트롤러의 컨트롤 회전으로부터 Yaw 값을 참고해 이동 방향을 설정
- 콘솔 커맨드 창(단축키 ~)으로부터 Controll Rotation 값을 확인할 수 있다.
- DisplayAll PlayerController ControlRotation

* 폰의 컨트롤 옵션
- Use Controller Rotation (Yaw/Roll/Pitch)
- 컨트롤러에 지정된 Control Rotation 값에 폰의 Rotation을 맞출 것인가?
- 이 옵션을 켜면 폰의 회전은 컨트롤러의 Control Rotation과 동기화된다.
- ControlRotation == Desired Rotation

* 스프링암의 컨트롤 옵션
- Use Pawn Control Rotation
- Inherit (Yaw/Roll/Pitch)
- Do Collision Test
- 폰의 컨트롤 회전 (컨트롤러의 Control Rotation)을 사용할 것인가?
- 부모 컴포넌트 (주로 RootComponent)의 회전을 그대로 따를 것인가?
- 스프링암 중간에 장애물이 있으면 앞으로 당길 것인가? (Camera라는 트레이스 채널을 사용)
- 3인칭 시점 설정에 주로 사용

* 카메라의 컨트롤 옵션
- Use Pawn Control Rotation
- 폰의 컨트롤 회전 (컨트롤러의 Control Rotation)을 사용할 것인가?
- 스프링암에 달려있다면 스프링암의 회전과 함께 고려
- 1인칭 카메라 회전에 주로 사용

* 캐릭터 무브먼트의 이동 옵션
- Movement Mode: None, Walking, Falling
- 땅(Ground) 위에 있으면 Walking 모드
- 땅 위에 없으면 Falling 모드
- 이동 기능을 끄고 싶으면 None 모드
- 이동 모드에서의 이동 수치: MaxWalkSpeed
- 폴링 모드에서의 점프 수치: JumpZVelocity

* 캐릭터 무브먼트의 회전 옵션
- Rotation Rate: 회전 속도 지정
- Use Controller Desired Rotation: 컨트롤 회전을 목표 회전으로 삼고 지정한 속도로 돌리기
- Orient Rotation To Movement: 캐릭터 이동 방향에 회전을 일치시키기
- 폰의 회전 옵션과 충돌이 나지 않도록 주의

* 데이터 애셋
- UDataAsset을 상속받은 언리얼 오브젝트 클래스
- 에디터에서 애셋 형태로 편리하게 데이터를 관리할 수 있다.
- 캐릭터 컨트롤에 관련된 주요 옵션을 모아 애셋으로 관리