[7. C++ Refresher and UE4 Hierarch]

 

언리얼의 계층 구조: Object -> Actor -> Pawn -> Character

오브젝트는 레벨에 배치할 수 없고 최소한 액터에서 파생된 클래스여야 한다.

 

각 클래스에서 파생된 클래스는 무수히 많다.

 

Has a 관계로써 Package->World->Level->Actor->Actor Component가 있다.

 

[8. Class Creation in Unreal Engine]

 

캐릭터를 상속받는 C++ 클래스를 만들면 기본적으로 구성이 어느정도 되어있다.

 

ACharacter를 상속받은 것을 볼 수 있는데, F12로 계속 타고 올라가면 Pawn, Actor를 지나서 Object, 심지어 그 위의 상위 클래스가 있다는것을 알 수 있다.

 

생성자의 PrimaryActorTick.bCanEverTick을 false로 두면 Tick함수가 더 이상 동작하지 않는다.

 

[9. Reflection and Garbage Collection]

 

C++에는 기본적으로 Reflection 기능이 없다.

언리얼 엔진 리플렉션 시스템에 보이길 원하는 것은 반드시 SPECIAL_MACRO(특수 매크로)가 붙어 있어야한다.

 

특수 매크로가 붙으면 블루프린트에 보여지거나, 가비지 컬렉터에 의해 관리된다.

 

언리얼 헤더 도구(uht)는 프로젝트가 컴파일 될 때, 특수 매크로의 정보를 수집하는 프로그램이다.

특수 매크로를 발견하면 클래스에 대한 추가 코드가 작성된다.

 

UCLASS(), UPROPERTY(), UFUNCTION() 괄호 안에 함수처럼 매개변수를 사용할 수 있다.

 

[10. Creating a UObject]

 

Object를 상속받은 C++ 클래스는 기본적으로 아무것도 구현이 되어있지 않고 해당 클래스 파일 기반 블루프린트 클래스도 생성할 수 없다.

 

UCLASS(Blueprintable)

 

하지만 UCLASS의 속성을 위와 같이 지정해주면 블루프린트 클래스 생성 버튼이 활성화 되어서 가능해진다.

MyObject_BP로 생성해준다.

 

 

// MyObject.h
UCLASS(Blueprintable)
class FIRSTPROJECT_API UMyObject : public UObject
{
	GENERATED_BODY()

public:
	UMyObject();

	UPROPERTY(BlueprintReadWrite)
	float MyFloat;

	UFUNCTION(BlueprintCallable)
	void MyFunction();
};


// MyObject.cpp
UMyObject::UMyObject()
{
	MyFloat = 0.f;
}

void UMyObject::MyFunction()
{

}

 

코드를 작성한 후 MyObject_BP의 이벤트그래프에 들어가서 MyFloat와 MyFunction을 검색하고 꺼내는것 까지 정상적으로 작동하는 것을 확인할 수 있다. 

 

추가로 Object 클래스이므로 당연히 월드에 배치시킬 수 없다.

 

[11. Using UObject in Blueprints]

 

UPROPERTY(BlueprintReadWrite, Category = "MyVariables")
float MyFloat;

UFUNCTION(BlueprintCallable, Category = "MyFunctions")
void MyFunction();

  

카테고리를 지정해주면 카테고리가 추가되어 그 밑으로 들어가게 된다.

이제 변수와 함수를 카테고리로 정렬할 수 있게 된다.

 

 

UPROPERTY(BlueprintReadOnly, Category = "MyVariables")
float MyFloat;

  

속성을 ReadOnly로 변경 시, Set이 사라지게 된다. 기존에 있던 Set 노드는 더 이상 유효하지 않게 된다.

키워드를 통해 Reflection 시스템이 블루프린트에 변수 및 함수를 노출하는 방법을 결정할 수 있다.

 

void UMyObject::MyFunction()
{
	UE_LOG(LogTemp, Warning, TEXT("This is our warning text!"));
}

 

 

MyActor 블루프린트 클래스에서 변수 생성을 하고 변수 유형을 위와 같이 설정해준다.

 

오브젝트 생성을 해주고, (C++의 new와 비슷함)

 

 Class는 MyObject_BP, Outer는 MyActor를 해주면 MyActor가 MyObjectBP를 생성해서 MyObjectVar에 반환 해준다.

그 후 MyFunction을 실행하면 출력 로그에 지정했던 로그가 잘 나오게 된다.

만약 오브젝트 생성후 반환받지 않고 바로 MyObjectVar를 사용하게 되면 None 에러가 발생하게 된다. 초기화 되지 않은 객체를 접근한거나 다름없는 것이다.

 

[정리]

 

  • UPROPERTY를 붙여서 GC로 관리할 수 있게 하고 리플렉션처럼 보이게 할 수 있다.

+ Recent posts