본문 바로가기

프로그래밍/Unreal

[UE4] C++ 기본 사항 노트

그냥 개인 노트자료. 상세 내용은 아래 참조~


프로그래밍 : https://docs.unrealengine.com/latest/KOR/Programming/index.html

API 레퍼런스 : https://docs.unrealengine.com/latest/INT/API/index.html





프로젝트파일


솔루션(프로젝트명)

Engine/

Games/ 

프로젝트명/

Config/ : 환경설정 ini 파일

Content/ : 애셋 패키지, 맵 등

Itermediate/ : 빌드 임시 파일

Saved/ : 자동저장

Source/

모듈명/

Classes/ : 게임 플레이 헤더 .h

Private/ : 구현파일 .cpp

Public/ : 모듈헤더 .h

모듈명.Build.cs


모듈명.Target.cs

모듈명Editor.Target.cs


프로젝트명.uproject



언리얼 프로젝트는 uproject 확장자를 가지고 있으며, 내용은 JSON 텍스트로 구성되며,

단순한 프로젝트 정보를 담고 있다.


c++ 프로젝트 생성해 보면 아래와 같이 프로젝트 파일이 생성된다.

{

"FileVersion": 3,

"EngineAssocialtion": "4.15",

"Category": "",

"Description": ""

"Modules": [

{

"Name":"모듈명"

"Type":"Runtime",

"LoadingPhase": "Default"

}

]

}




모듈




모듈 추가 설정

uproject 파일에 모듈 정보 추가

{

"Name":"모듈명",

"Type":"Runtime"

}



프로젝트명.Target.cs , 프로젝트명Editor.Target.cs 수정

생성자에 모듈명 추가


pulbic class MyProjectTarget : TargetRules

{

public MyProjectTarget(TargetInfo Target) : base(Target)

{

Type = TargetType.Game;

ExtraModuleNames.AddRange( new string[] { "MyModuleName"} );

}

}





모듈 구현

각 게임은 하나이상의 게임플레이 모듈로 구성됨.

메인 모듈은 IMPLEMENT_PRIMARY_GAME_MODULE 매크로를 사용해 등록.


모듈은 최소 하나의 모듈명.h, 모듈명.cpp, 모듈명.Build.cs 파일 필요



헤더파일은 모듈 디렉토리 Public 폴더



기본 선언

헤더 : ./Source/모듈명/Public

#include "Engine.h"



소스 : ./Source/모듈명/Private

#include "모듈명.h"


프라이머리 모듈

IMPLEMENT_PRIMARY_GAME_MODULE


기타 모듈

IMPLEMENT_GAME_MODULE



Build.cs 파일은 에디터가 생성한 파일을 참조해 작성

이곳에 참조하는 모듈 목록을 넣는다. 여러개의 모듈을 작성하는 경우 해당 모듈을 참조하는 경우에 추가해 준다.

(4.16부터 적용된 내용이라 이하 버전은 차이가 생성자 형식에 차이가 있음)


public class 모듈명:ModuleRules

{

public 모듈명(ReadOnlyTargetRules Target):base(Target)

{

PCHUsage = PCHUsageMode.UseExplicitOrSharedPCH;


PublicDependencyModulNames.AddRange(.....);

PrivateDependencyModuleNames.AddRange(.....);

}


}







기본 API



접두사

A : 스폰 가능한 Actor, 월드에 바로 스폰가능

U : 베이스 오브젝트, 월드에 바로 인스턴싱 불가, 액터에 속해 사용. 컴포넌트


UObjectBase

UObjectBaseUtility

UObject



관리된(?) 객체 생성 : 게임플레이 클래스

https://docs.unrealengine.com/latest/KOR/Programming/UnrealArchitecture/Reference/Classes/index.html


헤더파일

자동생성 파일 include 마지막 라인에 필수로 지정해 줘야함.

#include "ClassName.generated.h"

 


UCLASS()

클래스 선언전 클래스 권한 등을 설정하고, UClass를 생성하게 된다.

상속 받은 클래스는 부모 클래스의 권한도 상속 받는다.

클래스 선언전에 사용한다.


NotBlueprintable : 기본값, 블루프린트 확장 부적합

Blueprintable : 블루프린트 확장 가능

BlueprintType : 블루프린트 변수로 사용

Config=name : name.ini 환경설정 사용



액터 브라우저에서 그룹뷰가 켜졌을때 포함시킬지 여부

ClassGroup=(Rendering,Common)


컴포넌트 클래스의 경우 블루프린트로 스폰 가능 여부

meta=(BlueprintSpawnableComponent)





GENERATED_BODY()

클래스 선언 후 본문 처음에 기술해야 하는 매크로



UPROPERTY()

멤버 변수


// 블루프린트 권한

BlueprintReadWrite

BlueprintReadOnly


// 멀티캐스트 델리게이트 전용

BlueprintAssignable : 델리게이트를 블루프린트에서 할당 가능

BlueprintCallable : 블루프린트에서 델리게이트 호출 가능


