언리얼 엔진 게임 제작 기초
Unreal 이론2024. 10. 14. 16:54
[이득우의 언리얼 프로그래밍 Part2 수업의 정리]
게임 컨텐츠의 구조
- 게임 제작을 위해 언리얼 엔진은 자체적으로 설계한 프레임웍을 제공함
- 이를 게임플레이 프레임웍(Gameplay Framework) 라고 부름.
- 언리얼 게임 프레임웍의 각 구성 요소를 파악하고, 이를 확장하면서 게임 제작 권장
월드
- 게임 컨텐츠를 담기 위해 제공되는 가상의 공간
- 월드는 시간, 트랜스폼, 틱을 서비스로 제공
- 월드 세팅이라는 컨텐츠 제작을 위한 기본 환경 설정을 제공
- 월드의 기본 단위는 액터(Actor)로 정의, 액터 클래스는 언제나 접두사 A 사용
- 월드의 역할
- 게임 컨텐츠를 담는 공간(Transform)
- 게임 컨텐츠의 진행(Tick)
- 게임 흐름을 위한 시간(Time)
- 기본 환경 설정(World Setting)
- 월드의 단위 구성 요소(Actor)
게임 모드
- 게임 규칙을 지정하고 게임을 판정하는 최고 관리자 액터. 형태는 없음
- 언리얼 엔진에서 하나의 게임에는 반드시 하나의 게임모드만 존재한다.
- 게임 모드에서 입장할 사용자의 규격을 지정할 수 있음
- 멀티플레이어 게임에서 판정을 처리하는 절대적 권위의 심판
- 게임모드의 역할
- 플레이어 입장 관리
- 게임의 최종 승패 관리
- 게임의 규칙 관리
- 게임 데이터 검증(멀티플레이 게임)
기믹(Gimmick)
- 게임 진행을 위한 이벤트를 발생시키는 사물 액터
- 주로 이벤트 발생을 위한 충돌 영역을 설정하는데, 이를 트리거(Trigger) 라고 한다.
- 트리거를 통해 캐릭터와 상호 작용하고, 월드에 액터를 스폰해 컨텐츠를 전개한다.
- 기믹의 역할
- 월드 내 사물과 상호작용 수행
- 지정된 조건 만족시 이벤트 발생
- 월드에 물체를 스폰(Spawn) 시킬 수 있음
플레이어
- 게임에 입장한 사용자 액터. 형태 없다.
- 게임 모드의 로그인을 통해 사용자가 게임 월드에 입장하면 플레이어가 생성
- 싱글 플레이 게임에서는 0번이라는 특수한 ID의 플레이어가 설정됨
- 사용자와의 최종 커뮤니케이션 담당 (입력 장치의 해석, 화면 장치로의 출력 등)
- 플레이어의 역할
- 게임에 입장한 사용자와의 1:1 대응
- 사용자의 현재 상태 및 데이터를 관리
- 사용자 입력의 1차 처리(필요시)
- 사용자 화면에 대응하는 카메라 관리
- 사용자 화면에 나타나는 HUD UI 관리
폰(Pawn)
- 무형의 액터인 플레이어가 빙의해 조종하는 액터
- 길찾기 사용할 수 있으며, 기믹 및 다른 폰과 상호작용한다.
- 폰 중에서 인간형 폰을 별도로 캐릭터라고 지칭한다.
- 폰의 역할
- 빙의(Possess)를 통해 플레이어와 연결
- 사용자 입력의 실제 처리
- 사용자 화면에 대응되는 카메라 설정
- 기믹과의 상호작용
- 현재 상태에 적합한 애니메이션 재생
게임의 제작 과정
- 이번 과정의 싱글플레이 게임 제작은 크게 다섯단계
- 1단계: 월드 설정과 게임 모드 생성
- 2단계: 플레이어 폰의 입출력 및 모션 설정(언리얼 엔진이 제공하는 삼인칭 템플릿 활용)
- 3단계: 캐릭터에 반응하는 기믹 설계
- 4단계: 게임데이터와 NPC 인공지능
- 5단계: UI 연동 및 게임 제작 마무리\
최종 확장 내용
- 기본 템플릿 사용x, 직접 제작
- 두가지 카메라 모드 제공 (솔더뷰, 탑뷰)
- 액션 입력을 통한 콤보 공격 구현
- 아이템 에셋을 활용한 무기 상자의 구현
- NPC 레벨 정보를 스프레드 시트로 관리
- 플레이어와 전투하는 NPC 인공지능의 구현
- UI연동과 게임의 마무리
프로젝트 생성
- C++ Blank 템플릿으로 생성
- 프로젝트 이름은 ArenaBattle
- 주 게임 모듈 이름은 이렇게 하면 자동으로 ArenaBattle로 지정됨.
프로젝트 소스코드 폴더 규칙
- 게임플레이를 구성하는 요소별로 폴더 제작해 관리
- Game: 게임 모드와 게임 설정에 관련된 클래스
- Gimmick: 기믹 배경 물체에 관련된 클래스
- Player: 플레이어에 관련된 클래스
- Input: 플레이어 입력에 관련된 클래스
- Character: 플레이어 입력에 관련된 클래스
- Action: 캐릭터 액션에 관련된 클래스
- Item: 캐릭터 아이템에 관련된 클래스
- Stat: 캐릭터 스탯에 관련된 클래스
- AI: NPC 인공지능에 관련된 클래스
- UI: UI에 관련된 클래스
- Physics: 물리 충돌체 설정에 관련된 전처리기
- Interface: 인터페이스 클래스를 모아둔 폴더
클래스 생성 규칙
- 모든 클래스는 AB의 접두사로 시작
- 폴더마다 다른 폴더와의 의존성 최소화
- 다른 폴더의 클래스에 접근할 때 가급적 인터페이스를 통해 접근
- 헤더 경로를 찾기 쉽도록 모듈.Build.cs 파일에 모듈의 폴더를 인클루드 경로에 설정
- PublicIncludePath.AddRange( new String[] {"Module_Name"}); 추가
- 가급적 다른 폴더의 헤더 직접 참조하지 않도록 구성하는 것이 바람직
최초 생성 클래스
- 게임 구성하는 기본 골격의 설정
- 캐릭터는 PC와 NPC 구분해 구현
- 게임 모드에서는 입장할 플레이어의 규격 지정 (AABPlayerController, AABCharacterPlayer)
이후 작업 내용
- Content Browser에서 Add 버튼으로 Thirdperson 템플릿을 추가함
- ABGameMode 클래스를 World settings에서 GameMode Override에 설정해준다.
- ABGameMode 클래스에 생성자를 만들어준다.
- Dafault Pawn Class는 BP_ThirdPersonCharacter의 Reference를 ConstructorHelper 함수를 통해 가져와서 지정해준다.
- Player Pawn Class는 include를 통해 옆 폴더의 헤더파일을 가져와서 PlayerControllerClass = AABPlayerController::StaticClass(); 로 지정해줘도 되지만, 폴더간 의존성을 줄이기 위해 DefaultPawnClass 처럼 ref를 가져와 지정해준다.
// ABGameMode.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "ABGameMode.generated.h"
/**
*
*/
UCLASS()
class ARENABATTLE_API AABGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
AABGameMode();
};
// ABGameMode.cpp
#include "Game/ABGameMode.h"
AABGameMode::AABGameMode()
{
static ConstructorHelpers::FClassFinder<APawn> ThirdPersonClassRef(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C"));
if (ThirdPersonClassRef.Class) {
DefaultPawnClass = ThirdPersonClassRef.Class;
}
// DefaultPawnClass
static ConstructorHelpers::FClassFinder<APlayerController> PlayerControllerClassRef(TEXT("/Script/ArenaBattle.ABPlayerController"));
if (PlayerControllerClassRef.Class) {
PlayerControllerClass = PlayerControllerClassRef.Class;
}
//PlayerControllerClass = AABPlayerController::StaticClass();
}
- ABPlayerController에는 게임을 시작하자마자 마우스 포인터가 뷰포트 안으로 들어가도록 설정해준다.
- BeginPlay 함수를 상속받아 내부에 구현한다.
// ABPlayerController.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "ABPlayerController.generated.h"
/**
*
*/
UCLASS()
class ARENABATTLE_API AABPlayerController : public APlayerController
{
GENERATED_BODY()
protected:
virtual void BeginPlay() override;
};
// ABPlayerController.cpp
#include "Player/ABPlayerController.h"
void AABPlayerController::BeginPlay()
{
Super::BeginPlay();
FInputModeGameOnly GameOnlyInputMode;
SetInputMode(GameOnlyInputMode);
}
'Unreal 이론' 카테고리의 다른 글
캐릭터 컨트롤 설정 (0) | 2024.10.20 |
---|---|
캐릭터와 입력 시스템 (1) | 2024.10.19 |
언리얼 빌드 시스템 (1) | 2024.10.03 |
언리얼 오브젝트 관리 - 패키지 (0) | 2024.10.01 |
언리얼 오브젝트 관리 - 직렬화 (0) | 2024.09.12 |
댓글()