C++ 93

[언리얼 C++] 언리얼 프로젝트(애셋, 레벨, 액터)

언리얼 프로젝트의 모든 것은 프로젝트 디렉터리에 들어있습니다. 프로젝트는 원하는 갯수만큼 만들 수 있지만, 각각은 그 자체로 완결성을 가집니다. 언리얼 엔진의 프로젝트 브라우저를 사용하여 새 프로젝트를 생성하면 디렉터리 구조나 언리얼 에디터에서 열어볼 수 있는 언리얼 프로젝트 파일([ProjectName].uproject) 등의 필수 프로젝트 프레임워크가 구성됩니다. 1. 애셋 애셋은 프로젝트의 Content 폴더에 들어있으며, .uasset 파일로 저장됩니다. 애셋에는 머티리얼, 스태틱/스켈레탈 메시, 블루프린트, 사운드 큐, 텍스처 등이 포함되며, 이들은 프로젝트의 오브젝트에서 불러올 수 있는 템플릿입니다. 2. 레벨 레벨 또한 프로젝트의 Content 폴더에 들어있으며, .umap 파일로 저장됩니다..

[언리얼 C++] 프로그래밍 서브시스템

언리얼 엔진 4의 서브시스템은 수명이 관리되는 자동 인스턴싱 클래스입니다. 이 클래스는 사용하기 쉬운 확장점을 제공하여, 프로그래머는 블루프린트 및 Python에 바로 노출시킴과 동시에 복잡한 엔진 클래스 수정 또는 오버라이드를 피할 수 있습니다. 1. 서브시스템 서브시스템 상속 원본 Engine UEngineSubsystem 클래스 Editor UEditorSubsystem 클래스 GameInstance UGameInstanceSubsystem 클래스 LocalPlayer ULocalPlayerSubsystem 클래스 위 표는 현재 지원되는 서브시스템들입니다. 여기서 GameInstance 서브시스템을 커스터마이징했을때, 커스터마이징한 서브시스템의 수명에 대해 설명드리겠습니다. class UMyGame..

[언리얼 C++] 게임플레이 디버거

게임플레이 디버거는 런타임에 실시간으로 게임플레이 데이터를 분석하고 감시할 수 있도록 해주는 툴입니다. 심지어 리플리케이션을 사용하는 네트워킹 게임 내 클라이언트에서도 가능합니다. 에디터에서 플레이, 에디터에서 시뮬레이트, 독립형 게임 세션에서도 잘 돌아가며, 모든 데이터가 게임 뷰포트 위에 겹쳐 표시됩니다. 게임 전용 데이터의 디버깅을 가능하게 하기 위해 확장시킬 수 있는 프레임워크도 제공됩니다. 게임플레이 디버거로 뷰포트에 표시할 수 있는 내용은 다음과 같습니다. Pawn에서의 기본 데이터 AI 컨트롤러에서의 기본 데이터 비헤이비어 트리 및 블랙보드 관련 데이터 실행된 인바이런먼트 쿼리(EQS) 관련 데이터 인지 시스템에서의 데이터 플레이어 또는 선택된 Pawn 주변 내비메시에 링크나 영역같은 디테일..

[언리얼 C++] 구조체 선언 및 정의

1. 구조체 선언 USTRUCT([Specifier, Specifier, ...]) struct StructName { GENERATED_BODY() }; 게임플레이 클래스의 구조체는 일반 C++ 구조체 선언 위에 USTRUCT 매크로를 사용하여 선언하며, USTRUCT 매크로에 구조체 지정자를 추가하여 엔진 및 에디터의 다양한 부분에서 어떤식으로 작동할지를 제어할 수 있습니다. 그리고 구조체 안에는 일반 변수, UProperty 변수, 함수, 연산자를 포함할 수 있습니다. 구조체 선언시 주의할 점은 구조체는 클래스 선언 이전에 선언되어야 한다는 것입니다. 2. 구조체 지정자 구조체 지정자 효과 Atomic 이 구조체는 항상 하나의 단위로 Serialize 됨을 나타냅니다. BlueprintType 이 ..

[언리얼 C++] 프로퍼티 선언

1. 프로퍼티 선언 UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)]) Type VariableName; 프로퍼티는 위의 예제 코드처럼 표준 C++ 변수 문법 위에 UPROPERTY 매크로를 사용하여 선언합니다. 그리고 UPROPERTY 매크로에 프로퍼티 메타데이터와 변수 지정자를 붙여 엔진 및 에디터에서의 작동 방식을 제어할 수 있습니다. 2. 코어 데이터 유형 정수형 변수 유형 설명 uint8 8-bit unsigned uint16 16-bit unsigned uint32 32-bit unsigned uint64 64-bit unsigned int8 8-bit signed int16 16-bit signed int32 3..

