[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로 관리할 수 있게 하고 리플렉션처럼 보이게 할 수 있다.

[3. The Viewport]

 

기본적으로 그리드 스냅이 지정되어있어서 오브젝트의 트랜스폼 변경시 뚝뚝 끊어지는 느낌이 있는데, 그리드 스냅을 끄면 연속적으로 잘 움직이게 된다.

그리드 스냅의 수치도 조절할 수 있다. 잘 이용하면 땅이나 원하는 위치에 고정하는 데 도움이 될 수 있다.

 

언리얼은 기본적으로 센티미터 단위이다.

 

공중에 떠있는 오브젝트를 땅에 딱 붙이고 싶다면 End키를 누르면 된다. 단, 겹치는 오브젝트가 있으면 안된다.

 

[4. Editor Overview]

 

월드 아웃라이너에서 오브젝트를 찾을 때 더블클릭을 하거나 F키를 누르면 해당 오브젝트로 이동하여 화면 중앙에 위치시켜준다. 카메라 텀블링(선회, orbit)할때 유용하다.

 

카메라 텀블링은 Alt+좌클릭+드래그이다. 뷰포트 중앙을 중심으로 선회한다.

 

Ctrl+(좌/우/좌+우 클릭)+드래그 를 이용해서 각 트랜스폼의 X, Y, Z축을 조절할 수 있다.

W(이동), E(회전), R(스케일)을 먼저 선택해 주어야 한다.

 

[5. The Level Blueprint]

 

유니티의 씬과 비슷한 개념이다. 해당 레벨에서만 사용할 수 있다.

 

 

 

 레벨 블루프린트에서 간단하게 작성한 것을 실행한 결과.

 

[6. Creating Blueprints]

 

모든 액터는 최소한 하나의 씬 컴포넌트를 가지고 있어야 한다.

 

트랜스폼의 모빌리티는 엔진이 라이팅을 만드는 방법과 관련이 있다. (유니티와 동일한 것 같음)

  • 스태틱: 움직일 수 없지만(런타임 중에 변경 불가능) 동적 그림자(Dynamic Shadow)를 생성하기 위해 추가 리소스를 사용하는 것에 대한 걱정이 없어진다.
  • 스테이셔: 조명에 사용 가능. 움직일 수 없지만 런타임 도중 밝기의 변경이 가능하다.
  • 무버블: 동적 그림자를 생성하여 렌더링이 가장 느리다.

 

Construction Script는 오브젝트가 이동하거나 변경될 때 실행되고 이벤트그래프는 게임의 모든 로직을 가질 수 있다.

 

 

이제 씬 컴포넌트에 메시를 추가하고 디테일 패널에서 Static Mesh를 SM_Rock으로 설정하고 트랜스폼의 모빌리티를 무버블로 설정해준다. 

 

이벤트그래프에 들어가서 Tick 이벤트에 AddActorWorldOffset을 만들어서 연결시켜 주고 Delta Location의 X값만 1.0으로 준다.

 

해당 블루프린트를 월드에 배치하고 실행하면, 바위가 매 틱마다 X축으로 1.0씩 이동하게 된다.

+ Recent posts