xLua——Lua调用C#
作者:追风剑情 发布于:2017-7-17 20:25 分类:Lua
以下代码来自xLua demo
using UnityEngine; using System.Collections; using System; using XLua; using System.Collections.Generic; namespace Tutorial { [LuaCallCSharp] public class BaseClass { public static void BSFunc() { Debug.Log("Driven Static Func, BSF = "+ BSF); } public static int BSF = 1; public void BMFunc() { Debug.Log("Driven Member Func, BMF = " + BMF); } public int BMF { get; set; } } public struct Param1 { public int x; public string y; } [LuaCallCSharp] public enum TestEnum { E1, E2 } [LuaCallCSharp] public class DrivenClass : BaseClass { [LuaCallCSharp] public enum TestEnumInner { E3, E4 } public void DMFunc() { Debug.Log("Driven Member Func, DMF = " + DMF); } public int DMF { get; set; } public double ComplexFunc(Param1 p1, ref int p2, out string p3, Action luafunc, out Action csfunc) { Debug.Log("P1 = {x=" + p1.x + ",y=" + p1.y + "},p2 = "+ p2); luafunc(); p2 = p2 * p1.x; p3 = "hello " + p1.y; csfunc = () => { Debug.Log("csharp callback invoked!"); }; return 1.23; } public void TestFunc(int i) { Debug.Log("TestFunc(int i)"); } public void TestFunc(string i) { Debug.Log("TestFunc(string i)"); } public static DrivenClass operator +(DrivenClass a, DrivenClass b) { DrivenClass ret = new DrivenClass(); ret.DMF = a.DMF + b.DMF; return ret; } public void DefaultValueFunc(int a = 100, string b = "cccc", string c = null) { UnityEngine.Debug.Log("DefaultValueFunc: a=" + a + ",b=" + b + ",c=" + c); } public void VariableParamsFunc(int a, params string[] strs) { UnityEngine.Debug.Log("VariableParamsFunc: a =" + a); foreach (var str in strs) { UnityEngine.Debug.Log("str:" + str); } } public TestEnum EnumTestFunc(TestEnum e) { Debug.Log("EnumTestFunc: e=" + e); return TestEnum.E2; } public Action<string> TestDelegate = (param) => { Debug.Log("TestDelegate in c#:" + param); }; public event Action TestEvent; public void CallEvent() { TestEvent(); } public ulong TestLong(long n) { return (ulong)(n + 1); } class InnerCalc : Calc { public int add(int a, int b) { return a + b; } public int id = 100; } public Calc GetCalc() { return new InnerCalc(); } public void GenericMethod<T>() { Debug.Log("GenericMethod<" + typeof(T) + ">"); } } [LuaCallCSharp] public interface Calc { int add(int a, int b); } [LuaCallCSharp] public static class DrivenClassExtensions { public static int GetSomeData(this DrivenClass obj) { Debug.Log("GetSomeData ret = " + obj.DMF); return obj.DMF; } public static int GetSomeBaseData(this BaseClass obj) { Debug.Log("GetSomeBaseData ret = " + obj.BMF); return obj.BMF; } public static void GenericMethodOfString(this DrivenClass obj) { obj.GenericMethod<string>(); } } } public class LuaCallCs : MonoBehaviour { LuaEnv luaenv = null; string script = @" function demo() --new C#对象 local newGameObj = CS.UnityEngine.GameObject() local newGameObj2 = CS.UnityEngine.GameObject('helloworld') print(newGameObj, newGameObj2) --访问静态属性,方法 local GameObject = CS.UnityEngine.GameObject print('UnityEngine.Time.deltaTime:', CS.UnityEngine.Time.deltaTime) --读静态属性 CS.UnityEngine.Time.timeScale = 0.5 --写静态属性 print('helloworld', GameObject.Find('helloworld')) --静态方法调用 --访问成员属性,方法 local DrivenClass = CS.Tutorial.DrivenClass local testobj = DrivenClass() testobj.DMF = 1024--设置成员属性 print(testobj.DMF)--读取成员属性 testobj:DMFunc()--成员方法 --基类属性,方法 print(DrivenClass.BSF)--读基类静态属性 DrivenClass.BSF = 2048--写基类静态属性 DrivenClass.BSFunc();--基类静态方法 print(testobj.BMF)--读基类成员属性 testobj.BMF = 4096--写基类成员属性 testobj:BMFunc()--基类方法调用 --复杂方法调用(ret, p2, p3, csfunc这四个对应C# ComplexFunc函数的返回值) --Lua向C#的函数传参时忽略out参数 --Lua调用C#函数的返回值只考虑: return、ref、out --ret: 对应C# return --p2: 对应C# ref int p2 --p3: 对应C# out string p3 --csfunc: 对应C# out Action csfunc local ret, p2, p3, csfunc = testobj:ComplexFunc({x=3, y = 'john'}, 100, function() print('i am lua callback') end) print('ComplexFunc ret:', ret, p2, p3, csfunc) csfunc() --重载方法调用 testobj:TestFunc(100) testobj:TestFunc('hello') --操作符 local testobj2 = DrivenClass() testobj2.DMF = 2048 print('(testobj + testobj2).DMF = ', (testobj + testobj2).DMF) --默认值 testobj:DefaultValueFunc(1) testobj:DefaultValueFunc(3, 'hello', 'john') --可变参数 testobj:VariableParamsFunc(5, 'hello', 'john') --Extension methods print(testobj:GetSomeData()) print(testobj:GetSomeBaseData()) --访问基类的Extension methods testobj:GenericMethodOfString() --通过Extension methods实现访问泛化方法 --枚举类型 local e = testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1) print(e, e == CS.Tutorial.TestEnum.E2) print(CS.Tutorial.TestEnum.__CastFrom(1), CS.Tutorial.TestEnum.__CastFrom('E1')) print(CS.Tutorial.DrivenClass.TestEnumInner.E3) assert(CS.Tutorial.BaseClass.TestEnumInner == nil) --Delegate testobj.TestDelegate('hello') --直接调用 local function lua_delegate(str) print('TestDelegate in lua:', str) end testobj.TestDelegate = lua_delegate + testobj.TestDelegate --combine,这里演示的是C#delegate作为右值,左值也支持 testobj.TestDelegate('hello') testobj.TestDelegate = testobj.TestDelegate - lua_delegate --remove testobj.TestDelegate('hello') --事件 local function lua_event_callback1() print('lua_event_callback1') end local function lua_event_callback2() print('lua_event_callback2') end testobj:TestEvent('+', lua_event_callback1) testobj:CallEvent() testobj:TestEvent('+', lua_event_callback2) testobj:CallEvent() testobj:TestEvent('-', lua_event_callback1) testobj:CallEvent() testobj:TestEvent('-', lua_event_callback2) --64位支持 local l = testobj:TestLong(11) print(type(l), l, l + 100, 10000 + l) --typeof newGameObj:AddComponent(typeof(CS.UnityEngine.ParticleSystem)) --cast local calc = testobj:GetCalc() calc:add(1, 2) assert(calc.id == 100) cast(calc, typeof(CS.Tutorial.Calc)) calc:add(1, 2) assert(calc.id == nil) end demo() --协程下使用 local co = coroutine.create(function() print('------------------------------------------------------') demo() end) assert(coroutine.resume(co)) "; // Use this for initialization void Start () { luaenv = new LuaEnv(); luaenv.DoString(script); } // Update is called once per frame void Update () { if (luaenv != null) { luaenv.Tick(); } } void OnDestroy() { luaenv.Dispose(); } }
运行测试
标签: xLua
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号