[언리얼 C++] 인터페이스 클래스

인터페이스 클래스는 관련이 없는 클래스 세트가 공통의 함수 세트를 구현할 수 있도록 해줍니다. 그대로라면 유사성이 없었을 크고 복잡한 클래스들에 어떤 게임 함수 기능을 공유시키고자 하는 경우 매우 좋습니다. 1. 인터페이스 선언 인터페이스 클래스 선언은 일반 언리얼 클래스 선언과 비슷하지만 크게 두가지 차이점이 있습니다. UINTERFACE([specifier, specifier, ...], [meta(key=value, key=value, ...)]) class UClassName : public UInterface { GENERATED_BODY() }; 첫째, 인터페이스 클래스는 UCLASS 매크로 대신 UINTERFACE 매크로를 사용하며, UObject 대신 UInterface를 상속합니다. 둘째..

[언리얼 C++] 게임플레이 모듈

언리얼 엔진에서 게임플레이 모듈이란 DLL에 컴파일되는 게임 프로젝트에 속하는 게임플레이 클래스의 모음입니다. 엔진 자체가 여러 모듈로 이루어져 있는 것과 마찬가지로, 각 게임은 하나 이상의 게임플레이 모듈로 이루어져 있습니다. 이들은 관련 클래스들의 모음을 담는 그릇이라는 점에서 이전 버전 엔진에서의 패키지와 비슷합니다. 언리얼 엔진 4에서는 게임플레이가 모두 C++로 처리되기에, 모듈은 별도의 패키지 파일이라기 보다는 사실상 DLL에 가깝습니다. 1. 모듈 생성 게임플레이 모듈에는 반드시 최소한 하나의 헤더(.h) 파일, C++(.cpp) 파일, 빌드(.Build.cs) 파일이 들어있어야 합니다. 헤더 파일은 모듈 디렉터리의 Public 폴더, 즉 [게임프로젝트명]\Source\[모듈명]\Public..

[언리얼 C++] UFunction 선언

1. UFunction 선언 언리얼 엔진에서 함수는 두가지 기본 형태가 존재합니다. 바로 일반 C++ 함수 또는 UFunction입니다. 일반 C++ 함수 및 UFunction 둘다 클래스 헤더 파일에 선언됩니다. 일반 C++ 함수를 선언할때는 표준 C++ 문법을 사용합니다. 그에 반해, UFunction은 특수 문법을 사용하여 선언하며, 함수 지정자를 통해 선언에 함수 관련 추가 정보를 설정할 수 있습니다. UFUNCTION([specifier, specifier, ...], [meta(key=value, key=value, ...)]) ReturnType FunctionName([Parameter, Parameter, ...]) UFunction은 C++ 구현이 있고, C++ 코드 안에서 호출할 수 ..

[언리얼 C++] 게임플레이 클래스 구현

모든 게임플레이 클래스는 클래스 헤더(.h) 파일에 GENERATED_BODY() 매크로를 작성해줘야 제대로 구현됩니다. 헤더 파일은 클래스와 클래스에 속한 모든 변수와 함수를 정의하며, 파일명은 구현중인 클래스 이름에서 A 또는 U 접두사를 빼는 것입니다. 즉, AActor 클래스에 대한 헤더 파일은 Actor.h입니다. 이와 같이 클래스 소스(.cpp) 파일명도 동일하게 작성하는 것이 좋습니다. Actor.h에 대한 구현부 소스 파일은 Actor.cpp가 될 것입니다. 에디터 내 "C++ 클래스 추가" 메뉴 옵션으로 생성된 클래스에 대해서는 자동으로 처리됩니다. 소스(.cpp) 파일은 C++ 클래스 선언을 포함하는 헤더(.h) 파일을 포함해야 하는데, 이 파일은 보통 자동 생성되지만 수동 생성할 수도..

[언리얼 C++] 게임플레이 클래스 생성

언리얼 엔진의 모든 게임플레이 클래스는 클래스 헤더(.h) 파일과 클래스 소스(.cpp) 파일로 이루어져 있습니다. 클래스 헤더에는 클래스와 그 멤버, 즉 변수와 함수에 대한 선언이 들어 있으며, 클래스 소스에는 함수의 구현을 통한 정의가 들어있습니다. 언리얼 엔진의 클래스에는 표준화된 작명 규칙이 있어서 클래스 이름의 첫글자, 다른 말로 접두사만 봐도 클래스의 종류를 바로 알 수 있습니다. 접두사 의미 A 스폰 가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 이들은 Actor로 월드에 바로 스폰 가능합니다. U 모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 월드에는 바로 인스턴싱할 수 없으며, Actor에 속해야 합니다. 보통 Components와 같은 오브젝트입니다. 위 표는 게..