找回密码
 立即注册
查看: 367|回复: 0

xlua-C#代码访问lua的变量和函数

[复制链接]
发表于 2021-8-11 22:49 | 显示全部楼层 |阅读模式
C#代码如何访问lua代码中数据呢?主要基本数据类型、table以及function函数等。
lua代码脚本如下
  1. --Lua全局变量
  2. --[[基本数据类型]]--
  3. Num = 100;
  4. Name = 'Hello';
  5. IsOk = true;
  6. --[[table表数据]]--
  7. example_table={
  8.    id = 'W',
  9.    age = 10,
  10.    sex = 0,
  11.    1,--多余变量1
  12.    2,--多余变量2
  13.    setSex = function(self,sexValue)
  14.      sex = sexValue;
  15.    end,
  16.    getSex = function()
  17.       return sex;
  18.    end
  19. }
  20. example_table2={
  21.     id = 102,
  22.     num = 25,
  23.     vip = 3
  24. }
  25. example_table3 = {
  26.     1,
  27.     2,
  28.     3
  29. }
  30. --[[函数function]]--
  31. function Method1()
  32.    print('=====lua method1=====');
  33. end
  34. function Method2(a,b)
  35.     print('=====lua method2=====');
  36.     c = a+b;
  37.     a=a+2;
  38.     b=3;   
  39.     return c,a,b;
  40. end
  41. function Method3()
  42.     print('=====lua method3=====');
  43.     return Method1;
  44. end
