XLua教程之C#調用Lua

上一篇文章

XLua教程之入門篇-CSDN博客

在C#腳本中訪問lua全局數據,特別是table以及function,代價比較大,建議盡量少做相關操作。

LuaEnv.Global.Get

用于獲取一個全局變量,但是無法獲取局部變量(用local修飾)

全局基本類型變量

支持int、float、double、bool、string類型

string value1 = luaenv.Global.Get<string>("stringValue");
Debug.Log($"string:{value1}");float value2 = luaenv.Global.Get<float>("floatValue");
Debug.Log($"float:{value2}");bool value3 = luaenv.Global.Get<bool>("boolValue");
Debug.Log($"bool:{value3}");double value4 = luaenv.Global.Get<double>("doubleValue");
Debug.Log($"double:{value4}");int value5 = luaenv.Global.Get<int>("intValue");
Debug.Log($"int:{value5}");

全局函數

測試:Lua腳本側代碼

--無參無返回值
function SayHi()print("hello world!")
end--有參有返回值
function GetNumSum(a,b,c)local result = a+b+c;print(result)return result
end--變長參數多返回值
function GetManyResult(...)local list = {...}local result1 = 0;for _,v in ipairs(list) doresult1 = result1 + vendlocal result2 = 1;for _,v in ipairs(list) doresult2 = result2 * vendreturn result1,result2
end

第一種方法? 映射到委托delegate(推薦使用)

這種是建議的方式,性能好很多,而且類型安全。缺點是要生成代碼(如果沒生成代碼會拋InvalidCastException異常)

1、先注冊對應Lua函數的C#委托,并添加 [CSharpCallLua]標簽。(無參無返回值可以不用添加該標簽,xlua默認支持)

//無參無返回值
public delegate void NoParamNoReturn();//有參有返回值
[CSharpCallLua]
public delegate int XParamOneReturn(int a,int b,int c);//變長參數1返回值
[CSharpCallLua]
public delegate int XParam1Return(params int[] temp);

2、先清空生成的xlua插樁代碼,再重新生成

3、調用

//無參無返回值
NoParamNoReturn func1 = luaEnv.Global.Get<NoParamNoReturn>("SayHi");
func1();//有參有返回值
XParamOneReturn func2 = luaEnv.Global.Get<XParamOneReturn>("GetNumSum");
var result1 = func2(1,2,3);
Debug.Log(result1);//變長參數1返回值
XParam1Return func3 = luaEnv.Global.Get<XParam1Return>("GetManyResult1"); 
int a =default(int);
int b =default(int);
var result2 = func3(1,2,3,4);
Debug.Log(result2);

第二種方法? 映射到LuaFunction

LuaFunction上有個變參的Call函數,可以傳任意類型,任意個數的參數,返回值是object的數組,對應于lua的多返回值。

//無參無返回值
LuaFunction func1 = luaEnv.Global.Get<LuaFunction>("SayHi");
func1.Call();//有參有返回值
LuaFunction func2 = luaEnv.Global.Get<LuaFunction>("GetNumSum");
var result1 = func2.Call(1,2,3);
foreach (var item in result1)
{Debug.Log(item);
}//變長參數多返回值
LuaFunction func3 = luaEnv.Global.Get<LuaFunction>("GetManyResult");
var result2 = func3.Call(1,2,3);
foreach (var item in result2)
{Debug.Log(item);
}

對比:

優先使用映射到委托方案

映射到XLua自帶的LuaFunction,簡單方便,但是會消耗性能;

映射到Delegate委托,官方建議,性能比LuaFunction要好很多,而且類型安全;但需要在自定義委托前添加[CSharpCallLua]特性標簽

