xLua筆記

Generate Code干了什么

肉眼可見的,在Asset文件夾生成了XLua/Gen文件夾,里面有一些腳本。然后對加了[CSharpCallLua]的變量尋找引用,發現它被XLua/Gen/DelegatesGensBridge引用了。也可以在這里查哪些類型加了[CSharpCallLua]。

public override Delegate GetDelegateByType(Type type){if (type == typeof(NoParamNoReturn)){return new NoParamNoReturn(__Gen_Delegate_Imp0);}if (type == typeof(DelegateLua)){return new DelegateLua(__Gen_Delegate_Imp0);}if (type == typeof(MyActionIntInt)){return new MyActionIntInt(__Gen_Delegate_Imp1);}return null;}

沒加[CSharpCallLua]或沒生成代碼的變量被使用就報錯:

C#調用lua

1.新建LuaEnv類;

luaEnv=new LuaEnv();

2.執行luaEnv.AddLoader()。輸入是一個返回byte[]的函數,這個函數把一個lua腳本讀取出全部字節返回。當luaEnv.DoString()執行require一個lua腳本時,它調用這個函數,把需要的lua腳本名傳入,這個函數把腳本里的代碼讀出。

luaEnv.AddLoader(ProjectLoader);
byte[] ProjectLoader(ref string filePath){string path=string.Concat(luaPath,filePath,".lua");if(File.Exists(path)){return File.ReadAllBytes(path);}else{return null;}}

3.執行luaEnv.DoString(luaCode);執行單句lua代碼,一般是"require('xxx')"執行一個lua腳本。

4.要使用Lua里的任何變量,通過luaEnv.Global獲取;

public LuaTable Global{get{return luaEnv.Global;}}

?要獲取table,在C#里定義一個有table同名成員的結構體或類。要獲取函數,在C#里定義一個參數列表和返回類型相同的委托。在Global.Get<xxx>里填自定義的類型。

XLuaManager.Instance.Global.Get<xxx>("yyy");

Lua調用C#

靜態方法用.,實例的方法用:

local obj=CS.UnityEngine.GameObject.Find("xxx")
obj.transform:FindChild(0)

C#里一大堆方便語法不能用,需要用相應的函數。

沒有泛型<>,要用傳入type的重載;

創建數組不能用new,要用

CS.System.Array.CreateInstance(typeof(CS.System.Int32),長度);

創建列表用

local List_String=CS.System.Collections.Generic.List(CS.System.String)local list=List_String()

創建字典用

local Dic1=CS.System.Collections.Generic.Dictionary(CS.System.String,CS.xxx)
local dic1=Dic1()

讀取C#的字典元素可以用[],讀取Lua創建的字典元素用

dic:get_Item(xxx)

寫入字典元素用

dic:set_Item(xxx)

區別就是數組用CS.System一大串就直接創建了,List和Dictionary用CS.System一大串先得到類型xxx,再用xxx()創建實例。

二維數組讀取元素需要用GetValue(x,y);?

對象==null需要用.Equals(nil);

+=需要用xxx=xxx+yyy;

out和ref參數是多返回值;

委托第一次要用=賦值,后面加函數;

事件用myEvent("+",xxx)加函數;

總結:沒有new,部分類型(Lua創建的字典、二維數組)沒有[],沒有+=,沒有++,沒有<>。需要掌握相應的替代語法。

熱補丁

xLua熱補丁報錯在Lua里找不到xLua變量

原因:在lua腳本里把xlua打成了xLua。?

熱補丁協程報錯This type must add to CSharpCallLua: System.Collections.IEnumerator

問題

?'AppDomain' does not contain a definition for 'DefineDynamicAssembly':找不到AppDomain下的DefineDynamicAssembly方法

解決方法:把報錯扔給百度查,得到下面的文章。

C#反射中使用到Emit時,發現AppDomain.CurrentDomain.DefineDynamicAssembly()方法并不存在 - 名字已被使用N次 - 博客園 (cnblogs.com)

里面讓把AppDomain.CurrentDomain替換成AssemblyBuilder,照做,解決。原因應該是微軟把這個方法移動地方了,且改成了靜態方法。

百度查DefineDynamicAssembly,能看到官方文檔里有兩個類里出現這個方法。

AppDomain的適用版本:

AssemblyBuilder的適用版本:

創建運行環境報錯xlua assembly:<unknown assembly> type:<unknown type> member:(null)

原因:沒把Plugin文件夾拷過來

Lua里調用C#的委托報錯InvalidOperationException: not a generic method definition

C#代碼

Lua代碼

報錯:not a generic method definition

C#里添加并執行委托沒錯,Lua直接執行Func1()也沒錯。如果改成一個根本不存在的成員:

