언리얼에서 오브젝트가 추가 될때 호출 되는 함수는 PostInitProperties()

프로퍼티가 수정될때 호출되는 함수는 PostEditChangeProperties()

위 두함수는 AMyActor의 부모클래스인 AActor에서 상속 받은 함수이기때문에 부모클래스의 함수를 자식클래스에서 덮어쓴다는 의미로 virtual override 키워드를 함께 사용해줘야합니다. 컨트롤 + Dot(.)을 누를 시 cpp에 함수를 정의해줍니다.

Super::PostInitProperties()

Super 클래스는 클래스가 상속받은 부모 클래스에 있는 기본 프로퍼티나 함수를 가져오는데 사용되는 키워드입니다.

이런작업을 해주는 이유는 전에 부터 하는 작업을 다시하도록 만든것입니다. 함수 또한 블루프린터에서 볼 수 있도록 설정하려면 UFUNCTION을 이용한다.

(BlueprintCallable 라고 설정하고 Category = "~"를 반드시 적어줘야합니다.

 

블루프린터에서 디자이너와 협력 시 디자이너가 만들어논걸 기능 구현을 하는 방법은 두가지가 있습니다.

첫 번째로 블루프린트 맨터블 방식 헤더에서만 함수선언 UFUNCTION에서 BlueprintImplementable 를 사용합니다. 요기서 알 수 있듯이 언리얼은 자체 함수의 기능이 관련있는건 앞에 이름이 붙는거 같습니다. Event를 설정 후 함수 형식의 기본 이름 반환형만 설정 후 블루프린터로 갑니다. (cpp엔 정의 안합니다.) 그리고 블루프린터에서 오른쪽 클릭 자신이 정한 카테고리에 있는 함수 이름을 생성해 블루프린터에서 기능을 구현합니다. 디자이너가 블루프린터로 만든 기능을 프로그래머가 cpp파일로 호출 하는 방식, 블루프린터에서 기능을 만들어놓지 않으면 빈 함수를 호출하는 방식으로 동작하게 됩니다.

두 번째로 블루프린트네이티브 이벤트 지정자는 디자이너가 블루프린터로 기능을 만들 수 있게하면서 만약 디자이너가 블루프린터에서 기능을 구현하지 않으면 동작할 기본 기능을 프로그래머가 cpp로 만들 수 있게 됩니다. 

BlueprintNativeEvent를 사용합니다. 그리고 virtual void 함수이름_Implementation 가상 함수를 구현해주고 cpp에 기본 기능을 구현한 함수를 정의해줍니다. 이런식으로 하면 블루프린트내에서 구현하지 않아도 cpp에 구현해논 함수가 작동합니다.

하지만 기본 함수와 블루프린터에서 작동하고 하고 있는 함수 둘 다 호출하고 싶을땐 함수이벤트 생성 후 함수 이벤트에 오른쪽 클릭 부모 함수의 호출 추가를 누르면 부모:함수 이름을 가진 노드가 생성됩니다. 그리고 호출 순서를 생각하여 하고 싶은대로 이어주면 됩니다. 이런식으로 협업의 용이합니다.

'프로그래밍 공부 > 언리얼 4' 카테고리의 다른 글

Unreal 4 입문 #2  (0) 2021.07.21
Unreal 4 입문 #1  (0) 2021.07.20

UPROPERTY() 매크로

UPROPERTY()
	int32 IntVar;

이렇게 변수의 기본형으로 사용합니다. UPROPERTY 매크로의 역할은 프로퍼티가 있음을 알리고 연결되었을때 어떻게 동작할지 지정하기 위한 것입니다.

그리고 보통 short , int , long을 알고 있는데 이런 타입은 플랫폼마다 길이가 달라질 수 있기 때문에 언리얼엔진에서는 길이가 고정되있는 타입으로 int8, int16, int32, int64 int 뒤 숫자는 정수를 표현하는데 몇개의 비트를 사용할것인지를 의미합니다.

int8 - 127 ~ -128,

int16 - 32,767 ~ -32,768

int32 - 214,648,647 ~ -214,648,648

int64 - 9,223,372,036,854,775,807 ~ -9,223,372,036,854,775,808

까지 표현가능합니다. 만약 해당 변수가 숫자를 음수로 표현할 필요가 없다면 int 대신 uint 등으로 사용 가능합니다. 음수의 범위를 양수의 범위로 대체되어 2배만큼 표현이 가능해집니다.

uint8 - 0 ~ 255

uint16 - 0 ~ 65,535

uint32 - 0 ~ 4,294,967,295

uint64 - 0 ~ 18,446,744,073,709,551,615

까지 표현할 수 있습니다. 이렇게 정수타입을 사용할때는 크기를 잘 생각해서 어느타입을 사용할지 결정하면 됩니다.

만약 int8 변수에 127에서 +1 할시 -128 오버플로우 (Overflow)

-128에서 -1을 해버리면 127 언더플로우(Underflow) 라고 부릅니다.

게임에서 돈을 모았는데 어느순간 0이나 -가 되어버리는 문제등이 발생하게 됩니다. 그게 바로 위 문제때문에 발생합니다. 

위 문제를 없애기 위해 uint64를 사용하게 된다면 메모리 낭비가 심해집니다. 최적화를 위해 적절한 범위를 사용하는게 관건인것 같습니다.

만약 그 범위를 가늠할수 없다면 예외 처리를 통해서 그 숫자 범위를 벗어나지 못하도록 하는것이 좋습니다. 예를 들어 돈을 소지한도를 설정해논 사례인것 같습니다.

그다음은 float 부동소수점 입니다. float, double 이 있는데 float 32 비트 double은 64 비트의 크기를 가지고 float은 5자리 소숫점 정밀도, double 은 두배인 10자리의 소숫점 정밀도를 가집니다.

다음은 문자열 입니다. c++에선 std string을 사용하고 언리얼 cpp에서는 필요에 따라서 여러가지 클래스로 문자열을 제공합니다. 가장 기본 타입은 FString 변수이름; 타입입니다. 저장되는 글자의 숫자에 따라서 변수의 길이가 자동으로 달라지는 타입으로 기본 Cpp의 std string 과 유사하게 동작합니다. 하지만 보통 string에선 " "안에 바로 상소 문자열을 적어서 바로 넣지만 FString에서는 텍스트 매크로를 사용해야합니다. 이외에도 현지화 텍스트를 위해서 사용하는 FTest, 자주 사용되는 문자열을 식별자로 지정해서 문자열을 비교할때 소모되는 메모리와 CPU 시간을 절약하는데 쓰이는 FName, 플랫폼마다 다를 수 있는 문자열 세트와 상관없이 문자열을 저장하는 용도로 사용되는 TCHAR가 있습니다.

FString을 제외한 타입은 나중에 필요 시 다룬다고 합니다. 그리고 bool 이 있습니다.

그리고 public , private , protected 공개 범위를 적용 시 변수 앞이 아닌

public: (접근 지정자를 지정하여 작성합니다. 다음 접근 지정자를 정하기 전까지 public이 됩니다.)

하지만 유니티처럼 퍼블릭 설정을 해도 디테일 패널에서 수정 및 볼 수 있지 않습니다. 이때 UPROPERRTY를 사용합니다.

  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
  	int32 TotalDamage;
  UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
  	float DamagePerSecond;

EditAnywhere - 양쪽 모두의 프로퍼티 창에서 편집 할 수 있음을 의미합니다.

VisibleAnywhere - 프로퍼티 창에서 보이지만 편집을 불가하게 합니다.

 

BlueprintReadWrite - 블루프린트에서 읽기, 쓰기를 모두 가능하다는 뜻입니다.

BlueprintReadOnly - 블루프린트에서 읽기만 가능

 

Transient - 해당 프로퍼티가 휘발성 프로퍼티로 저장되지 않음을 의미합니다.

 

Category = " " - 블루프린트 편집 툴, 디테일 패널에서 이 프로퍼티를 데미지라는 카테고리로 묶어서 보여준다는 뜻입니다. 밀접한 관계를 가진 프로퍼티들은 같은 카테고리로 묶어줄 시 작업할때 빠르게 찾을 수 있습니다.

MyActor 생성자 소스 파일에서 프로퍼티를 초기화 해줍니다 두가지 방법이 있습니다.

AMyActor::AMyActor() 
: TotalDamage(200), DamageTimeInSeconds(1.0f), CharacterName(TEXT("탄산수")), bAttackable(true)
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	TotalDamage = 200;
	DamageTimeInSeconds = 1.0f;
	CharacterName = TEXT("레몬");
	bAttackable = true;
}

