XLua 重寫C 的一些注意

2021-08-17 15:06:12 字數 2316 閱讀 2315

這兩天正在學習xlua,正好線上版本有個bug需要熱更**。將幾個方法用lua進行了重寫,這裡記錄了幾個作為乙個lua新手遇到的幾個問題。

首先是重寫如下c#方法,該方法在basedance類裡面,命名空間為dance。

private vector3 getrankpos(int index, int count) 

if(count == 3 || count == 2)

if(index == 2)

}return new vector3(-0.8f, 0, -2f);

}

對應的lua為

xlua.hotfix(cs.dance.basedance, 'getrankpos', function(self, index, count)

if index == 0 then

return cs.unityengine.vector3.zero;

endif count == 3 or count == 2 then

if index == 1 then

return cs.unityengine.vector3(1.7, 0, -1);

endif index == 2 then

return cs.unityengine.vector3(-1.7, 0, -1);

endend

return cs.unityengine.vector3(-0.8, 0, -2);

end)

先來看看官方給的xlua的幾個api,api鏈結

可以知道,我們現在要替換c#方法需要使用xlua.hotfix的api,第乙個引數及getrankpos所在的類(帶命名空間,以cs.開頭)即cs.dance.basedance,第二個引數為方法名的string,即getrankpos,第三個引數及對應的重寫方法function了,要注意的是function重寫方面裡面的引數,第乙個應該為self,後面的引數為原方法的引數。即function(self, index, count) end。

這個方法裡面還需要注意的一點是,c#例項乙個物件使用new欄位,但是lua語言則不能新增new(因為lua中不存在類)。同時用到c#類的時候,不管是系統的還是自定義的同樣需要已cs.namespace.classname

的形式寫

同時由於上述方法是private私有的。重寫該方法時必須讓其變為public公有的才行。根據api,我們還應該加上下面這一句

xlua.private_accessible(cs.dance.basedance);
接下去需要新增乙個變數,然後在如下方法給該變數賦值:

原c#**

protected virtual void loadstage()
對應的lua**

local m_isallscrorezero;

xlua.hotfix(cs.dance.basedance, "loadstage", function(self)

self.stageasset = cs.common.modelassetitem(cs.common.modelassethelp.subfolder_stage, self.danceparam.stagename);

self.stageasset:loadmodel(function ()

self:loadstagefinish();

end);

m_isallscrorezero = true;

end)

這邊需要注意的是,首先在lua**中呼叫原c#類自帶的屬性方法是,需要使用self欄位。其中呼叫方法self:methodname()等同於self.methodname(self)。還有就是我們可以注意到loadmodel方法其實傳的是乙個action引數,即穿了乙個方法。而在lua中,不能直接self.stageasset:loadmodel(self:loadstagefinish());否則會報出如下錯誤:luaexception: c# exception:the object you want to instantiate is null.,stack:  at unityengine.object.checknullargument。所以我們可以如上巢狀乙個function來解決。

除了上面這些,還發現當lua呼叫c#的mathf.clamp01(float)方法時,無法返回到正確的值,一直是0.0。所以需要自己重新處理下。

C 一些注意的地方

1 vector記憶體分配策略 以最小的代價連續儲存,每當vector不得不分配新的儲存空間時,以加倍當前容量的分配策略實現重新分配 2 類 必須對任何const或引用型別成員以及沒有預設建構函式的類型別的任何成員使用初始化式 建構函式初始化列表。3 explicit 抑制由建構函式定義的隱式轉換,...

C 的一些注意事項

1 類的構造 假定myclass是乙個自定義類,則當執行 myclass a 3 p 2 實際上執行建構函式的次數只有3次,也就是物件指標陣列不會引起執行建構函式。2 常資料成員 對於常資料成員,可以在宣告時一併初始化 c 11 也可以在建構函式內初始化。但是,不能不初始化。在宣告時初始化之後則無法...

c 一些注意事項

1.long int的位元組資訊 int在32位系統下是4位元組,long在32位也是4位元組,在64位int不變,但是long變成8位元組,所以我們的編譯器不同可能會導致我們處理int,long不同 2.注意c 有時候的強制型別轉換 注意最大最小值是不一樣的,int max 231 1 或 int...