特性映射到委托 (Delegate)映射到 LuaFunction
性能極高?(接近原生C#調用)較低?(涉及查找、壓參、調用、返回等一系列開銷)
用法像調用普通C#委托一樣調用其?Call(...)?方法,傳入參數數組
類型安全強類型,編譯時檢查參數和返回值類型弱類型,參數和返回值都是?object[],運行時易出錯
內存開銷較大(每次調用可能產生臨時?object[]?垃圾)
適用場景高頻調用(如?Update、UI事件回調)低頻調用一次性調用參數數量/類型不固定
配置要求需要標記?[CSharpCallLua]?并生成代碼無需任何額外配置,開箱即用

全局表

根據表的數據結構類型可以按照不同的情況,選擇不同的映射形式。

如果表的形式類似于列表,可以映射到C#的List<T>。

如果表的形式類似于字典,可以映射到C#的Dictionary<T>。

如果表的形式類似于類,可以映射到C#的class。

映射到List<T>

List<int> list1 = luaEnv.Global.Get<List<int>>("list1");
foreach (var item in list1)
{Debug.Log(item);
}

映射到Dictionary<T>

Dictionary<int, string> dic = luaEnv.Global.Get<Dictionary<int, string>>("list2");
foreach (var item in dic)
{Debug.Log($"{item.Key}:{item.Value}");
}

映射到class

先根據lua表,聲明對應C#類結構,再調用

public class Student
{public int id;public string name;public bool sex;public float score;
}Student student = luaEnv.Global.Get<Student>("Student");
Debug.Log($"{student.id} {student.name} {student.sex} {student.score}");

映射到LuaTable

xLua自帶映射,兼容Lua表多種情況,不用定義c#類結構,開箱即用。但是性能消耗比較大,一般情況不推薦使用。

LuaTable student = luaEnv.Global.Get<LuaTable>("Student");
Debug.Log($"{student.Get<int>("id")}");
Debug.Log($"{student.Get<string>("name")}");
Debug.Log($"{student.Get<bool>("sex")}");
Debug.Log($"{student.Get<float>("score")}");

LuaEnv.Global.Set

用于修改一個全局變量

//string
luaenv.Global.Set("stringValue", "天天向上");
//float
luaenv.Global.Set("floatValue", 99.99);
//bool
luaenv.Global.Set("boolValue", false);
//double
luaenv.Global.Set("doubleValue", 9.999999999);
//int
luaenv.Global.Set("intValue", 438);

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

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

相關文章

C++ 標準庫中的哈希函數:從std::hash到自定義哈希器

C 標準庫中的哈希函數&#xff1a;從 std::hash 到自定義哈希器 1. 引言 在上一篇中&#xff0c;我們介紹了哈希表為什么能夠實現 O(1) 查找。 核心秘密在于&#xff1a;哈希函數。 在 C 標準庫中&#xff0c;哈希表容器&#xff08;如 unordered_map、unordered_set&#xff0…

在圖形 / 游戲開發中,為何 Pixels Per Unit(PPU)數值越小,物體在屏幕上顯示的尺寸越大?

1. 什么是 PPU&#xff1f; PPU&#xff08;Pixels Per Unit&#xff09;指的是 多少像素對應游戲世界中的一個單位&#xff08;Unit&#xff09;。 在 Unity 等游戲引擎中&#xff0c;1 Unit 通常被視為世界空間的基本長度&#xff0c;比如 1 米。2. PPU 與物體大小的關系PPU …

【ZYNQ開發篇】Petalinux和電腦端的靜態ip地址配置

使用Petalinux工具為ZYNQ板卡搭建嵌入式Linux操作系統&#xff0c;成功搭建后&#xff0c;用戶通常會使用客戶端軟件對ZYNQ板卡上的Linux系統進行訪問&#xff0c;軟件需要知道ZYNQ板卡的ip地址才能進行訪問&#xff0c;如果ip地址是動態變化的&#xff0c;軟件每次訪問都要重新…

AVL樹知識總結

AVL樹概念性質一顆AVL樹或是空樹&#xff0c;或者具有一下性質的二叉搜索樹&#xff1a;左右都是AVL樹&#xff0c;左右子樹高度差的絕對值不超過1AVL樹有n個結果&#xff0c;高度保持在O&#xff08;logN&#xff09; 搜索時間復雜度O(logN&#xff09;模擬實現插入定義&#…

返利app的跨域問題解決方案:CORS與反向代理在前后端分離架構中的應用

返利app的跨域問題解決方案&#xff1a;CORS與反向代理在前后端分離架構中的應用 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在返利APP的前后端分離架構中&#xff0c;跨…

【dl】python基礎 深度學習中需要用到的python基礎

直接在jupyter寫筆記然后導出md格式真的太好用了本文筆記來自小破站視頻BV1K14y1c75ePython 基礎 1. 變量 1.1 三種基本變量類型 # 字符串 str str_v "123"# 數字 int或float num_v 11 float_v 12.0# 布爾型 bool bool_v True1.1.1 字符串 f字符串&#xff1a;在…

Vue FullPage.js 完整使用指南:Vue 3 官方全屏滾動解決方案

概述 vue-fullpage.js 是 FullPage.js 的官方 Vue.js 3 包裝器&#xff0c;為 Vue 3 應用提供了強大的全屏滾動功能。該插件基于成熟的 FullPage.js 庫&#xff0c;支持多種滾動效果和豐富的配置選項&#xff0c;特別適用于企業級數據大屏、產品展示、單頁應用等場景。 官方信…

軟件工程實踐一:Git 使用教程(含分支與 Gitee)

文章目錄目標一、快速上手1. Windows 安裝 Git2. 初始化 / 克隆二、核心概念速覽三、常用命令清單1) 查看狀態與差異2) 添加與提交3) 歷史與回溯4) 撤銷與恢復&#xff08;Git 2.23 推薦新命令&#xff09;5) 忽略文件四、分支與合并&#xff08;Branch & Merge&#xff09…

css`min()` 、`max()`、 `clamp()`

min() 用來計算多個數值中最小的那個&#xff0c;非常適合做自適應。 width: min(50vw, 500px) 50vw 表示 視口寬度的 50% 500px 表示 500px min(50vw, 500px) 表示會取兩者中 最小的那個 作為最終的寬度&#xff0c;。 使用場景 限制某個元素寬度不超過某個值&#xff1b; 響…

