[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로 관리할 수 있게 하고 리플렉션처럼 보이게 할 수 있다.
'언리얼 엔진 > UE4 C++' 카테고리의 다른 글
[UE C++] The Pawn Class #1 (0) | 2022.09.04 |
---|---|
[UE C++] The Actor Class #2 (0) | 2022.09.04 |
[UE C++] The Actor Class #1 (0) | 2022.09.03 |
[UE C++] Download UE4, and Intro to the Engine (0) | 2022.09.03 |
[UE C++] Unreal Engine C++ The Ultimate Game Developer Course 시작 (0) | 2022.09.03 |