Xlua04.使用C#调用lua脚本
原创
©著作权归作者所有:来自51CTO博客作者我的流浪国的原创作品,请联系作者获取转载授权,否则将追究法律责任
01.导入插件
https://github.com/Tencent/xLua
02.C#调用lua
最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua; //引入xlua
public class helllow : MonoBehaviour {
LuaEnv luaenv;
void Start () {
luaenv = new LuaEnv(); //创建 xlua虚拟机
luaenv.DoString("print('6666')");
}
private void OnDestroy() {
luaenv.Dispose();
}
}
03.C#调用lua文件
创建LoadLuaThree.lua.txt,放入Resources文件夹
Resource加载的loader,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀(见附带的例子)。
Hero={name,hp,mp,attack}
function Hero:Attack1()
print("攻击方法1")
end
function Hero.Attack2()
print("攻击方法2")
end
function Hero:New()
H={};
MH={__index=self}
setmetatable(H,MH);
return H;
end
NewPerson=Hero:New();
NewPerson.name="好滴好滴";
NewPerson.Attack2();
NewPerson.Attack1();
创建C#脚本 LoadLua
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class LoadLua : MonoBehaviour {
LuaEnv luaEnv;
void Start () {
luaEnv=new LuaEnv();
TextAsset text=Resources.Load<TextAsset>("LoadLuaThree.lua");
luaEnv.DoString(text.text);
}
private void OnDestroy() {
luaEnv.Dispose();
}
}
04.用lua的require函数
比如:DoString(“require ‘byfile’”)
完整代码见XLua\Tutorial\LoadLuaScript\ByFile目录
require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class LoadLua : MonoBehaviour {
LuaEnv luaEnv;
void Start () {
luaEnv=new LuaEnv();
luaEnv.DoString( "require'LoadLuaThree'");
}
private void OnDestroy() {
luaEnv.Dispose();
}
}
使用xLua的自定义Loader加载lua脚本
public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader);
通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using XLua;
public class Cunsterloader : MonoBehaviour {
private LuaEnv luaEnv;
void Start () {
Debug.Log(Application.streamingAssetsPath);
luaEnv=new LuaEnv();
luaEnv.AddLoader(CustomLoaders);
luaEnv.DoString( "require'LoadLuaThree.lua.txt'");
}
private byte[] CustomLoaders(ref string filepath){
string path=Application.streamingAssetsPath+"/"+filepath;
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
private void OnDestroy() {
luaEnv.Dispose();
}
}