1. 程式人生 > >利用C++擴充套件藍相簿函式

利用C++擴充套件藍相簿函式

在UE4中藍圖本身已經非常強大,但是並沒有強大到沒有任何缺陷  --Mantra

如果你也遇到了上面的問題,可以繼續往下看,我們接下來就會用C++擴充套件已有的藍圖功能。

首先需要建立一個特殊的C++類(需要繼承自BlueprintFunctionLibrary),具體操作可以見下圖


建立完成後會編譯工程原始碼並且會自動開啟VS(筆者用的是VS15),接下來我們編輯自定義功能。在做一個完整的功能之前最好先做測試,所以我們首先會寫一個簡單的函式來做測試(至於程式碼中出現的UFUNCTION之類的巨集就不多做解釋啦)

有幾個點需要注意一下:

1)函式需要使用UFUNCTION進行修飾,否則藍圖無法呼叫

2)函式需要使用static修飾

3)一般定義成public,方便外部訪問

案例一:測試函式

public:
	// 測試函式,主要用來測試
	UFUNCTION(BlueprintCallable, Category = "Mantra|Tool")
		static void GetCurrentActorInfo(AActor* Actor);
void UMyBlueprintFunctionLibrary::GetCurrentActorInfo(AActor* Actor)
{
	// 測試兩種列印方式
	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Blue, TEXT("Function Called"));
	}

	UE_LOG(LogTemp, Warning, TEXT("Called Function"));
}

在藍圖中的效果


案例2:對一個數組進行隨機排序

主要程式碼如下:

UFUNCTION(BlueprintPure, Category = "Mantra|Tool")
		static TArray<int32> RandomizeIntArray(const TArray<int32> InArray);

	UFUNCTION(BlueprintCallable, Category = "Mantra|Tool")
		static void PrintArrayElement(const TArray<int32> InArray);

TArray<int32> UMyBlueprintFunctionLibrary::RandomizeIntArray(const TArray<int32> InArray)
{
	TArray<int32> NewArray = InArray;
	int32 temp;
	float randomNumber;

	// 利用排序演算法對陣列進行排序操作
	for (int32 i = NewArray.Num(); i > 1; --i)
	{
		randomNumber = FMath::RandRange(0, i - 1);
		temp = NewArray[FMath::FloorToInt(randomNumber)];
		NewArray[FMath::FloorToInt(randomNumber)] = NewArray[i - 1];
		NewArray[i - 1] = temp;
	}
	return NewArray;
}

void UMyBlueprintFunctionLibrary::PrintArrayElement(const TArray<int32> InArray)
{
	for (int32 i = 0; i < InArray.Num(); ++i)
	{
		UE_LOG(LogTemp, Warning, TEXT("Current Number is %d"), InArray[i]);
	}
}

主要功能已經完成,接下來測試

在關卡藍圖中建立Int型別的陣列,之後呼叫我們寫好的函式,可參見下圖


執行效果如圖


總結

我們今天只是寫了一個隨機排序,大家可以根據需要寫出對陣列的各種排序。