// 에디터 편집 여부

EditDefaultsOnly

EditInstanceOnly

EditAnywhere


// 에디터에 보이는지 여부(Edit 지정자와 같이 사용 불가)

VisibleDefaultsOnly

VisibleInstantceOnly

VisibleAnywhere


// 카테고리

Category="카테고리명"


// 메타정보

meta=(AllowPrivateAccess="true"))


AllowPrivateAccess가 설정되면 private 멤버의 경우 상속받은 블루프린트 클래스에서 해당 멤버를 접근 가능.



UFUNCTION()

멤버 함수


// 블루프린트 호출 가능 여부

BlueprintPure

BlueprintCallable


// 이벤트 처리여부

BlueprintImplementableEvent : 인터페이스등과 같은 구현부를 블루프린트에서 구성 가능

BlueprintNativeEvent : 위와 같으나 네이티브쪽에도 구현부가 있음


//

Exec : 콘솔에서 실행할 수 있는 함수

Reliable : 네트워크를 통해 리플리케이트, 도착보장

Unreliable : 리플리케이트, 실패 가능


// meta = (메타정보)

BlueprintInternalUseOnly

BlueprintProtected

DeprecatedFunction

DeprecationMessage

UnsafeDuringActorConstruction





오브젝트 속성,함수 리플렉션

UCLASS() 매크로로 지정된 객체는 엔진에서 리플렉션을 지원하는데, UClass 객체얻어 속성이나 함수 목록을 가져올 수 있다.

UClass 객체는 GetClass(), UObject::StaticClass(), ConstructHelpers::FClassFinder 를 사용해 얻어올수 있다.


UClass* uclass = MySubObject->GetClass();

UClass* uclass = MySubObject::StaticClass();



UClass 에는 속성(변수)과 함수에 대한 목록이 등록되어 있는데, TFieldIterator 를 사용해 목록을 얻어올 수 있다. 

가져오는 목록에 대한 타입의 경우 속성은 UProperty, 함수는 UFunction 을 지정해 얻어올 수 있다.

각 요소의 실제 인스턴스는 UObject::FindField() 로 얻어온다.



속성정보 가져오기

for( TFieldIterator<UProperty> iter(uclass);; iter; ++iter)

{

// 얻어온 속성 이름

*iter->GetName();


// 특정 속성 가져오기

UStrProperty* property = FindField<UStrProperty>(uclass, "속성명"  );


}



서브 오브젝트 인스턴스 생성

서브 오브젝트의 경우 소유클래스의 UPROPERTY로 지정해야 생성,소멸,가비지콜렉팅이 이루어진다.


사용할 모듈을 정의해 주고, 생성자에서 해당 모듈의 인스턴스를 생성한다.

UObject* MySubObject;


MySubObject = CreateDefaultSubobject<오브젝트명>(TEXT("오브젝트명"));


컴포넌트의 경우 루트 컴포넌트로 설정하거나 루트 컴포넌트 하위에 붙인다

if( RootComponent == nullptr)

{

RootComponent = MySubObject;

} else {

MySubObject->SetupAttachment(RootComponent);

}




* 생성자가 아닌 런타임에서 NewObject<오브젝트명>( Outer 객체 ) 사용해 동적으로 오브젝트를 생성가능.













스마트 포인터

바인딩시 스마트 포인터를 사용하는데, 언리얼에서 제공하는 라이브러리를 사용하게 된다.

TSharePtr : 공유포인터

TShareRef : 공유 레퍼런스

TWeakPtr : 약한 포인터



MakeShareable() 을 사용해 C++ 포인터를 스마트 포인터로 초기화 할 수 있다.

StaticCastSharedRef()

ConstCastSharedRef()

DynamicCastSharedRef()

StaticCastSharedPtr()

ConstCastSharedPtr()

DynamicCastSharedPtr()






ENUM

UENUM(BlueprintType)

enum class EMyType : uint8

{

VAL1 UMETA(DisplayName="VALUE_1"),

VAL2 UMETA(DisplayName="VALUE_2")

};


인터페이스

UINTERFACE(Blueprintable)

class UMyInterface : public UInterface

{

GENERATED_BODY()

};


class IMyInterface

{

GENERATED_BODY()

public:

UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, Category="MyInterface")

void MyFunction() const;

};




'프로그래밍 > Unreal' 카테고리의 다른 글

[UE4] 폰트  (0) 2017.09.26
[UE4] C++ 에셋, 오브젝트 레퍼런싱/객체생성  (1) 2017.09.25
[UE4] CSV 파일  (0) 2017.09.24
[UE4] unreal delegate  (0) 2017.09.24
[UE4] 마우스 입력  (0) 2017.09.17
[UE4] 아웃라인 : 스텐실  (0) 2017.09.16
[UE4] 메쉬 외곽선 효과  (0) 2017.09.15
[UE4] 언리얼 기본 예제 분석  (0) 2017.09.13
[UE4] Line Trace  (0) 2017.09.12
[UE4] 액터  (0) 2017.09.12