Unity和Lua的相互调用(XLua框架)

XLua是一套成熟的热更新框架,本编记录Unity和Lua的相互调用。

Unity调用Lua

用lua的require函数即可 ,require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。目前xLua除了原生的loader外,还添加了从Resource加载的loader,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀。

 LuaEnv luaEnv = new LuaEnv();

 luaEnv.DoString("require 'fq'");

获取一个全局基本数据类型 访问LuaEnv.Global就可以了


        //获取lua中的全局变量
        int a=  luaEnv.Global.Get<int>("a");

        Debug.Log(a);

访问一个全局的table有四种方法

1.映射到普通class或struct

    class Person {
        public string name;

        public int age;
    
    }
        Person p = luaEnv.Global.Get<Person>("tab");

        print(p.name + "  " + p.age);

2.映射到一个interface,接口要加上  [CSharpCallLua]

    [CSharpCallLua]
    public  interface IPerson
    {
        string name { get; set; }

        int age { get; set; }

        void eat(int a,int b);
        
    }

    IPerson p1 = luaEnv.Global.Get<IPerson>("tab");

    print(p1.name);

    p1.eat(12,3);

3.映射到Dictionary<>,List<> 但是字典和数组各有优缺点,字典只会映射到带Key的,数组只会映射到不带Key的元素。

  Dictionary<string,object> dic=  luaEnv.Global.Get<Dictionary<string, object>>("tab");

        foreach (var item in dic)
        {
           print(item.Key );
        }

  List<object> list = luaEnv.Global.Get<List<object>>("tab");

        foreach (var item in list)
        {
            print(item);
        }

4.映射到LuaTable类,这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。

   LuaTable tab = luaEnv.Global.Get<LuaTable>("tab");

       print(tab.Get<string>("name"));

访问一个全局的function两种方法

1.映射到delegate,这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码

 [CSharpCallLua]
 delegate void Add(int a, int b);

 Add act = luaEnv.Global.Get<Add>("add");
 act(7,8);
 act = null;

2.映射到LuaFunction,这种方式的优缺点刚好和第一种相反。

  LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("add");

  luaFunction.Call(1, 8);

Lua调Unity

unity代码准备

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;


public class test1 : MonoBehaviour
{
 
    void Start()
    {
        LuaEnv luaEnv = new LuaEnv();

        luaEnv.DoString("require 'ffq'");

        luaEnv.Dispose();
    }

    public void Rrr()
    {
        print(1);
    } 
    void Update()
    {
        
    }
}

lua代码

 
 --lua访问静态的属性和方法
 local unity= CS.UnityEngine

 unity.GameObject("一个物体")

 local a=unity.GameObject.Find("Main Camera")

 a.name="相机"

 --lua访问成员变量和方法
 local c=a:GetComponent("Camera")

 unity.GameObject.Destroy(c);


 local L=  CS.test1()
 
 L:Rrr()

猜你喜欢

转载自blog.csdn.net/f402455894/article/details/123831048