- ToLua的Example示例学习笔记02_ScriptsFro
- ToLua的Example示例学习笔记_总集篇
- ToLua的Example示例学习笔记03_CallLuaFun
- ToLua的Example示例学习笔记13_CustomLoad
- ToLua的Example示例学习笔记22_UseList
- ToLua的Example示例学习笔记11_Delegate
- ToLua的Example示例学习笔记05_LuaCorouti
- ToLua的Example示例学习笔记04_AccessingL
- ToLua的Example示例学习笔记09_Dictionary
- ToLua的Example示例学习笔记07_LuaThread
展示了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.DoFile
与LuaState.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.lua
,LoadFileBuffer
负责找到对应的文件并返回其Bytes数组,感兴趣的人可以看一下,里面有一句byte[] buffer = LuaFileUtils.Instance.ReadFile(fileName);
,ReadFile
方法则负责读取文件,里面有一句string path = FindFile(fileName);
,FindFile
方法正是搜索searchpath
的集合中所有的路径,将路径中?.lua
的问号替换为文件名,以此来搜索Lua文件。searchpath
的集合在一开始lua = new LuaState();
的时候就已经初始化内置了一些默认路径。
说了这么多,为以后的案例介绍做一个提前的铺垫,这样比较好理解,不至于像我第一次看后面的案例一头雾水。
网友评论