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

阅前提示

本系列为作者在学习框架与编写框架时的心得与笔记
适合人群: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语言APIToLua:逐行分析源码,搞清楚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的坑,所以目前就不再这里在多说太多啦。就作者来言,对比了ToLuaXLua我觉得在接入上面会舒服很多。(因为二者我都接入了,因为我希望我的框架HotScript部分能满足所有的Lua使用者~)
推荐阅读:XLua在Unity中的用法摘要


.
.
.
.
.




嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章