zifa2003293 发表于 2023-2-14 17:18

unity刘国柱热更新设计之Xlua基础学习笔记(二)C#调用lua ...

一、获取一个全局基本数据类型
1.LuaEnv.Global,中的Get方法,可指定返回的类型。
luaenv.Global.Get<int>("a")
luaenv.Global.Get<string>("b")

[*]文件放置方式



文件以txt为后缀



[*]内容Lua
--测试 Csharp 调用lua
--定义全局变量
str="全局变量"
number=10
local num =20
floNumber =88.8
IsFisrtTime=true

[*]C#内容
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");

      string str1 = env.Global.Get<string>("str");
      int number1 = env.Global.Get<int>("number");
       // int num1 = env.Global.Get<int>("num");//报错 报错如下图 因为这种方法只可以访问全局变量
      //测试结果
      Debug.Log(number1);//正常输出
      Debug.Log(str1);//正常输出
       // Debug.Log(num1);

    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }


二、访问一个全局table
1.四种方式:

[*]方式一:映射到普通class或struct
[*]方式二:映射到一个interface(推荐方式)
[*]方式三:by value方式:映射到Dictionary<>,List<>
[*]方式四:by ref方式,映射到LuaTable 类
2.方式一实例:为值拷贝 修改C#中类的属性值 lua文件中的属性值不变。

[*]文件放置同上
[*]lua文件代码
gameLanguge={str1="C#",str2="Lua",str3="C++",str4="C"}

[*]C#
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息
      GameLanguage gameLanguage = env.Global.Get<GameLanguage>("gameLanguge");
      //输出
      Debug.Log(gameLanguage.str1);
      Debug.Log(gameLanguage.str2);
      Debug.Log(gameLanguage.str3);


    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }
    //定义内部类
    public class GameLanguage
    {
      public string str1;
      public string str2;
      public string str3;
    }
3.方式二:为引用拷贝

[*]文件放置同上
[*]lua文件代码同上
[*]C#
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息
      IGameLanguage gameLanguage = env.Global.Get<IGameLanguage>("gameLanguge");
      //输出
      Debug.Log(gameLanguage.str1);
      Debug.Log(gameLanguage.str2);
      Debug.Log(gameLanguage.str3);


    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }
    //定义接口一定要加标签
   
    public interface IGameLanguage
    {
      string str1 { get; set; }
      string str2 { get; set; }
      string str3 { get; set; }
    }

[*]需要在unity中生成对应的类



点击后会生成对应文件



在这个文件夹下

4.方式3 : by value方式
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息
      Dictionary<string, object> dic= env.Global.Get<Dictionary<string, object>>("gameLanguge");
      //输出
      foreach (stringkey in dic.Keys)
      {
            Debug.Log(dic);
      }
    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }
5.方式4:by ref方式,映射到LuaTable 类(复杂函数,性能低)
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息
      LuaTable tabGameLanguge = env.Global.Get<LuaTable>("gameLanguge");
      //输出
      Debug.Log(tabGameLanguge.Get<string>("str1"));
      
    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }
三、访问一个全局变量function
1.方式一:采用delegate方式。(官方推荐方式)
lua脚本
--定义单独的lua函数
function ProcMyFunc1()
print("ProcMyFunc1无参无返回值")
end

function ProcMyFunc2(num1,num2)
print("ProcMyFunc2 两个参数无返回值 num1+num2="..num1+num2)
endC#脚本
env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息(通过委托进行映射)调用无参无返回值的函数
      act=env.Global.Get<Action>("ProcMyFunc1");
      //调用有参无返回值函数
      act2 =env.Global.Get<delAdding>("ProcMyFunc2");

      //输出
      act.Invoke();
      act2(50,12);
多返回值用out实现的方法
lua脚本
function ProcMyFunc4(num1,num2)
local result=num1+num2
print("ProcMyFunc4 两个参数多个返回值 num1+num2="..num1+num2)
return num1,num2,result
endC#脚本
//自定义委托(使用out关键字)

public delegate void aelAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);
public class CallLuaByGlableVar : MonoBehaviour
{
    aelAddingMutilReturn act = null;
    //lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息(通过委托进行映射)得到具有多个返回值的函数
      act=env.Global.Get<aelAddingMutilReturn>("ProcMyFunc4");
      //输出
      int intOutRes1 = 0;
      int intOutRes2 = 0;
      int intOutRes3 = 0;
      act(100,80,out intOutRes1, out intOutRes2, out intOutRes3);
      Debug.Log(string.Format("res1={0},res2={1},res3={2}", intOutRes1, intOutRes2, intOutRes3));

    }
    private void OnDestroy()
    {
      //释放之前需要将委托释放
      act=null;
      //释放
      env.Dispose();
    }
}
多返回值用ref实现的方法
//自定义委托(使用out关键字)

public delegate void aelAddingMutilReturn(ref int num1,ref int num2, out int res3);
public class CallLuaByGlableVar : MonoBehaviour
{
    aelAddingMutilReturn act = null;
    //lua环境(官方建议全局唯一)
    LuaEnv env = null;
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息(通过委托进行映射)得到具有多个返回值的函数
      act=env.Global.Get<aelAddingMutilReturn>("ProcMyFunc4");
      //输出
      int intOutRes1 = 100;
      int intOutRes2 = 80;
      int intOutRes3 = 0;
      act(ref intOutRes1, ref intOutRes2,out intOutRes3);
      Debug.Log(string.Format("res1={0},res2={1},res3={2}", intOutRes1, intOutRes2, intOutRes3));

    }
    private void OnDestroy()
    {
      //释放之前需要将委托释放
      act=null;
      //释放
      env.Dispose();
    }
   
}
2.方法二:LuaFunc(不推荐)
//lua环境(官方建议全局唯一)
    LuaEnv env = null;
   
    void Start()
    {
      env = new LuaEnv();
      env.DoString("require'CsharpCallLua'");
      //得到lua中的表信息(通过LuaFunction进行映射)
      LuaFunction luaFun = env.Global.Get<LuaFunction>("ProcMyFunc1");
      LuaFunction luaFun2 = env.Global.Get<LuaFunction>("ProcMyFunc2");
      //输出
      luaFun.Call();
      luaFun.Call(20,34);

    }
    private void OnDestroy()
    {
      //释放
      env.Dispose();
    }
页: [1]
查看完整版本: unity刘国柱热更新设计之Xlua基础学习笔记(二)C#调用lua ...