什么是委托?
我們先來看看官方的解釋:
委托 是一種泛型但型別安全的方式,可在C++物件上呼叫成員函式,可使用委托動態系結到任意物件的成員函式,之后在該物件上呼叫函式,即使呼叫程式不知物件型別也可進行操作,復制委托物件很安全,你也可以利用值傳遞委托,但這樣操作需要在堆上分配記憶體,因此通常并不推薦,請盡量通過參考傳遞委托,虛幻引擎共支持三種型別的委托:單播委托,多播委托,和動態委托,
光是看定義可能不是很好理解,我們知道在計網中,單播和多播的意思是主機之間的一對一或者多對多通訊,在UE4中我們沒有主機,所以并不是計網中的意思
單播委托的意思就是可以使用一個Actor事件系結到另外一個Actor某個函式,即可以呼叫不知道該物件型別的函式,
(圖取自B站up唯樂來了)
對于實作一個開關門/燈的程序來說,就是我們可以設定一個Trigger,通過系結Trigger與門,來實作當碰撞觸發或者重疊觸發等事件只要觸發Trigger以后就可以呼叫到門的函式,從而來實作開關門,
就這這個例子,我們來看看委托是如何實作的:
加入當一個委托被建立完畢之后,它不會通過Trigger直接把委托資訊傳送給門,而是先會把委托資訊傳遞給一個管理委托系統,通過管理委托系統再將資訊傳遞給系結委托的物體,這里使用管理委托的原因很簡單,當一個游戲中所需要委托太多,如果不使用一個系統對其進行管理,那將會變得非常的混亂,
首先我們要知道管理委托的系統在UE4中叫做宣告委托
為了宣告委托,我們要設定一個默認的GameMode,將宣告委托放在里面,

我們要做的是,新建一個GameMode(一般新建專案都會有,直接用),然后記得,打開你的地圖,WorldSettting里面把GameMode改成自己的GameMode(默認是無)這里非常重要!
然后如黃色框所示,我們需要宣告一個委托,第一個引數是委托名,委托名是自己可定義的,至于如果你所需要宣告的委托需要傳引數,就在后面添加_XXXParam(XXX指需要傳引數的個數),如果要宣告多播就在中間加上_MULTICAST,
這樣我們就知道,我們黃色部分宣告的是一個 多播的,有一個bool引數的,委托名為FMyTrigger(為了符合UE中命名規則,前面加上F)的委托,
宣告完之后,我們在紅色部分對于進行實體化(使用Public關鍵字,因為我們希望其他類對他進行呼叫)
宣告完委托以后,我們就要對委托進行系結了,
我們首先新建一個名為MyDoor的Actor,然后在其中加入StaticMeshComponent,然后我們定義一個DoorState函式,當Trigger事件觸發之后,我們呼叫DoorState函式,用來對門進行開關,

MyDoor.Cpp實作:

這里重點講解下紅色框部分,
我們要系結某個函式首先就要先找到我們的委托名,我們的委托名定義在自定義的GameMode里面
所以我們使用GetWorld()再使用GetGamoMode得到GameMode的父類AGameModeBase,再通過Cast<>操作得到繼承自AGameModeBase的我們的子類AUE_ProjectGameModeBase.
要實作系結,我們只需要再MyTrigger執行特定的方法:這里是多播系結,所以使用的是AddUObject(,)后面的引數是傳遞函式的參考
當然,對于單播委托,還有更多的系結方法:

這里的OpenDoor和CloseDoor函式,我們想通過藍圖實作從而達到漸漸開門的效果,藍圖實作如下:

至此,我們的委托系結就已經完成了,
我們再來看看如何執行委托

在上面一個藍色框,我們定義了一個BoxComponent用來得到碰撞事件,從而觸發委托,在紅色框是我們的執行委托函式,這里我們要傳遞一個引數value(這也是為什么我們開始宣告時需要宣告一個引數的原因)

執行委托部分,我們也要呼叫自己的委托關鍵字,所以前面與系結委托一致,就不再贅述,唯一不同的地方就是紅色框,這里我們時多播,所以執行的時Broadcast,這會把資訊廣播給所有已經系結的物件,如果是單播時有如下:

當然,我們最后僅僅只是把執行廣播寫在了碰撞事件里面,我們要完成執行還需要重寫碰撞事件(上上圖藍色框):

這里我們將BeginOverlap和EndOverlap分別系結到我們寫的函式上,
你會發現在我這里會有很多的引數,雖然都用不到,但是這里的引數的必須的(還沒搞清楚為什么)
要怎么得到這個引數呢?我們已BeginOverlap為例,我們使用IDE自帶的查看詳細代碼的功能(ctrl+ 滑鼠左鍵),
我們打開OnComponentBeginOverlap(如下圖紅色框所示)

打開之后我們發現它其實也是一個東西的實體,我們再對這個進行打開

得到這個后綴為SixParams的東西的宣告,我們取它的后12位引數(引數的名字與型別是分開的,實際上我們需要6個實際的引數)再放到自己定義的函式里面,作為默認引數就可以了,

注:這里不是每一個事件都一樣,如EndOverlap,我們打開之后如下,選擇只有四個引數的

至此委托就已經介紹完畢,如果還是看不懂這個程序,可以查看本文第二個參考鏈接的一位Up主的視頻,
參考鏈接:
Delegates and Lamba Functions in Unreal Engine | 虛幻引擎5.0檔案
【ue4_C++】用委托(代理)實作開門、開燈效果_虛幻引擎_C++_藍圖_嗶哩嗶哩_bilibili
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506554.html
標籤:其他