두가지 방법 중 선호하는 방법을 사용하면 됩니다.

스크립트 한글이 깨져서 컴파일 오류가 뜹니다 이경우 (1) 스크립트 한글 깨짐 문제 해결하기 | 언리얼 4 - YouTube

영상을 보고 해결하면 됩니다.

'프로그래밍 공부 > 언리얼 4' 카테고리의 다른 글

Unreal 4 입문 #3  (0) 2021.07.29
Unreal 4 입문 #1  (0) 2021.07.20

입문 Unreal 4 강의를 따라 작성됐습니다.

클래스와 이름이름과 같은 이름을 가진 생성자 Awake

This 객체가 생성될때 호출되는 함수이며 주로 생성된 액터의 변수의 기본값을 설정해주는데 사용됩니다.

BeginPlay 함수

This 객체가 월드에 스폰되었을때 한번 실행되는 함수로 게임 플레이어 로직을 초기화하는데 사용

Tick 함수

매 프레임마다 호출되는 함수, Tick 함수에 DeltTime 매개 변수는 전에 호출된 이후로 얼마나 시간이 경과한 뒤에 다시 Tick가 호출되었는지에 대한 시간을 전달받을 수 있습니다. 주로 게임의 로직을 구현하는데 사용됩니다. 하지만 매 프레임마다 호출되는 Tick 함수가 불필요한 경우 지워 포퍼먼스를 상승시킬 수 있습니다. 방법은 헤더 파일과 소스 파일에서 Tick 함수를 제거 소스 파일 생성자에서 PrimaryActorTick.bCanEverTck = true; 제거해주면 됩니다. 앞에서 지운 생성자에 있는 명령어는 액터가 Tick 함수를 매프레임마다 호출하도록 설정하는 코드입니다.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"

UCLASS()
class KIMUNREAL_API ACameraDirector : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ACameraDirector();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
};
// Fill out your copyright notice in the Description page of Project Settings.


#include "CameraDirector.h"
#include <Kismet/GameplayStatics.h>

// Sets default values
ACameraDirector::ACameraDirector()
{
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void ACameraDirector::BeginPlay()
{
	Super::BeginPlay();
}

// Called every frame
void ACameraDirector::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

액터 Cpp 클래스 생성 시 기본 형태입니다.

UE_LOG(LogTemp, Log, TEXT("")); 언리얼 엔진에서 로그를 남기는 함수

로그를 보는 방법은 창 -> 개발자 툴 -> 출력 로그 창을 켜줘야합니다.

'프로그래밍 공부 > 언리얼 4' 카테고리의 다른 글

Unreal 4 입문 #3  (0) 2021.07.29
Unreal 4 입문 #2  (0) 2021.07.21

+ Recent posts