美文网首页
ToLua的Example示例学习笔记02_ScriptsFro

ToLua的Example示例学习笔记02_ScriptsFro

作者: 凌枫望星月 | 来源:发表于2020-05-10 20:41 被阅读0次

展示了dofile跟require的区别。

1」代码

操作代码如下:

    LuaState lua = null;

    void Start () 
    {      
        lua = new LuaState();                
        lua.Start();        
        //如果移动了ToLua目录,需要自己手动,这里只是例子就不做配置了
        string fullPath = Application.dataPath + "/ToLua/Examples/02_ScriptsFromFile";
        lua.AddSearchPath(fullPath);        
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(50, 50, 120, 45), "DoFile"))
        {
            lua.DoFile("ScriptsFromFile.lua");                        
        }
        else if (GUI.Button(new Rect(50, 150, 120, 45), "Require"))
        {            
            lua.Require("ScriptsFromFile");            
        }

        lua.Collect();
        lua.CheckTop();
    }

    void OnApplicationQuit()
    {
        lua.Dispose();
        lua = null;
    }

2」需要了解的部分

  • LuaState.DoFileLuaState.Require都是让代码执行的方法,不同的是,DoFile可以执行多次,而Require类似于Lua中的require(modulename),只会执行一次。
  • 因此,运行时多次点击UI上的DoFile按钮,会多次执行打印,而Require只会一次。

3」值得注意的方法

  • LuaState.AddSearchPath 负责增加搜索目录, 这样DoFile跟Require函数可以只用文件名,无需写全路径。

  • LuaState.DoFile 负责加载一个lua文件, 注意dofile需要扩展名, 可反复执行, 后面的变量会覆盖之前的DoFile加载的变量。

  • LuaState.Require 同lua require(modname)操作, 加载指定模块并且把结果写入到package.loaded中,如果modname存在, 则直接返回package.loaded[modname]。

  • LuaState.Collect 负责垃圾回收, 对于被自动gc的LuaFunction, LuaTable, 以及委托减掉的LuaFunction, 延迟删除的Object之类。等等需要延迟处理的回收, 都在这里自动执行,一般常见于Update函数里。

我们首先来看一下LuaState.AddSearchPath方法:

        public void AddSearchPath(string fullPath)
        {
            if (!Path.IsPathRooted(fullPath))
            {
                throw new LuaException(fullPath + " is not a full path");
            }

            fullPath = ToPackagePath(fullPath);
            LuaFileUtils.Instance.AddSearchPath(fullPath);        
        }
  • 首先,参数中的路径要是一个完全路径,然后ToPackagePath(fullPath)的作用是将路径中的\\替换为/,然后在末尾加上?.lua的字符串,比如路径fullPath变为E:/UnityPro/Learn_Tolua/Assets\ToLua/Examples/02_ScriptsFromFile,然后调用LuaFileUtils.Instance.AddSearchPath(fullPath)将这个fullPath加到一个路径集合中,以后就依次从这里面找lua文件啦。
    关于LuaFileUtils.Instance,这里暂时理解为一个管理文件读取的单例,里面有一个叫searchpath的集合,就往这里面添加刚刚做好的fullPath,尾部是?.lua,表示以lua文件名结尾。
    还有一个bool变量叫beZip,beZip = false 时在search path 中查找读取lua文件。否则从外部设置过来bundle文件中读取lua文件,这个我们以后在Bundle那一章去说。

其次,来看一下LuaState.DoFile方法:

        public void DoFile(string fileName)
        {
            byte[] buffer = LoadFileBuffer(fileName);
            fileName = LuaChunkName(fileName);
            LuaLoadBuffer(buffer, fileName);
        }

``
这里参数filename为ScriptsFromFile.luaLoadFileBuffer负责找到对应的文件并返回其Bytes数组,感兴趣的人可以看一下,里面有一句byte[] buffer = LuaFileUtils.Instance.ReadFile(fileName);ReadFile方法则负责读取文件,里面有一句string path = FindFile(fileName);FindFile方法正是搜索searchpath的集合中所有的路径,将路径中?.lua的问号替换为文件名,以此来搜索Lua文件。searchpath的集合在一开始lua = new LuaState();的时候就已经初始化内置了一些默认路径。

说了这么多,为以后的案例介绍做一个提前的铺垫,这样比较好理解,不至于像我第一次看后面的案例一头雾水。

相关文章

网友评论

      本文标题:ToLua的Example示例学习笔记02_ScriptsFro

      本文链接:https://www.haomeiwen.com/subject/qgwjnhtx.html