報錯會不一樣:

說明xLua是能找到這個成員的,但是不允許把函數賦給它。打印MyStaticDelegate,是nil,類型也是nil。給它賦一個整數,不報錯,打印,還是nil,執行,報錯說不能執行nil。

這是C#里定義的一個類:

在lua里遍歷它:

結果:

發現它含有NPC里的靜態成員,但是靜態字符串name和靜態委托MyStaticDelegate不見了,但是有一個UnderlyingSystemType,類型是NPC。

然后試圖把NPC實例化一個對象,對這個對象遍歷:

得到報錯:ob是NPC類型,不是table,不能遍歷:

遍歷了一下CS,以為會有很多東西:

結果:

連我定義的NPC類也沒有。

解決方法:在C#定義的無參無返回值委托、傳入自身的委托前面加[CSharpCallLua],不管是在Lua使用C#委托,還是C#委托接收Lua函數,都要加。有參且不為表自身的委托(如傳入字符串、整數)可以不加。

不要用print(CS.成員)驗證一個成員存不存在,就算不存在,也會添加這個成員,類型是table。下圖:print CS里一個根本不存在的成員,發現它有值,而且遍歷顯示這個成員已經被創建出來了:

Lua添加按鈕回調報錯:LuaException: c# exception:System.InvalidOperationException: not a generic method definition

原因:AddListener的輸入類型UnityAction沒加CSharpCallLua特性!

解決方法:加上下面一段代碼,xLua重新生成。

