網(wǎng)站費(fèi)用估算信息流廣告代理商排名
一、前言
? ? ? ? 委托分單播和多播,多播就是可以綁定多個(gè)回調(diào)函數(shù),然后一次性執(zhí)行。這樣也可以理解為啥多播沒(méi)有返回值,多個(gè)回調(diào)函數(shù)執(zhí)行后返回哪一個(gè)都是問(wèn)題啊。而事件呢官方官方文檔說(shuō)法是“對(duì)于事件而言,只有定義事件的類才能調(diào)用?Broadcast()
?函數(shù)”。這句話不是很理解,網(wǎng)上有解讀是說(shuō)事件的定義第一個(gè)參數(shù)就是類名,只有這個(gè)類可以調(diào)用后面的Broadcast()
?函數(shù),但我試了第一個(gè)參數(shù)是別的類也可以。
? ? ? ? 使用的虛幻版本為5.2.1,VS版本為2022.
二、實(shí)現(xiàn)
? ? ? ? 多播委托分為靜態(tài)多播委托和動(dòng)態(tài)多播委托,動(dòng)態(tài)多播委托允許在藍(lán)圖中使用,靜態(tài)不行。
2.1、靜態(tài)多播委托
? ? ? ? 首先定義一個(gè)靜態(tài)多播委托,如下,第一個(gè)參數(shù)為委托的名稱,第二個(gè)為參數(shù)類型。
//多播委托類聲明
DECLARE_MULTICAST_DELEGATE_OneParam(MulDelegate_OneParam, FString);//帶一個(gè)參數(shù)的
????????然后,再聲明委托的類型變量和綁定的方法
//多播代理聲明MulDelegate_OneParam MulDelegate_OneParam1;//多播委托綁定函數(shù)定義void MulDelegate_OneParamFunc1(FString strVal);void MulDelegate_OneParamFunc2(FString strVal);
????????實(shí)現(xiàn)多播綁定函數(shù),將讀取到的信息打印到屏幕上。
void ADelegateActor::MulDelegate_OneParamFunc1(FString strVal)
{FString tempStr = strVal.Append("1");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}void ADelegateActor::MulDelegate_OneParamFunc2(FString strVal)
{FString tempStr = strVal.Append("2");GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s"), *tempStr));
}
? ? ? ? 綁定和執(zhí)行
//多播代理的綁定MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc1);MulDelegate_OneParam1.AddUObject(this, &ADelegateActor::MulDelegate_OneParamFunc2);多播代理執(zhí)行MulDelegate_OneParam1.Broadcast("MulDelegate");
其他的方法可以參考單播委托的調(diào)用和使用。
2.2、動(dòng)態(tài)多播委托
? ? ? ? 動(dòng)態(tài)多播的聲明,注意:名稱一定要F開(kāi)頭不然會(huì)編譯報(bào)錯(cuò)“Delegate type declarations must start with F”。
//動(dòng)態(tài)多播委托,區(qū)別在于它可以暴露給藍(lán)圖,在藍(lán)圖中進(jìn)行事件的綁定
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDynamicMulDelegate, FString, param);//一個(gè)參數(shù)的動(dòng)態(tài)多播委托,名稱一定要F開(kāi)頭不然會(huì)編譯報(bào)錯(cuò)“Delegate type declarations must start with F”
動(dòng)態(tài)多播的變量聲明,要讓藍(lán)圖中調(diào)用因此需要“UPROPERTY”標(biāo)簽。
//動(dòng)態(tài)多播代理變量聲明UPROPERTY(BlueprintAssignable)//可以讓代理在藍(lán)圖中進(jìn)行綁定FDynamicMulDelegate DynamicMulDelegate;
? ? ? ? 編譯代碼成功后,在編輯器中創(chuàng)建動(dòng)態(tài)多播類的藍(lán)圖,然后在藍(lán)圖中輸入上述定義的變量名點(diǎn)擊“分配DynamicMulDelegate",這樣就能創(chuàng)建一個(gè)帶綁定的自定義藍(lán)圖事件,如圖2.2.1所示,然后在開(kāi)始函數(shù)時(shí)執(zhí)行動(dòng)態(tài)綁定。

調(diào)用還是再C++代碼中
動(dòng)態(tài)多播代理執(zhí)行DynamicMulDelegate.Broadcast("Dynamic Mul Cast");
2.3、事件
事件的聲明,第一個(gè)參數(shù)是類名,我這里使用了其他的原始C++類(不繼承任何虛幻類的類),第二個(gè)參數(shù)為事件的名稱,第三個(gè)為參數(shù)類型。
//事件聲明
DECLARE_EVENT_OneParam(MyRawClass, MyActionEvent1, FString);
定義事件的變量
//事件變量MyActionEvent1 ActionEvent;
事件的綁定和執(zhí)行
ActionEvent.AddUObject(this, &ADelegateActor::OneParamDelegateFunc);ActionEvent.Broadcast("Event Call");
三、總結(jié)
3.1、動(dòng)態(tài)多播委托的第一個(gè)參數(shù)名稱必須以”F“開(kāi)頭,否則會(huì)編譯報(bào)錯(cuò)。
3.2、事件和委托目前還未發(fā)現(xiàn)有什么不同之處,我定義事件時(shí)第一個(gè)參數(shù)為原始C++類,調(diào)用的時(shí)候在別的類也可以執(zhí)行,跟官方說(shuō)的不太一致。