Unreal

4. Actor Class & Debug(1)

Kelvin의 게임개발 2023. 12. 5. 00:40
728x90
반응형

1. Actor Creation

 

Actor는 Level에 배치하거나 스폰할 수 있는 오브젝트의 기본 클래스이다

 

C++클래스를 생성할 때 부모클래스를 선택할 수 있다 이때 Actor Class를 선택하면 Actor를 상속받는 클래스를 만들 수 있다

Actor뿐만 아니라 수많은 엔진 클래스를 상속받을 수 있다 ex) Pawn, Character, UserWidget...

 

그 후 Next로 Class이름, 경로를 설정하면 된다

 

이와 같이 Solution탐색기에서 확인이 가능하다

 

이때 Build.cs파일은 프로젝트에 포함되는 모듈을 제어한다

 

아래는 ActorClass를 상속받았을 때 자동으로 생성되는 함수들이다

#pragma once //.h파일을 포함할 때 한번만 포함되도록 보장해주는 전처리 지시문이다

#include "CoreMinimal.h" //Actor가 일반적으로 필요로 하는 핵심 최소 기능을 포함한다
#include "GameFramework/Actor.h" //Actor클래스를 포함하기 위한 Actor.h
#include "Items.generated.h" //class가 Reflection System에 들어가기 위한 코드를 포함한다

UCLASS() //UCLASS매크로로 이 클래스는 Reflection System에 들어갈 수 있게된다
class STUDYUE_API AItems : public AActor //Actor를 상속받음, _API는 DLL혹은 동적으로 링크된 라이브러리에서 사용될 수 있도록 한다
{
	GENERATED_BODY() //언리얼 오브젝트로 만든 클래스가 언리얼 시스템을 위한 추가적인 함수, Super:: 또는 ThisClass::와 같은 유용한 typedef를 사용할 수 있게 해준다
	
public:	
	AItems(); //기본 생성자

protected:
	virtual void BeginPlay() override; //Actor로 부터 상속받은 가상함수 BeginPlay() Actor가 생성될 때 한 번 호출된다

public:	
	virtual void Tick(float DeltaTime) override; //Actor로 부터 상속받은 가상함수 Tick() 매 프레임마다 호출된다

};

 

#include "Items.h"

AItems::AItems()
{
	PrimaryActorTick.bCanEverTick = true; //true로 Tick 활성화, false로 Tick 비활성화가 가능하다

}

void AItems::BeginPlay()
{
	Super::BeginPlay(); //부모의 BeginPlay()호출
	
}

void AItems::Tick(float DeltaTime) //DeltaTime은 Frame과 Frame사이의 시간초이다
{
	Super::Tick(DeltaTime); //부모의 Tick() 호출

}

//Super::함수이름(); 은 부모클래스의 함수를 호출한다는 의미이다, 부모의 virtual함수를 상속받아 override할 경우 Super::를 활용하자

 

 

2. Blueprint Creation

 

만든 Actor C++ Class는 BP Class로 만들어서 사용한다, 만든 BP Class는 C++ Actor Class를 상속받게 된다

(C++File 우클릭 -> Create Blueprint class based on Item으로 만들수도 있고 ContentBrowser 공백란에 우클릭 -> Blueprint Class로 만든 후 원하는 부모 클래스를 지정해서 만들수도 있다, BP Class이름은 BP_이름 으로 하는게 좋다)

 

이렇게 만든 BP Class들은 레벨에 배치할 수 있다

 

모든 Actor들은 기본적으로 컴포넌트 하나가 붙어있다 (RootComponent)

 

Component들과 Actor를 클릭하여 Detail에서 세부사항을 제어할 수 있다

 

BP Class를 열게 되면 Viewport, Construction Script, Event Graph가 존재한다

 

Viewport : BP Class의 컴포넌트들을 시각화 해주며 Gizmo조작, 카메라 조작이 가능하다

 

Event Graph : BP Node를 이용하여 프로그래밍 하는 시스템 그래프 (마찬가지로 BeginPlay, Tick 등 이벤트(C++의 Delegate)가 존재한다)

 

Construction Script : 게임 시작 전에 호출되는 노드이다 (ex) Detail값을 변경하면 이 노드가 호출된다)

 

PrintString : 원하는 String을 화면에 출력하는 노드이다 (Debuging 용으로 많이 사용된다, LogString은 화면이 아닌 OutputLog에 원하는 String을 띄워준다)

 

원하는 문자 (FString), Screen/Log에 띄울지 말지 (bool), 글자 색 (FColor), 지속시간 (float), Key (FName)으로 인자로 이루어져 있다

 

Key로 Print String을 제어할 수 있다 ex) Tick()에서 아주 많은 PrintString이 실행될 때 Key값을 1로 지정하면 모든 String이 출력되지 않고 새로운 String으로 계속 대체되어 1개만 나오게 된다

 

UE_LOG(LogTemp, Warning, TEXT("Begin Play Called")); //TEXT("")는 String Literal을 유니코드로 변환한다

//UE에서 String타입은 FString이다, FString Literal을 사용할때는 TEXT("")에 사용하길 권장한다

 

UE_LOG() : 원하는 value, String을 OutputLog에 출력할 수 있다

 

 

3. OnScreen Debug Message

 

if (GEngine) //GEnine은 전역 포인터 변수로 어디에서든 접근이 가능하다, nullptr Check 필수
{
	GEngine->AddOnScreenDebugMessage(1, 60.f, FColor::Blue, FString("Item On Screen"));
	
    //key, Duration, Color, String값을 매개변수로 사용한다
    //FColor의 색들은 static 변수로 되어 있기때문에 클래스로 직접 접근이 가능하다
}

GEngine->AddOnScreenDebugMessage() : 원하는 value, String을 화면에 출력할 수 있다

 

Key (FName), Duration (float), Color (FColor), 원하는 문자열 (FString)으로 인자로 이루어져 있다

 

4. Formatting Strings

 

void AItems::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	//%f, %d, %s 등 다양한 format이 존재한다 (%f = float, %d = int, %s = string)
	UE_LOG(LogTemp, Warning, TEXT("DelatTime : %f"), DeltaTime);

	//여러개도 가능하며 format과 ,뒤의 값의 개수와 순서를 맞춰주어야 한다
}

이처럼 value값도 출력이 가능하다

 

void AItems::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	if (GEngine)
	{
		FString Message = FString::Printf(TEXT("DeltaTime : %f"), DeltaTime);

		GEngine->AddOnScreenDebugMessage(1, 60.f, FColor::Blue, Message);
	}
}

FString::Printf() : 원하는 값을 String Format으로 변경해준다 위의 예제에서는 DeltaTime : 값 자체를 FString Format으로 변경

 

FString Name = GetName();

FString Message = FString::Printf(TEXT("ObjName : %s"), *Name);
//String값을 %s에 넣으려면 *를 FString변수 앞에 붙여야한다 -> C스타일의 문자열인 TCHAR Array로 제공한다
//*는 FString Operator이다

GetName() : this Object의 이름을 FString으로 반환하는 함수 (Object의 이름은 중복될 수 없다)

728x90
반응형

'Unreal' 카테고리의 다른 글

6. Moving Object & Trig Function(삼각함수)  (131) 2023.12.08
5. Actor Class & Debug(2)  (42) 2023.12.05
3. Reflection System  (1) 2023.11.18
2. Vector & Rotator & Trigonometry  (0) 2023.11.18
1. Getting Start Unreal Engine  (2) 2023.11.18