278 lines
7.6 KiB
C#
278 lines
7.6 KiB
C#
|
/*
|
|||
|
Copyright (c) 2015-2017 topameng(topameng@qq.com)
|
|||
|
|
|||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
in the Software without restriction, including without limitation the rights
|
|||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|||
|
The above copyright notice and this permission notice shall be included in all
|
|||
|
copies or substantial portions of the Software.
|
|||
|
|
|||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
SOFTWARE.
|
|||
|
*/
|
|||
|
|
|||
|
using UnityEngine;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Collections;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace LuaInterface
|
|||
|
{
|
|||
|
public class LuaFileUtils
|
|||
|
{
|
|||
|
public static LuaFileUtils Instance
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (instance == null)
|
|||
|
{
|
|||
|
instance = new LuaFileUtils();
|
|||
|
}
|
|||
|
|
|||
|
return instance;
|
|||
|
}
|
|||
|
|
|||
|
protected set
|
|||
|
{
|
|||
|
instance = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//beZip = false 在search path 中查找读取lua文件。否则从外部设置过来bundel文件中读取lua文件
|
|||
|
public bool beZip = false;
|
|||
|
protected List<string> searchPaths = new List<string>();
|
|||
|
protected Dictionary<string, AssetBundle> zipMap = new Dictionary<string, AssetBundle>();
|
|||
|
|
|||
|
protected static LuaFileUtils instance = null;
|
|||
|
|
|||
|
public LuaFileUtils()
|
|||
|
{
|
|||
|
instance = this;
|
|||
|
}
|
|||
|
|
|||
|
public virtual void Dispose()
|
|||
|
{
|
|||
|
if (instance != null)
|
|||
|
{
|
|||
|
instance = null;
|
|||
|
searchPaths.Clear();
|
|||
|
|
|||
|
foreach (KeyValuePair<string, AssetBundle> iter in zipMap)
|
|||
|
{
|
|||
|
iter.Value.Unload(true);
|
|||
|
}
|
|||
|
|
|||
|
zipMap.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//格式: 路径/?.lua
|
|||
|
public bool AddSearchPath(string path, bool front = false)
|
|||
|
{
|
|||
|
int index = searchPaths.IndexOf(path);
|
|||
|
|
|||
|
if (index >= 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (front)
|
|||
|
{
|
|||
|
searchPaths.Insert(0, path);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
searchPaths.Add(path);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool RemoveSearchPath(string path)
|
|||
|
{
|
|||
|
int index = searchPaths.IndexOf(path);
|
|||
|
|
|||
|
if (index >= 0)
|
|||
|
{
|
|||
|
searchPaths.RemoveAt(index);
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public void AddSearchBundle(string name, AssetBundle bundle)
|
|||
|
{
|
|||
|
zipMap[name] = bundle;
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
if (File.Exists(fullPath))
|
|||
|
{
|
|||
|
return fullPath;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
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 virtual string FindFileError(string fileName)
|
|||
|
{
|
|||
|
if (Path.IsPathRooted(fileName))
|
|||
|
{
|
|||
|
return fileName;
|
|||
|
}
|
|||
|
|
|||
|
if (fileName.EndsWith(".lua"))
|
|||
|
{
|
|||
|
fileName = fileName.Substring(0, fileName.Length - 4);
|
|||
|
}
|
|||
|
|
|||
|
using (CString.Block())
|
|||
|
{
|
|||
|
CString sb = CString.Alloc(512);
|
|||
|
|
|||
|
for (int i = 0; i < searchPaths.Count; i++)
|
|||
|
{
|
|||
|
sb.Append("\n\tno file '").Append(searchPaths[i]).Append('\'');
|
|||
|
}
|
|||
|
|
|||
|
sb = sb.Replace("?", fileName);
|
|||
|
|
|||
|
if (beZip)
|
|||
|
{
|
|||
|
int pos = fileName.LastIndexOf('/');
|
|||
|
|
|||
|
if (pos > 0)
|
|||
|
{
|
|||
|
int tmp = pos + 1;
|
|||
|
sb.Append("\n\tno file '").Append(fileName, tmp, fileName.Length - tmp).Append(".lua' in ").Append("lua_");
|
|||
|
tmp = sb.Length;
|
|||
|
sb.Append(fileName, 0, pos).Replace('/', '_', tmp, pos).Append(".unity3d");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sb.Append("\n\tno file '").Append(fileName).Append(".lua' in ").Append("lua.unity3d");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return sb.ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
byte[] ReadZipFile(string fileName)
|
|||
|
{
|
|||
|
AssetBundle zipFile = null;
|
|||
|
byte[] buffer = null;
|
|||
|
string zipName = null;
|
|||
|
|
|||
|
using (CString.Block())
|
|||
|
{
|
|||
|
CString sb = CString.Alloc(256);
|
|||
|
sb.Append("lua");
|
|||
|
int pos = fileName.LastIndexOf('/');
|
|||
|
|
|||
|
if (pos > 0)
|
|||
|
{
|
|||
|
sb.Append("_");
|
|||
|
sb.Append(fileName, 0, pos).ToLower().Replace('/', '_');
|
|||
|
fileName = fileName.Substring(pos + 1);
|
|||
|
}
|
|||
|
|
|||
|
if (!fileName.EndsWith(".lua"))
|
|||
|
{
|
|||
|
fileName += ".lua";
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_5 || UNITY_5_3_OR_NEWER
|
|||
|
fileName += ".bytes";
|
|||
|
#endif
|
|||
|
zipName = sb.ToString();
|
|||
|
zipMap.TryGetValue(zipName, out zipFile);
|
|||
|
}
|
|||
|
|
|||
|
if (zipFile != null)
|
|||
|
{
|
|||
|
#if UNITY_4_6 || UNITY_4_7
|
|||
|
TextAsset luaCode = zipFile.Load(fileName, typeof(TextAsset)) as TextAsset;
|
|||
|
#else
|
|||
|
TextAsset luaCode = zipFile.LoadAsset<TextAsset>(fileName);
|
|||
|
#endif
|
|||
|
if (luaCode != null)
|
|||
|
{
|
|||
|
buffer = luaCode.bytes;
|
|||
|
Resources.UnloadAsset(luaCode);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return buffer;
|
|||
|
}
|
|||
|
|
|||
|
public static string GetOSDir()
|
|||
|
{
|
|||
|
return LuaConst.osDir;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|