public static class CSLuaTypes{//記錄C#和Lua會調用對方的類型[CSharpCallLua]public static List<Type> cSharpCallLuaTypes=new List<Type>(){typeof(UnityAction),typeof(UnityAction<float>),typeof(UnityAction<bool>)};[LuaCallCSharp]public static List<Type> LuaCallCSharpTypes=new List<Type>(){};
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78309.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78309.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【tcp連接windows redis】

tcp連接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保護模式&#xff0c;允許外部網絡連接 protected-mode no

【序列貪心】擺動序列 / 最長遞增子序列 / 遞增的三元子序列 / 最長連續遞增序列

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;貪心算法 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 擺動序列最長遞增子序列遞增的三元子序列最長連續遞增序列 擺動序列 擺動序列 貪心策略&#xff1a;統計出所有的極大值和極小…

STM32F103C8T6使用MLX90614模塊

首先說明&#xff1a; 1.SMBus和I2C的區別 我曾嘗試用江科大的I2C底層去直接讀取該模塊&#xff0c;但是無法成功&#xff0c;之后AI生成的的代碼也無法成功。 思來想去最大的可能就是SMBus這個協議的問題&#xff0c;根據百度得到的結果如下&#xff1a; SMBus和I2C的區別 鏈…

tp5 php獲取農歷年月日干支甲午

# 切換為國內鏡像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次嘗試安裝 composer require overtrue/chinese-calendar核心寫法一個農歷轉公歷&#xff0c;一個公歷轉農歷 農歷閏月可能被錯誤標記&#xff08;例如 閏四月 應表示…

Ubuntu搭建Conda+Python開發環境

目錄 一、環境說明 1、測試環境為ubuntu24.04.1 2、更新系統環境 3、安裝wget工具 4、下載miniconda安裝腳本 二、安裝步驟 1、安裝miniconda 2、source conda 3、驗證版本 4、配置pip源 三、conda用法 1、常用指令 一、環境說明 1、測試環境為ubuntu24.04.1 2、更…

Vscode+git筆記

1.U是untracked m是modify modified修改了的。 2.check out 查看觀察 3 status changed 暫存區 4.fetch v 取來拿來 5.orangion 起源代表遠程分支 git checkout就是可以理解為進入的意思。

模擬SIP終端向Freeswitch注冊用戶

1、簡介 使用go語言編寫一個程序&#xff0c;模擬SIP-T58終端在Freeswitch上注冊用戶 2、思路 以客戶端向服務端Freeswitch發起REGISTER請求&#xff0c;告知服務器當前的聯系地址構造SIP REGISTER請求 創建UDP連接&#xff0c;連接到Freeswitch的5060端口發送初始的REGISTER請…

DeepSeek實戰--LLM微調

1.為什么是微調 &#xff1f; 微調LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于預訓練好的大型語言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通過特定領域或任務的數據進一步訓練&#xff0c;使其適應具體需求的過程。它是將…

Docker與WSL2如何清理

文章目錄 Docker與WSL2如何清理一、docker占據磁盤空間核心原因分析1. WSL2 虛擬磁盤的動態擴展特性2. Docker 鏡像分層緩存與未清理資源 二、解決方案步驟 1&#xff1a;清理 Docker 未使用的資源步驟 2&#xff1a;手動壓縮 WSL2 虛擬磁盤1. 關閉 WSL2 和 Docker Desktop2. 定…

在 IDEA 中寫 Spark 程序:從入門到實踐

在大數據處理領域&#xff0c;Apache Spark 憑借其出色的性能和豐富的功能受到廣泛歡迎。而 IntelliJ IDEA 作為一款功能強大的 Java 集成開發環境&#xff0c;為編寫 Spark 程序提供了極大的便利。本文將詳細介紹如何在 IDEA 中搭建 Spark 開發環境并編寫運行 Spark 程序&…

Unity 使用 ADB 實時查看手機運行性能

Unity 使用 ADB 實時查看手機運行性能 前言操作步驟ADB工具下載ADB工具配置手機進入開發者模式并開啟USB調試使用ADB連接手機Unity打包設置使用Profiler實時查看性能情況優化建議 常見問題 前言 通過 ADB&#xff08;Android Debug Bridge&#xff09;連接安卓設備&#xff0c…

深入理解 HttpExchange_Java 中構建 HTTP 服務的基礎組件

1. 引言 1.1 Java 中的輕量級 HTTP 服務需求 隨著微服務、工具類應用和嵌入式系統的興起,開發者對輕量級 HTTP 服務的需求日益增長。相比引入龐大的框架(如 Spring Boot),使用 JDK 原生 API 構建 HTTP 服務成為一種快速、低依賴的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 啟動源碼

文章目錄 1. 前言2. RocketMQ 通信架構3. NameServer 啟動流程3.1 創建 NameServerController3.2 啟動 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整體流程3.3.2 創建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法題】荷蘭國旗問題[力扣75題顏色分類] - JAVA

一、題目 二、文字解釋 1.1 前言 本題是經典的「荷蘭國旗問題」&#xff0c;由計算機科學家 Edsger W. Dijkstra 首先提出。如同圖中所示的荷蘭國旗&#xff0c;其由紅、白、藍三色水平排列組成。在算法領域&#xff0c;該問題可類比為將一個由特定的三種元素&#xff08;可抽…

MySQL數據操作全攻略:DML增刪改與DQL高級查詢實戰指南

知識點4【MySQL的DDL】 DDL&#xff1a;主要管理數據庫、表、列等操作。 庫→表&#xff08;二維&#xff09;→列&#xff08;一維&#xff09; 數據表的第一行是 列名稱 數據庫是由一張或多張表組成 我們先學習在數據庫中創建數據表 0、常見的數據類型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 賽時想到了差分約束&#xff0c;隨手寫了個 SPFA 結果掛的很慘……還是太菜了&#xff0c;賽后 Bellman-Ford 又調了半天。 題目大意 給定整數 N , M N,M N,M 和長度為 M M M 的三個整數序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL庫進行STM32開發

一、初識HAL庫 STM32 開發中常說的 HAL 庫開發&#xff0c;指的是利用 HAL 庫固件包里封裝好的 C 語言編寫的驅動文件&#xff0c;來實現對 STM32 內部和外圍設備的控制。但只有 HAL 庫還不能直接驅動一個 STM32 的芯片&#xff0c;其它的組件已經由 ARM 與眾多芯片硬件、軟件廠…

Qt:(創建項目)

目錄 1. 使?QtCreator新建項? 1.1 新建項? 1.2 選擇項?模板 1.3 選擇項?路徑 1.4 選擇構建系統 1.5 填寫類信息設置界? ?編輯 1.6 選擇語?和翻譯?件 1.6 選擇Qt套件 1.7 選擇版本控制系統 1.8 最終效果 1. 使?QtCreator新建項? 1.1 新建項? 打開Qt…

WPF之Slider控件詳解

文章目錄 1. 概述2. 基本屬性2.1 值范圍屬性2.2 滑動步長屬性2.3 刻度顯示屬性2.4 方向屬性2.5 選擇范圍屬性 3. 事件處理3.1 值變化事件3.2 滑塊拖動事件 4. 樣式和模板自定義4.1 基本樣式設置4.2 控件模板自定義 5. 數據綁定5.1 綁定到ViewModel5.2 同步多個控件 6. 實際應用…

mysql索引及數據庫引擎

順序io&#xff08;不需要每次都磁盤尋址&#xff0c;效率高&#xff09;&#xff0c;隨機io&#xff08;需要每次都磁盤尋址&#xff0c;效率低&#xff09; 如何正確的創建合適的索引&#xff1f; 索引是一種分散存儲的數據結構 磁盤io特性&#xff1a;每次交互是以頁為單位&…