第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用 setmetatable 圍繞 C# 對(duì)象創(chuàng)建 Lua 包裝器類

如何使用 setmetatable 圍繞 C# 對(duì)象創(chuàng)建 Lua 包裝器類

Go
繁華開滿天機(jī) 2022-12-24 10:10:16
我正在為我目前正在使用 C# 開發(fā)的游戲創(chuàng)建一些 UI,并希望將所有內(nèi)容公開給 Lua,以便我的美工人員無需在代碼中執(zhí)行任何操作即可進(jìn)行小的調(diào)整。我正在使用 MoonSharp 將 Lua 腳本集成到我的項(xiàng)目中。這是我目前擁有的 UIElement 包裝器類:UIElement = {};UIElement.__index = UIElement;setmetatable( UIElement, { __index = function( self, key )  local codeElement = rawget( self, "__codeElement" );  local field = codeElement and codeElement[key];  if type( field ) == "function" then   return function( obj, ... )    if obj == self then     return field( codeElement, ... );    else     return field( obj, ... )    end   end;  else   return field;  end end, __call = function( cls, ... )  return cls.new( ... ); end,} );function UIElement.new() local self = setmetatable( {}, UIElement ); self.__codeElement = BLU_UIElement.__new(); return self;endBLU_UIElement是我的 C# 類,它通過 MoonSharp API 公開給 Lua。它在直接操作對(duì)象時(shí)可以正常工作,并具有 SetPos、SetColor 等功能。UIElement旨在成為我在 Lua 中的“類”,以包裝和擴(kuò)展我的 C# 對(duì)象。當(dāng)我在腳本的其他地方實(shí)例化一個(gè) UIElement 并嘗試調(diào)用一個(gè)函數(shù)(例如 SetPos)時(shí),它確實(shí)正確地進(jìn)入了 __index 函數(shù)。但是,rawget 調(diào)用始終返回 nil。它似乎也不是特定于 BLU_UIElement 的。我已經(jīng)嘗試了一些非常簡(jiǎn)單的事情,比如在構(gòu)造函數(shù)中添加一個(gè)字符串 ID 值并嘗試在 __index 函數(shù)中對(duì)其進(jìn)行 rawget,但它也返回 nil。我假設(shè)我只是做了一些不正確的事情,在類或?qū)ο蟊旧砩显O(shè)置了亞穩(wěn)態(tài),但我不確定問題出在哪里。我一直在這里查看:http: //lua-users.org/wiki/ObjectOrientationTutorial以了解我做錯(cuò)了什么,但我什么也沒想到。我很欣賞這方面的任何指導(dǎo),我已經(jīng)研究了幾天但沒有弄清楚,并且在線搜索通常只會(huì)顯示與我已經(jīng)在做的類似的代碼。
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

我有一個(gè)朋友,他對(duì) Lua 元表的經(jīng)驗(yàn)比我看的要豐富得多。在這里發(fā)布答案以防它幫助其他人。


問題是我試圖將 UIElement 表用作“類”表和“對(duì)象”元表。在 __index 函數(shù)內(nèi)調(diào)用 rawget 時(shí),它試圖在 UIElement 表中查找內(nèi)容,而不是在 UIElement.new() 中創(chuàng)建的自身表中查找內(nèi)容。將這兩個(gè)拆分成不同的表(一個(gè)用于類,一個(gè)用于對(duì)象元表)固定的東西。


這是我更新的工作代碼:


UIElement = {};

setmetatable( UIElement, {

    __call = function( cls, ... )

        return cls.new( ... );

    end,

} );


UIElement.objectMetaTable = {

    __index = function( self, key )

        local objectValue = rawget(self, key);

        if objectValue ~= nil then

            return objectValue;

        end


        local classValue = UIElement[key];

        if classValue ~= nil then

            return classValue;

        end


        local codeElement = rawget(self, "__codeElement");

        if codeElement then

            return codeElement[key];

        end

    end,

};


function UIElement.new()

    local newInstance = setmetatable( { id = "blah" }, UIElement.objectMetaTable );

    newInstance.__codeElement = BLU_UIElement.__new();

    return newInstance;

end


查看完整回答
反對(duì) 回復(fù) 2022-12-24
?
飲歌長(zhǎng)嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

我必須承認(rèn)我不完全確定,你試圖通過在 LUA 而不是 C# 中編寫包裝類然后公開該類型來實(shí)現(xiàn)什么,但我注意到了這一點(diǎn):


對(duì)我來說,NativeClass .__new() 從來沒有在 MoonSharp 中成功過,就像你試圖在


self.__codeElement = BLU_UIElement.__new();

出于這個(gè)原因,我為我的本地類創(chuàng)建了自定義構(gòu)造函數(shù),并將它們作為委托傳遞給全局命名空間(盡管它的類型必須注冊(cè))。它看起來很像您通常會(huì)構(gòu)造一個(gè)對(duì)象。只是沒有 new 關(guān)鍵字:


在 C# 中


public NativeClass{


   public static NativeClass construct()

   {

      return new NativeClass();

   }


}

將靜態(tài)方法作為委托傳遞給腳本:


script["NativeClass"] = (Func<NativeClass>)NativeClass.construct;

然后你可以在 MoonSharp 中創(chuàng)建一個(gè)像這樣的新實(shí)例:


x = NativeClass()

編輯:所以沒有讀到你試圖用字符串來做到這一點(diǎn)。也許您應(yīng)該考慮不在 LUA 中編寫包裝類,而在 C# 中編寫,或者是否有禁止這樣做的原因?


查看完整回答
反對(duì) 回復(fù) 2022-12-24
  • 2 回答
  • 0 關(guān)注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)