【UnLua】Super繼承和override-創(chuàng)新互聯(lián)

【UnLua】Super 繼承和 override

這里一共有三部分

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了屏邊免費(fèi)建站歡迎大家使用!
  • UE 本身的繼承機(jī)制,包括 C++,藍(lán)圖
  • UnLua 實(shí)現(xiàn)的 UClass 綁定機(jī)制,Super 和 Overridden 機(jī)制
  • Lua 的 繼承機(jī)制
UE 繼承

提一下,因?yàn)橛锌?/p>

接下來用 C++ 偽代碼表示 藍(lán)圖代碼

一種常見情形,就是我基類BP_A綁定了 Lua 去覆寫邏輯,然后藍(lán)圖類派生了其他類,比如 DataOnly 藍(lán)圖只配置數(shù)據(jù)不寫邏輯,最后場景里只扔了派生類BP_C實(shí)例

這里有一點(diǎn)切記

有一點(diǎn)需要注意,BP_C和BP_B的GetModuleName不能有實(shí)現(xiàn),不然modulename就會(huì)變成“長度為0”的字符串了,那肯定不會(huì)調(diào)到

class BP_A : UnLuaInterface {GetModuleName =>"BP_A"; }
class BP_B : BP_A {GetModuleName =>""; }  // 派生,沒綁Lua
class BP_C_DataOnly : BP_B {GetModuleName =>""; }  // 派生,沒綁Lua

UE5 里 在 BP_C 里雙擊 GetModuleName 就會(huì)實(shí)現(xiàn) GetModuleName

在這里插入圖片描述

然后變成這樣,藍(lán)圖會(huì)有 * ,代表修改了,非??拥?/p>

在這里插入圖片描述

Lua 繼承

也提一下,但是純Lua 的 OOP 實(shí)現(xiàn)是一個(gè)經(jīng)典問題,在此不再復(fù)述

如果 BP_B 也要用 Lua 覆寫,那么 Lua 里也要繼承一下

有一個(gè)關(guān)鍵理解,就是 UnLua 并不是給所有 UClass 都找到對應(yīng)的 Lua Class 去綁定,也不是 Lua Class 構(gòu)造一個(gè) UClass 去繼承被覆寫的藍(lán)圖類的 UClass,而是:

  • 運(yùn)行時(shí)監(jiān)聽 UObject BP_B_Obj 創(chuàng)建
  • ModuleLocator =>GetModuleName =>require LuaModule ”BP_A.lua" //<= Note Here
  • Bind UClass BP_B,把 UFunction 覆寫掉,UFunctiuon->Invoke 以后都會(huì)走 Lua 實(shí)現(xiàn) // BindClass 會(huì)緩存,每個(gè) Class 只綁定一次
  • Bind UObject BP_B_Obj,創(chuàng)建一個(gè) Lua 對象,也就是self// BindObject,每個(gè) Object 綁定一次,銷毀 UObject 時(shí)銷毀 LuaObject,不銷毀 UClass

如果不希望 BP_B 綁定 Lua,步驟2 會(huì)返回 “BP_A.lua”

如果希望 BP_B 綁定 Lua,步驟2 會(huì)返回 “BP_B.lua”,而 BP_B LuaClass 在 Lua 中繼承了 BP_A LuaClass

---@class BP_A
local M = UnLua.Class()
-- ...

---@class BP_B
local M = UnLua.Class("BP_A") 
-- ...
代碼實(shí)例
  • ALS_Base_CharacterBP_C基類
  • ALS_AnimMan_CharacterBP_C派生類
---@type ALS_AnimMan_CharacterBP_C
local M = UnLua.Class("Game.AdvancedLocomotionV4.Blueprints.CharacterLogic.ALS_Base_CharacterBP")  -- 繼承 Lua 基類

function M:GetRollAnimation()
    print("GetRollAnimation")
    self.Super.GetRollAnimation(self)  -- 只會(huì)調(diào)用 Lua 基類實(shí)現(xiàn),Lua 基類沒有實(shí)現(xiàn) 則 self.Super.GetRollAnimation is nil
    self.Overridden.GetRollAnimation(self)  -- 調(diào)用 派生類藍(lán)圖實(shí)現(xiàn),Lua實(shí)現(xiàn) 覆寫了 藍(lán)圖實(shí)現(xiàn),藍(lán)圖的函數(shù)指針存在 self.Overridden 里
    local ReturnValue
    ReturnValue = nil
    return ReturnValue
end

return M
---@type ALS_Base_CharacterBP_C
local M = UnLua.Class()

function M:GetRollAnimation()
    print("GetRollAnimation")
    -- 基類 沒有 Super
    self.Overridden.GetRollAnimation(self)  -- 派生類實(shí)例,Lua 基類里 self.Overridden 還是會(huì)調(diào)用 派生類藍(lán)圖 實(shí)現(xiàn),不符合用意,這么用是錯(cuò)的
    local ReturnValue
    ReturnValue = nil
    return ReturnValue
end

return M
結(jié)論
  • Lua 中
    • self.Super 調(diào)用 Lua 基類實(shí)現(xiàn)
    • self.Overridden 調(diào)用 藍(lán)圖被覆寫的實(shí)現(xiàn)
  • 藍(lán)圖中
    • 藍(lán)圖節(jié)點(diǎn)Super調(diào)用直接跑基類藍(lán)圖實(shí)現(xiàn),不跑Lua實(shí)現(xiàn)
編程建議
  • 大部分情況下的安全做法
    • 不搞復(fù)雜的繼承機(jī)制,即 C++ OOP 那一套 virtual override
    • 只在藍(lán)圖類繼承樹的葉子節(jié)點(diǎn)綁定 Lua,寫邏輯,可以通過 self.Overridden 調(diào)用 藍(lán)圖實(shí)現(xiàn)
    • 在藍(lán)圖里使用Super節(jié)點(diǎn),能調(diào)用到藍(lán)圖/C++任意層級的實(shí)現(xiàn)
  • 兩層繼承
    • Lua 中, 派生類 要繼承 基類
    • 派生類 self.Super 能調(diào)用到基類 Lua 實(shí)現(xiàn)
    • 基類 self.Super is nil,并不會(huì)指向藍(lán)圖基類
    • 基類 Lua 實(shí)現(xiàn)中也不能有 self.Overriden,只會(huì)調(diào)用到派生類 藍(lán)圖實(shí)現(xiàn)
  • 三層以上繼承
    • 建議寫純 Lua,不要和藍(lán)圖混合編程,難以調(diào)試,容易出錯(cuò)
    • 不要用 self.Super.Foo,用 M.Foo,確定性地調(diào)用某個(gè) Lua 類的實(shí)現(xiàn)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前文章:【UnLua】Super繼承和override-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://muchs.cn/article32/depgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、外貿(mào)網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)Google、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)