复制代码
C#代码
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using XLua;
  6. /*
  7. * Author:W
  8. *  C#访问Lua中的数据变量,方法的方式
  9. */
  10. public class CSCallLuaTest : MonoBehaviour {
  11.         private LuaEnv luaEnv = null;
  12.         /// <summary>
  13.         /// Lua表映射到Class类
  14.         /// 【注意1】值拷贝-》修改不会同步 ,并且针对复杂类型,性能代价大
  15.         /// 【注意2】不能映射Lua函数
  16.         /// </summary>
  17.         public class ExampleTable
  18.         {
  19.                 public string id;
  20.                 public int age;
  21.                 public int sex;               
  22.         }
  23.         private ExampleTable exampleTable;
  24.         /// <summary>
  25.         /// Lua表映射到struct
  26.         /// 注意点与class相同
  27.         /// </summary>
  28.         public struct ExampleStruct
  29.         {
  30.                 public string id;
  31.                 public int age;
  32.                 public int sex;
  33.         }
  34.         private ExampleStruct exampleStruct;
  35.         /// <summary>
  36.         /// Lua表映射到Interface
  37.         /// 【注意1】可以映射Lua函数
  38.         /// 【注意2】需要加上[CSharpCallLua]标签,并且点击“Xlua-》Generate Code”菜单命令生成Bride结尾的C#脚本代码,
  39.         /// 在Assets/Xlua/Gen文件夹中可查看
  40.         /// 【注意3】属于引用型映射,同步修改
  41.         /// </summary>
  42.         [CSharpCallLua]
  43.         public interface ExampleInterface
  44.         {
  45.                 string id { get; set; }
  46.                 int age { get; set; }
  47.                 int sex { get; set; }
  48.                 void setSex(int sexV);
  49.                 int getSex();
  50.         }
  51.         private ExampleInterface exampleInterface;
  52.         /// <summary>
  53.         /// Lua表映射到字典Dictionary
  54.         /// 【注意1】前提保证:键key与值Value的类型是一致的
  55.         /// 【注意2】值拷贝
  56.         /// </summary>
  57.         public Dictionary<string, int> infoDict = new Dictionary<string, int>();
  58.         /// <summary>
  59.         /// Lua表映射到List
  60.         /// 【注意1】前提保证:值Value的类型是一致的
  61.         /// 【注意2】值拷贝
  62.         /// </summary>
  63.         public List<int> infoList = new List<int>();
  64.         /// <summary>
  65.         /// Lua表映射到LuaTable
  66.         /// 【注意1】无需生成代码,性能比interface接口慢一个数量级,且无类型检查
  67.         /// 【注意2】引用型映射,修改同步
  68.         /// </summary>
  69.         public LuaTable infoTable;
  70.         Action method1;
  71.         /// <summary>
  72.         /// Lua Function函数映射到Delegate委托
  73.         /// 【注意1】性能好,类型安全。但需要生成代码
  74.         /// </summary>
  75.         /// <param name="a"></param>
  76.         /// <param name="b"></param>
  77.         /// <param name="b2"></param>
  78.         /// <param name="b3"></param>
  79.         /// <returns></returns>
  80.    [CSharpCallLua]
  81.         public delegate int Method2(int a, int b, ref int b2, out int b3);
  82.         Method2 method2;
  83.         /// <summary>
  84.         /// Lua Function函数映射到Delegate委托,并返回另外一个委托
  85.         /// </summary>
  86.         /// <returns></returns>
  87.         [CSharpCallLua]
  88.         public delegate Action Method3();
  89.         Method3 method3;
  90.         /// <summary>
  91.         /// Lua 函数映射到LuaFunction
  92.         /// 【注意1】不需要生成代码,性能代价较大
  93.         /// </summary>
  94.         private LuaFunction luaFunction;
  95.         void Awake()
  96.         {
  97.                 luaEnv = new LuaEnv();
  98.                 luaEnv.DoString("require 'CSCallLua'");
  99.         }
  100.        
  101.         // Use this for initialization
  102.         void Start () {
  103.                 Debug.Log("Lua Global Num="+ luaEnv.Global.Get<int>("Num"));
  104.                 Debug.Log("Lua Global Name="+luaEnv.Global.Get<string>("Name"));
  105.                 Debug.Log("Lua Global IsOk="+luaEnv.Global.Get<bool>("IsOk"));
  106.                 exampleTable = luaEnv.Global.Get<ExampleTable>("example_table");
  107.                 Debug.Log("Lua ExampleTable  普通类映射 Id=" + exampleTable.id + " Age=" + exampleTable.age + " Sex=" + exampleTable.sex);
  108.                 exampleStruct = luaEnv.Global.Get<ExampleStruct>("example_table");
  109.                 Debug.Log("Lua ExampleTable  结构体映射 Id=" + exampleStruct.id + " Age=" + exampleStruct.age + " Sex=" + exampleStruct.sex);
  110.                 exampleInterface = luaEnv.Global.Get<ExampleInterface>("example_table");
  111.                 Debug.Log("Lua ExampleTable  接口映射 Id=" + exampleInterface.id + " Age=" + exampleInterface.age + " Sex=" + exampleInterface.sex);
  112.                 Debug.Log("Lua ExampleTable  接口映射 函数setSex(5)");
  113.                 exampleInterface.setSex(5);
  114.                 Debug.Log("Lua ExampleTable  接口映射 函数 getSex():"+exampleInterface.getSex());
  115.                 infoDict = luaEnv.Global.Get<Dictionary<string, int>>("example_table2");
  116.                 foreach (KeyValuePair<string, int> v in infoDict)
  117.                 {
  118.                         Debug.Log("Lua ExampleTable2 字典映射 key="+v.Key+" value="+v.Value);
  119.                 }
  120.                 infoList = luaEnv.Global.Get<List<int>>("example_table3");
  121.                 for (int i = 0; i < infoList.Count; i++)
  122.                 {
  123.                         Debug.Log("Lua ExampleTable3 List映射 i="+i+" value= "+infoList[i]);
  124.                 }
  125.                 //===============LuaTable==================
  126.                 infoTable = luaEnv.Global.Get<LuaTable>("example_table");
  127.                 Debug.Log("Lua ExampleTable  LuaTable类 映射 Id = "+infoTable.Get<string>("id")+" Age="+infoTable.Get<int>("age")+" Sex="+infoTable.Get<int>("sex"));
  128.                 //=======Delegate========
  129.                 method1 = luaEnv.Global.Get<Action>("Method1");
  130.                 method1();
  131.                 method2 = luaEnv.Global.Get<Method2>("Method2");
  132.                 int b2 = 0;
  133.                 int b3 = 0;
  134.                 int b1= method2(2,6,ref b2,out b3);
  135.                 Debug.Log("Lua Function 函数映射method2  b1="+b1+" b2="+b2+" b3="+b3);
  136.                 method3 = luaEnv.Global.Get<Method3>("Method3");
  137.                 Action res = method3();
  138.                 res();
  139.                 //======LuaFunction=======
  140.                 luaFunction = luaEnv.Global.Get<LuaFunction>("Method2");               
  141.                 object[] resArr = luaFunction.Call(new object[] { 1, 2 }, new Type[] { typeof(int), typeof(int),typeof(int)});
  142.                 Debug.Log("Lua  Function映射到LuaFunction函数:b1="+(int)resArr[0]+" b2="+(int)resArr[1]+" b3="+(int)resArr[2]);
  143.         }
  144.        
  145.         // Update is called once per frame
  146.         void Update () {
  147.                 if (luaEnv != null)
  148.                         luaEnv.Tick();
  149.         }
  150.         void OnDestroy()
  151.         {
  152.                 if (luaEnv != null)
  153.                         luaEnv.Dispose();
  154.         }
  155. }
复制代码
运行结果如下



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 07:15 , Processed in 0.089643 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表