阅前提示
本系列为作者在学习框架与编写框架时的心得与笔记
适合人群:All
阅读方式:工具文章
本系列会不断更新,如果对你有所帮助,点赞收藏吧:)
文章目录
XLua
XLua的快速使用正如它的文档中所描述的那样,仅仅三行就完事了~
XLua.LuaEnv luaenv = new XLua.LuaEnv();
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaenv.Dispose();
接下来就是如何将这三行所包含的内容接入到我们的工程框架中了。
配置
在使用Unity做开发的过程中,多多少少在用到Lua时会需要和C#进行一些数据交互。在XLua中,无论是[LuaCallCSharp]还是[CSharpCallLua]用到的一个方式:Wrap。
Wrap,可以理解成**“包装”**。比如 我们想要在Lua中获取Unity中的一个GameObject,那我们Lua中的代码基本上会写成如下的形式
local gameObject = CS.UnityEngine.GameObject.Find("name")
可以看出,这基本上和我们在C#端的书写方式并没有什么差别,但实际上他们的原理却很不一样。
很明显的一点,lua的数据类型根本无法支持GameObject,所以我们引入了Wrap。无论使用XLua还是ToLua,在初始化的过程中必不可少的是将我们可能需要使用到的C#类、方法包装起来,以便在Lua中可以相对应的进行数据传递。当我们在Lua中需要调用C#的方法时,将通过入栈出栈的方式将 “数据” 进行传递(注:这里的数据是经过处理的每个Object的Id),最终完成Lua与C#的数据交互。
更多详细的理解可阅读:Lua C语言API、ToLua:逐行分析源码,搞清楚Wrap文件原理
[LuaCallCSharp]
讲到着,大致是说清楚了我们在配置什么了… 根据自身的需求将需要在Lua中被调用的东西都配置好。
[LuaCallCSharp]
public static List<Type> LuaCallCSharp = new List<Type>()
{
typeof(Component),
typeof(Transform),
typeof(Rigidbody),
typeof(Behaviour),
typeof(MonoBehaviour),
typeof(GameObject),
typeof(Time),
typeof(Texture),
typeof(Texture2D),
typeof(Shader),
typeof(Renderer),
typeof(Screen),
typeof(AudioClip),
...
typeof(自定义...),
}
[CSharpCallLua]
当然,也可以配置C#直接调用Lua的callback,着一般会配合LuaCallCSharp中的具体方法来使用。具体配置代码XLua中也提供了参考这里代码太长了就不再放出了。
初始化
配置说完后,我们就可以针对一开始提及的三行代码进行初始化了。
-
XLua.LuaEnv luaenv = new XLua.LuaEnv();
启动XLua,创建LuaEnv实例,这里面会做XLua初始化的工作,其中就包含了Wrap配置中的内容。
-
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
加载Lua脚本,XLua提供了DoString()提供了两种方式:string/byte[] ,实际上最终都是变为byte[]。
用例中的该方式比较直接,适合用来做简单的性测使用,一般项目中并不会这么用。
XLua提供了luaenv.AddLoader(CustomLoader loader) 方法,让我们自定义加载脚本的加载器。
public delegate byte[] CustomLoader(ref string filepath);
只需定义一个返回值为 byte[] 的方法即可。
-
luaenv.Dispose();
Dispose就过多介绍了,在关闭的时候当然是需要对其进行释放的~
这样,XLua的接入就已经算是初步完成了。以下是作者框架中的相关代码
//初始化
public override void Init()
{
//创建实例
mLuaEnv = new LuaEnv();
//添加加载器
mLuaEnv.AddLoader(XLuaLoader);
var enterFile = LuaEnterFile;
//加载Lua第一个脚本
mLuaEnv.DoString(XLuaLoader(ref enterFile));
...
}
//加载器
public byte[] XLuaLoader(ref string fileName)
{
//正式的加载交由资源管理模块来进行加载
#if XLua_VASSET || !UNITY_EDITOR
if(!fileName.EndsWith(".lua"))
fileName += ".lua";
return VAsset.Instance.LoadScriptFile(fileName);
#elif UNITY_EDITOR
//简单粗暴的加载方式:)
string filePath = string.Empty;
var name = fileName.Replace(".lua","");
mSearchPaths.ForEach(value=>{
if(File.Exists(value.Replace("?",name)))
{
filePath = value.Replace("?",name);
return;
}
});
if(filePath.IsEmptyOrNull())
return null;
return File.ReadAllBytes(filePath);
#endif
}
小节
因为作者目前还处于缓慢地撸框架阶段,所以对于XLua的使用并没有很深入的了解,也没有淌过XLua的坑,所以目前就不再这里在多说太多啦。就作者来言,对比了ToLua,XLua我觉得在接入上面会舒服很多。(因为二者我都接入了,因为我希望我的框架HotScript部分能满足所有的Lua使用者~)
推荐阅读:XLua在Unity中的用法摘要
.
.
.
.
.
嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)