'Unreal C++/TArray<int32> Sort'에 해당되는 글 1건

  1. 2017.11.22 TArray<int32> Sort example

언리얼 Blueprint Function Library를 사용하여 정수배열을 정렬하는 예


테스트 환경

  • Visual Studio C++
  • Unreal Engine 4



블루프린트 프로젝트를 생성한다


Content Browser에서 마우스 우측 > 새 C++ 클래스 > 부모클래스 선택 창에서 [모든 클래스] 항목에 체크하고 Blueprint Function Library 클래스를 검색하여 선택한다. 파일이름을 디폴트로 두고 [선택] 버튼을 누르면 잠시 후 Visual Studio 가 실행되고 헤더파일과 소스파일이 생성된다.

헤더파일과 소스파일에 아래의 내용을 추가하여 저장하고 빌드할 필요는 없다. 언리얼 에디터의 툴바에서 [컴파일] 버튼을 누르면 C++ 컴파일이 시작되고 그 결과 완료 혹은 실패 메시지가 나타난다. 문법적인 오류가 없다면 컴파일에 성공할 것이다.


헤더파일에 다음과 같이 선언한다(적색 부분은 디폴트 내용에 새로 추가된 내용)

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


#pragma once


#include "CoreMinimal.h"

#include "Kismet/BlueprintFunctionLibrary.h"

#include "MyBlueprintFunctionLibrary.generated.h"


UCLASS()

class BP_CPP_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary

{

GENERATED_BODY()


UFUNCTION(BlueprintCallable, Category="TestFunction")

static TArray<int32> sort(TArray<int32> arr);

};



소스파일에 다음과 같이 선언한다(적색 부분은 디폴트 내용에 새로 추가된 내용)

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


#include "MyBlueprintFunctionLibrary.h"


TArray<int32> UMyBlueprintFunctionLibrary::sort(TArray<int32> arr)

{

int tmp = 0;

for (int i = 0; i < arr.Num() - 1; i++) {

for (int j = i + 1; j < arr.Num(); j++) {

if (arr[i] > arr[j]) {

tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

}

}

return arr;

}



위에서 생성한 C++ 함수는 언리얼 엔진의 블루프린트 그래프에서 함수노드를 이용하여 사용할 수 있다. 





C++의 Object 파생클래스를 블루프린트에서 사용하는 예


블루프린트 프로젝트에서 C++ Object 파생클래스를 작성하는 절차는 위와 동일하지만 부모 클래스를 Object 로 설정하며 코드 상에서 UCLASS() 매크로를 추가하고 블루프린트에서 Construct Object from Class 노드를 사용하여 파생 클래스의 인스턴스를 생성한다는 점이 다르다


BlueprintFunctionLibrary 파생클래스를 사용하지 않고 Object 파생클래스를 사용해도 된다. BlueprintFunctionLibrary 도 아니고 Actor도 아닌 Object 파생클래스를 C++에서 작성하고 블루프린트에서 사용하려면 클래스 선언문 위에 UCLASS(Blueprintable, BlueprintType) 매크로를 추가해야 하며, 블루프린트에서 호출하려면 Construct Object from Class 노드를 사용하면 된다


Object 파생클래스의 헤더파일 (적색 부분은 Visual Studio에서 추가한 내용)

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


#pragma once


#include "CoreMinimal.h"

#include "UObject/NoExportTypes.h"

#include "VarTest.generated.h"


/**

 * 

 */

UCLASS(Blueprintable, BlueprintType)

class CONTAINERTESTMAP_API UVarTest : public UObject

{

GENERATED_BODY()


UFUNCTION(BlueprintCallable, Category = "VarTest")

TArray<int> sort(TArray<int> arr);

};



Object 파생클래스의 소스파일 (적색 부분은 Visual Studio에서 추가한 내용)

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


#include "VarTest.h"


TArray<int> UVarTest::sort(TArray<int> arr)

{

for (int i = 0; i < arr.Num()-1; i++)

{

for (int j = i + 1; j < arr.Num(); j++)

{

if (arr[i] > arr[j])

{

int tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

}

}

return arr;

}



Visual Studio에서 위처럼 작성했다면 저장하고 언리얼 에디터의 툴바에서 [컴파일]을 눌러 컴파일을 마치면 블루프린트에서 다음과 같이 Construct Object from Class 노드를 사용하여 인스턴스를 생성하고 그 멤버함수를 호출할 수가 있다



Posted by cwisky