1.Unity加载Lua文件的流程
Unity中我们要加载Lua文件调用的函数是:LuaState类中的DoFile("xxx").我们可以看到流程是:
LuaState:DoFile()->LuaState:LoadFileBuffer()->LuaFileUtils:ReadFile()->FindFile()
public void DoFile(string fileName)
{
byte[] buffer = LoadFileBuffer(fileName);
fileName = LuaChunkName(fileName);
LuaLoadBuffer(buffer, fileName);
}
byte[] LoadFileBuffer(string fileName)
{
#if UNITY_EDITOR
if (!beStart)
{
throw new LuaException("you must call Start() first to initialize LuaState");
}
#endif
byte[] buffer = LuaFileUtils.Instance.ReadFile(fileName);
if (buffer == null)
{
string error = string.Format("cannot open {0}: No such file or directory", fileName);
error += LuaFileUtils.Instance.FindFileError(fileName);
throw new LuaException(error);
}
return buffer;
}
public virtual byte[] ReadFile(string fileName)
{
if (!beZip)
{
string path = FindFile(fileName);
byte[] str = null;
if (!string.IsNullOrEmpty(path) && File.Exists(path))
{
#if !UNITY_WEBPLAYER
str = File.ReadAllBytes(path);
#else
throw new LuaException("can't run in web platform, please switch to other platform");
#endif
}
return str;
}
else
{
return ReadZipFile(fileName);
}
}
public string FindFile(string fileName)
{
if (fileName == string.Empty)
{
return string.Empty;
}
if (Path.IsPathRooted(fileName))
{
if (!fileName.EndsWith(".lua"))
{
fileName += ".lua";
}
return fileName;
}
if (fileName.EndsWith(".lua"))
{
fileName = fileName.Substring(0, fileName.Length - 4);
}
string fullPath = null;
for (int i = 0; i < searchPaths.Count; i++)
{
fullPath = searchPaths[i].Replace("?", fileName);