XLua笔记

XLua笔记

目录

  • XLua笔记
  • 下载框架
  • 使用方法
    • C#调用Lua
      • LuaEnv.DoString()执行Lua语句
      • 通过框架内置的loader加载Lua源文件
      • C#访问Lua全局变量
    • Lua调用C#
      • 在Lua中创建新物体
      • Lua访问C#静态属性和方法

xLua是Unity3D下Lua编程解决方案,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。

下载框架

框架地址
下载完的XLua框架导入Unity工程

使用方法

C#调用Lua

LuaEnv.DoString()执行Lua语句

using UnityEngine;
using XLua;

public class Demo1 : MonoBehaviour
{
private LuaEnv luaEnv;
void Start()
{
luaEnv = new LuaEnv();//创建lua运行环境
luaEnv.DoString("print('Hello world!')");//直接可以在DoString()括号中写Lua代码即可
}

private void OnDestroy()
{
luaEnv.Dispose();//释放lua环境
}
}

输出:
LUA: Hello world!

通过框架内置的loader加载Lua源文件

  1. 默认loader

在Resources文件夹中创建一个test.lua文件,通过loader加载test源文件
loader进行加载时默认是从Resources文件夹中进行加载的

using UnityEngine;
using XLua;

public class Demo1 : MonoBehaviour
{
private LuaEnv luaEnv;
void Start()
{
luaEnv = new LuaEnv();//创建lua运行环境
luaEnv.DoString("require ‘test’");
}

}

  1. 自定义loader

那么问题来了,一般使用xLua框架肯定是想着热更新的,但是默认loader是从Resources文件夹中加载lua文件
显然,热更新时需要更新的lua脚本肯定不能放入Resources中,那么这个时候xlua框架中提供了自定义loader的方法
如下:
现在我把所有的lua脚本都放在了Assets/Demo/Lua这个文件夹中,现在自定义loader来加载这个文件夹里的lua脚本

using UnityEngine;
using XLua;

public class Demo1 : MonoBehaviour
{
private LuaEnv luaenv;
void Start()
{
luaenv = new LuaEnv();//创建lua运行环境
LuaEnv.CustomLoader method = CustomLoader;
luaenv.AddLoader(method);
//加载Assets/Demo/Lua这个文件夹中的Main.lua文件
luaenv.DoString("require 'Main'");//执行lua语句 require "Main"
}

public byte[] CustomLoader(ref string fileName)
{
Debug.Log(fileName);
string filePath;
filePath = Application.dataPath + "/Demo/Lua/" + fileName.Replace('.', '/') + ".lua";

if (File.Exists(filePath))
{
Debug.Log(filePath);
return File.ReadAllBytes(filePath);
}
return null;
}

}

C#访问Lua全局变量

C# 访问lua脚本中的字段、方法体、table
Main.lua文件内容如下:

a =100
str="呆阿狸"
isMan = true;

function TestFun()
print("进入TestFun方法")
end

testTable ={
name="呆阿狸"
age=25
}

dict ={key1="value1",key2="value2"}

class TestClass{
public name;
public age;

}

void Start()
{
LuaEnv luaenv = new LuaEnv();

luaenv.DoString("require 'Main'");//调用完才能取得里面的变量

//获取Lua脚本中的字段
int a = luaenv.Global.Get("a");//获取lua里面的全局变量a
print(a);
string str = luaenv.Global.Get("str");//获取lua里面的全局变量str
print(str);
bool isMan = luaenv.Global.Get("isMan");//获取lua里面的全局变量isDie
print(isMan);

//获取Lua中的function
Action testFunAct = luaenv.Global.Get("TestFun");
testFunAct?.Invoke();

//获取Lua中的table
TestClass testClass = luaenv.Global.Get("TestTable");
Debug.Log("name:"+testClass.name);
Debug.Log("age:"+testClass.age);

//获取lua中的字典
Dictionary dict=luaenv.Global.Get>("dict");
Debug.Log(dict["key1"]);
Debug.Log(dict["key2"]);
env.Dispose();

输出:
100
呆阿狸
true
进入TestFun方法
name:呆阿狸
age:25
value1
value2

Lua调用C#

在Lua中创建新物体

//创建一个名字叫NEWOBJ的空物体
CS.UnityEngine.GameObject(“NEWOBJ”)

Lua访问C#静态属性和方法

lua代码如下:


CS.UnityEngine.Time.timeScale = 0.8

你可能感兴趣的:(Unity,c#)