利用C++擴充套件藍相簿函式
阿新 • • 發佈:2019-01-24
在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型別的陣列,之後呼叫我們寫好的函式,可參見下圖
執行效果如圖
總結
我們今天只是寫了一個隨機排序,大家可以根據需要寫出對陣列的各種排序。