2024/10/14에 해당하는 글 1

언리얼 엔진 게임 제작 기초

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

댓글()