【WRF-VPRM 預處理器】HEG 安裝(服務器)-MRT工具替代

目錄 HEG 安裝 驗證 HEG 安裝與否 設置環境變量(建議) 命令行接口(Command Line Interface) hegtool 工具 hegtool 用法 Header File 格式 功能1:`gdtif` 工具 – MISR 數據處理 `gdtif` 使用方式 參數文件格式(Parameter File Format) 功能2:`resample` 工具 – 重采樣…

PyTorch 神經網絡

神經網絡是一種模仿人腦神經元鏈接的計算模型&#xff0c; 由多層節點組成&#xff0c; 用于學習數據之間的復雜模式和關系。神經網絡通過調整神經元之間的連接權重來優化預測結果&#xff0c;這個過程可以涉及到向前傳播&#xff0c;損失計算&#xff0c;反向傳播和參數更新。…

詳細解析蘋果iOS應用上架到App Store的完整步驟與指南

&#x1f4f1;蘋果商店上架全流程詳解 &#x1f469;?&#x1f4bb;想要將你的App上架到蘋果商店&#xff1f;跟隨這份指南&#xff0c;一步步操作吧&#xff01; 1?? 申請開發者賬號&#xff1a;訪問蘋果開發者網站&#xff0c;注冊并支付99美元年費&#xff0c;獲取開發者…

三維GIS開發實戰!Cesium + CZML 實現火箭飛行與分離的 3D 動態模擬

CZML是一種基于JSON的數據格式&#xff0c;專門用于在Cesium中描述3D場景和時間動態數據。本文將詳細介紹了CZML的特點&#xff08;JSON格式、時間動態性、層次結構等&#xff09;和基本組件&#xff0c;并給出了一個火箭發射的實例。通過搭建Cesium開發環境&#xff08;使用vi…

Spring Boot 深入剖析:BootstrapRegistry 與 BeanDefinitionRegistry 的對比

在 Spring Boot 的啟動過程中&#xff0c;BootstrapRegistry 和 BeanDefinitionRegistry 是兩個名為“Registry”卻扮演著截然不同角色的核心接口。理解它們的差異是深入掌握 Spring Boot 啟動機制和進行高級定制開發的關鍵。BootstrapRegistry public static ConfigurableAppl…

貪心算法應用:速率單調調度(RMS)問題詳解

Java中的貪心算法應用&#xff1a;速率單調調度(RMS)問題詳解 1. 速率單調調度(RMS)概述 速率單調調度(Rate Monotonic Scheduling, RMS)是一種廣泛應用于實時系統中的靜態優先級調度算法&#xff0c;屬于貪心算法在任務調度領域的經典應用。 1.1 基本概念 RMS基于以下原則&…

Cesium4--地形(OSGB到3DTiles)

1 OSBG OSGB&#xff08;OpenSceneGraph Binary&#xff09;是基于 OpenSceneGraph&#xff08;OSG&#xff09; 三維渲染引擎的二進制三維場景數據格式&#xff0c;廣泛用于存儲和傳輸傾斜攝影測量、BIM、點云等大規模三維模型&#xff0c;尤其在國產地理信息與智慧城市項目中…

多語言共享販賣機投資理財共享售賣機投資理財系統

多語言共享販賣機投資理財/共享售賣機分紅/充電寶/充電樁投資理財系統 采用thinkphp內核開發&#xff0c;支持注冊贈金、多級分銷&#xff0c;功能很基礎 修復后臺用戶列表管理 可自定義理財商品 多種語言還可以添加任意語言 源碼開源 多級分銷 注冊贈金等

[Windows] PDF 專業壓縮工具 v3.0

[Windows] PDF 專業壓縮工具 v3.0 鏈接&#xff1a;https://pan.xunlei.com/s/VOZwtC_5lCF-UF6gkoHuxWMoA1?pwdchg8# PDF 壓縮工具 3.0 新版功能特點 - 不受頁數限制&#xff01; 一、核心壓縮功能 1.多模式智能壓縮 支持 4 種壓縮模式&#xff1a;平衡模式&#xff08…

SHEIN 希音 2026 校招 內推 查進度

SHEIN 希音 2026 校招 內推 查進度 &#x1f3e2;公司名稱&#xff1a;SHEIN 希音 &#x1f4bb;招聘崗位&#xff1a;前端、后端、測試、產品、安全、運維、APP 研發、數據分析、設計師、買手、企劃、招商、管培生 &#x1f31f;內推碼&#xff1a;NTA2SdK &#x1f4b0;福利待…

ARM (6) - I.MX6ULL 匯編點燈遷移至 C 語言 + SDK 移植與 BSP 工程搭建

回顧一、核心關鍵字&#xff1a;volatile1.1 作用告訴編譯器&#xff1a;被修飾的變量會被 “意外修改”&#xff08;如硬件寄存器的值可能被外設自動更新&#xff09;&#xff0c;禁止編譯器對該變量進行優化&#xff08;如緩存到寄存器、刪除未顯式修改的代碼&#xff09;。本…