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();
    }
    //定义接口一定要加[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)
end

C#脚本

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
end

C#脚本

//自定义委托(使用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();
    }

Lua教学和热更新教学​pan.baidu.com

 

提取码:c7o0

王者荣耀全栈教学​pan.baidu.com

 

提取码:dhhc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值