免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

【UnLua】Super繼承和override-創新互聯

【UnLua】Super 繼承和 override

這里一共有三部分

網站建設哪家好,找成都創新互聯!專注于網頁設計、網站建設、微信開發、小程序設計、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了屏邊免費建站歡迎大家使用!
  • UE 本身的繼承機制,包括 C++,藍圖
  • UnLua 實現的 UClass 綁定機制,Super 和 Overridden 機制
  • Lua 的 繼承機制
UE 繼承

提一下,因為有坑

接下來用 C++ 偽代碼表示 藍圖代碼

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

這里有一點切記

有一點需要注意,BP_C和BP_B的GetModuleName不能有實現,不然modulename就會變成“長度為0”的字符串了,那肯定不會調到

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 就會實現 GetModuleName

在這里插入圖片描述

然后變成這樣,藍圖會有 * ,代表修改了,非常坑爹

在這里插入圖片描述

Lua 繼承

也提一下,但是純Lua 的 OOP 實現是一個經典問題,在此不再復述

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

有一個關鍵理解,就是 UnLua 并不是給所有 UClass 都找到對應的 Lua Class 去綁定,也不是 Lua Class 構造一個 UClass 去繼承被覆寫的藍圖類的 UClass,而是:

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

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

如果希望 BP_B 綁定 Lua,步驟2 會返回 “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") 
-- ...
代碼實例
  • 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)  -- 只會調用 Lua 基類實現,Lua 基類沒有實現 則 self.Super.GetRollAnimation is nil
    self.Overridden.GetRollAnimation(self)  -- 調用 派生類藍圖實現,Lua實現 覆寫了 藍圖實現,藍圖的函數指針存在 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)  -- 派生類實例,Lua 基類里 self.Overridden 還是會調用 派生類藍圖 實現,不符合用意,這么用是錯的
    local ReturnValue
    ReturnValue = nil
    return ReturnValue
end

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

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前文章:【UnLua】Super繼承和override-創新互聯
網站地址:http://m.newbst.com/article32/depgsc.html

成都網站建設公司_創新互聯,為您提供外貿建站外貿網站建設品牌網站設計電子商務Google網站改版

廣告

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

h5響應式網站建設