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()
|