请选择 进入手机版 | 继续访问电脑版

框架笔记:记录XLua的简单接入

[复制链接]
孤单 发表于 2021-1-3 11:56:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
阅前提示

本系列为作者在学习框架与编写框架时的心得与条记
适合人群:All
阅读方式:工具文章
本系列会不绝更新,如果对你有所资助,点赞收藏吧:)

文章目次



  XLua

XLua的快速使用正如它的文档中所形貌的那样,仅仅三行就完事了~
  1. 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中的代码根本上会写成如下的形式
  1. local gameObject = CS.UnityEngine.GameObject.Find("name")
复制代码
可以看出,这根本上和我们在C#端的书写方式并没有什么差别,但实际上他们的原理却很不一样。
很显着的一点,lua的数据范例根本无法支持GameObject,所以我们引入了Wrap。无论使用XLua照旧ToLua,在初始化的过程中必不可少的是将我们大概需要使用到的C#类、方法包装起来,以便在Lua中可以相对应的举行数据通报。当我们在Lua中需要调用C#的方法时,将通过入栈出栈的方式将 “数据” 举行通报(注:这里的数据是颠末处理处罚的每个Object的Id),最终完成Lua与C#的数据交互。
更多详细的明确可阅读Lua C语言APIToLua:逐行分析源码,搞清楚Wrap文件原理
  [LuaCallCSharp]

讲到着,大抵是说清楚了我们在设置什么了… 根据自身的需求将需要在Lua中被调用的东西都设置好。
  1. [LuaCallCSharp]    public static List LuaCallCSharp = new List()     {        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的接入就已经算是开端完成了。以下是作者框架中的相关代码
  1. //初始化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的坑,所以现在就不再这里在多说太多啦。就作者来言,对比了ToLuaXLua我以为在接入上面会舒服许多。(因为二者我都接入了,因为我希望我的框架HotScript部门能满足所有的Lua使用者~)
推荐阅读:XLua在Unity中的用法摘要
  .
.
.
.
.
  嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技能海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所资助:)

来源:https://blog.csdn.net/qq_28820675/article/details/111938186
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )