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

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

[复制链接]
发表于 2023-2-14 17:18 | 显示全部楼层 |阅读模式
一、获取一个全局基本数据类型
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();
    }
    //定义接口一定要加[CSharpCallLua]标签
    [CSharpCallLua]
    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 (string  key in dic.Keys)
        {
            Debug.Log(dic[key]);
        }
    }
    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关键字)
[CSharpCallLua]
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关键字)
[CSharpCallLua]
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();
    }

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 09:13 , Processed in 0.064828 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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