一、前言
? ? ? ? 除了上一章C++變量與藍圖通信講的變量能與藍圖通信外,還有函數和枚舉也可以和藍圖通信。函數的關鍵字為”UFUNCTION“、枚舉的關鍵字為”UENUM“。
二、實現
2.1、BlueprintCallable藍圖中調用
??該函數時帶執行的,帶入如下。編譯成功后在藍圖中輸入后可以找到,并點擊使用如圖2.1.1所示
/// <summary>/// 暴露該函數可在藍圖中調用/// </summary>UFUNCTION(BlueprintCallable, Category = "MyFunction")void BlueprintCallable1();

2.2、BlueprintPure藍圖中的純函數
? ? ? ? 代碼如下,其在藍圖中的形式如圖2.2.1所示,它是一個純函數和圖2.1.1不同的是它沒有左右
/// <summary>/// 可在藍圖中調用的純函數的定義/// </summary>UFUNCTION(BlueprintPure, Category = "MyFunction")bool BlueprintPure2();

兩邊的執行引腳。
2.3、BlueprintImplementableEvent
????????在C++中聲明藍圖中實現,在藍圖中可重載,可以有參數和返回值,無返回值的是事件,有返回值的是函數。
1、沒有返回值和參數
? ? ? ? 定義的代碼如下所示,
UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent1();
然后在藍圖中它會作為事件添加到藍圖中使用,如圖2.3.1所示:

該事件可以在C++代碼中調用
void AMyPawn1::BeginPlay()
{Super::BeginPlay();ImplementableEvent1();
}
2、只有返回值
只有返回值的在藍圖中會作為函數,如圖2.3.2所示,同時這個函數可以在藍圖中被重寫
UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent2();

但是在藍圖還無法調用它,需要添加”Blueprint Callable“關鍵字,如下代碼,注意兩個關鍵字的順

UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)int32 ImplementableEvent2();
序,如果把Blueprint Callable“關鍵字放在后面編譯不通過。增加關鍵字后的藍圖中可以調用,如圖2.3.4所示:

3、只有參數
代碼如下所示,添加一個帶參數的,這個效果和圖2.3.1中的類似,不同之處是這里會帶參數,如圖2.3.4所示:
UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent3(const FString& myStr);

4、參數和返回值都有
代碼如下所示,其效果和圖2.3.2所示類似,區別之處在于此處是帶輸入參數的。
UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent4(const FString& myStr);
2.4、BlueprintNativeEvent
? ? ? ??在C++中聲明和實現,藍圖可重載,函數實現的后面要加Implementation,否則會編譯出錯,但是在調用的時候還是用聲明時的名字。無返回值的是事件,有返回值的是函數。代碼如下
UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent1();UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent2();UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent3(const FString& myStr);UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent4(const FString& myStr);
實現的代碼如下,又返回值的必須返回一個值。
void AMyPawn1::BlueprintNativeEvent1_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("這是一個C++代碼寫的BlueprintNativeEvent事件"));
}int32 AMyPawn1::BlueprintNativeEvent2_Implementation()
{return 0;
}void AMyPawn1::BlueprintNativeEvent3_Implementation(const FString& myStr)
{}int32 AMyPawn1::BlueprintNativeEvent4_Implementation(const FString& myStr)
{return 0;
}
2.5、Meta元素說明符
該函數定義如下,而且必須實現,通過meta關鍵字實現其在藍圖中的名稱改為“MyPrintTest”
//元數據說明符,也即別名,在藍圖中會顯示DisplayName定義的名字UFUNCTION(BlueprintCallable, Category = "MyFunction", meta = (DisplayName = "MyPrintTest"))void PrintMeta();
2.6、枚舉
首先定義一個宏,代碼如下,生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項。如圖2.6.1所示
UENUM(BlueprintType)//生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};
}

在藍圖中創建一個新的變量,變量的類型中可以選中C++代碼中創建的這個枚舉。同時,在藍圖中也可以調用該枚舉,如圖2.6.2所示:

通過以下代碼可以實現在各類面板和藍圖中使用該變量
//枚舉UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum")TEnumAsByte<MyEnumType::MyCustomEnum> MyCustomEnum;
同時也可以在藍圖中調用和編輯該變量,如圖2.6.3所示

通常一個定義里只能有一個枚舉,如下代碼中會編譯不通過,在MyEnumType中只能定義一個。
UENUM(BlueprintType)
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};enum MyEnum2{One, Two, Three,};
}
三、總結
3.1、BlueprintImplementableEvent的函數在C++代碼中只需要聲明不需要實現。
3.2、BlueprintNativeEvent的函數在C++代碼中聲明了還必須實現,不實現會編譯報錯。實現中的函數名稱后總有加上”_Implementation“,但是在調用的時候又要去掉”_Implementation“,這樣才能在藍圖中被調用,使用帶后綴”_Implementation“的只會在C++中調用,而藍圖中不會被調用。
3.3、”Blueprint Callable“關鍵字通常是放在前面的,如果放在后面可能會編譯不通過。
3.4、BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項。
3.5、枚舉的定義中只能定義一個枚舉,多個會編譯不通過。