|
|
- /*
- Copyright (c) 2015-2016 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.
- */
- //打开开关没有写入导出列表的纯虚类自动跳过
- //#define JUMP_NODEFINED_ABSTRACT
-
- using UnityEngine;
- using UnityEditor;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Text;
- using System.IO;
- using System.Diagnostics;
- using LuaInterface;
- using LuaFramework;
- using Object = UnityEngine.Object;
- using Debug = UnityEngine.Debug;
- using Debugger = LuaInterface.Debugger;
- using System.Threading;
-
- [InitializeOnLoad]
- public static class ToLuaMenu
- {
- //不需要导出或者无法导出的类型
- public static List<Type> dropType = new List<Type>
- {
- typeof(ValueType), //不需要
- #if !UNITY_5
- typeof(Motion), //很多平台只是空类
- #endif
- typeof(UnityEngine.YieldInstruction), //无需导出的类
- typeof(UnityEngine.WaitForEndOfFrame), //内部支持
- typeof(UnityEngine.WaitForFixedUpdate),
- typeof(UnityEngine.WaitForSeconds),
- typeof(UnityEngine.Mathf), //lua层支持
- typeof(Plane),
- typeof(LayerMask),
- typeof(Vector3),
- typeof(Vector4),
- typeof(Vector2),
- typeof(Quaternion),
- typeof(Ray),
- typeof(Bounds),
- typeof(Color),
- typeof(Touch),
- typeof(RaycastHit),
- typeof(TouchPhase),
- //typeof(LuaInterface.LuaOutMetatable), //手写支持
- typeof(LuaInterface.NullObject),
- typeof(System.Array),
- typeof(System.Reflection.MemberInfo),
- typeof(System.Reflection.BindingFlags),
- typeof(LuaInterface.LuaFunction),
- typeof(LuaInterface.LuaTable),
- typeof(LuaInterface.LuaThread),
- typeof(LuaInterface.LuaByteBuffer), //只是类型标识符
- //typeof(DelegateFactory), //无需导出,导出类支持lua函数转换为委托。如UIEventListener.OnClick(luafunc)
- };
-
- //可以导出的内部支持类型
- public static List<Type> baseType = new List<Type>
- {
- typeof(System.Object),
- typeof(System.Delegate),
- typeof(System.String),
- typeof(System.Enum),
- typeof(System.Type),
- typeof(System.Collections.IEnumerator),
- typeof(UnityEngine.Object),
- typeof(LuaInterface.EventObject),
- typeof(LuaInterface.LuaMethod),
- typeof(LuaInterface.LuaProperty),
- typeof(LuaInterface.LuaField),
- typeof(LuaInterface.LuaConstructor),
- };
-
- private static bool beAutoGen = false;
- private static bool beCheck = false; // 不检测自动生成交互接口文件
- static List<BindType> allTypes = new List<BindType>();
-
- static ToLuaMenu()
- {
- if (!beCheck)
- return;
-
- string dir = CustomSettings.saveDir;
- string[] files = Directory.GetFiles(dir, "*.cs", SearchOption.TopDirectoryOnly);
-
- if (files.Length < 3 && beCheck)
- {
- if (EditorUtility.DisplayDialog("自动生成", "点击确定自动生成常用类型注册文件, 也可通过菜单逐步完成此功能", "确定", "取消"))
- {
- beAutoGen = true;
- GenLuaDelegates();
- AssetDatabase.Refresh();
- GenerateClassWraps();
- GenLuaBinder();
- beAutoGen = false;
- }
-
- beCheck = false;
- }
- }
-
- static string RemoveNameSpace(string name, string space)
- {
- if (space != null)
- {
- name = name.Remove(0, space.Length + 1);
- }
-
- return name;
- }
-
- public class BindType
- {
- public string name; //类名称
- public Type type;
- public bool IsStatic;
- public string wrapName = ""; //产生的wrap文件名字
- public string libName = ""; //注册到lua的名字
- public Type baseType = null;
- public string nameSpace = null; //注册到lua的table层级
-
- public List<Type> extendList = new List<Type>();
-
- public BindType(Type t)
- {
- if (typeof(System.MulticastDelegate).IsAssignableFrom(t))
- {
- throw new NotSupportedException(string.Format("\nDon't export Delegate {0} as a class, register it in customDelegateList", LuaMisc.GetTypeName(t)));
- }
-
- //if (IsObsolete(t))
- //{
- // throw new Exception(string.Format("\n{0} is obsolete, don't export it!", LuaMisc.GetTypeName(t)));
- //}
-
- type = t;
- nameSpace = ToLuaExport.GetNameSpace(t, out libName);
- name = ToLuaExport.CombineTypeStr(nameSpace, libName);
- libName = ToLuaExport.ConvertToLibSign(libName);
-
- if (name == "object")
- {
- wrapName = "System_Object";
- name = "System.Object";
- }
- else if (name == "string")
- {
- wrapName = "System_String";
- name = "System.String";
- }
- else
- {
- wrapName = name.Replace('.', '_');
- wrapName = ToLuaExport.ConvertToLibSign(wrapName);
- }
-
- int index = CustomSettings.staticClassTypes.IndexOf(type);
-
- if (index >= 0 || (type.IsAbstract && type.IsSealed))
- {
- IsStatic = true;
- }
-
- baseType = LuaMisc.GetExportBaseType(type);
- }
-
- public BindType SetBaseType(Type t)
- {
- baseType = t;
- return this;
- }
-
- public BindType AddExtendType(Type t)
- {
- if (!extendList.Contains(t))
- {
- extendList.Add(t);
- }
-
- return this;
- }
-
- public BindType SetWrapName(string str)
- {
- wrapName = str;
- return this;
- }
-
- public BindType SetLibName(string str)
- {
- libName = str;
- return this;
- }
-
- public BindType SetNameSpace(string space)
- {
- nameSpace = space;
- return this;
- }
-
- public static bool IsObsolete(Type type)
- {
- object[] attrs = type.GetCustomAttributes(true);
-
- for (int j = 0; j < attrs.Length; j++)
- {
- Type t = attrs[j].GetType();
-
- if (t == typeof(System.ObsoleteAttribute) || t == typeof(NoToLuaAttribute) || t.Name == "MonoNotSupportedAttribute" || t.Name == "MonoTODOAttribute")
- {
- return true;
- }
- }
-
- return false;
- }
- }
-
- static void AutoAddBaseType(BindType bt, bool beDropBaseType)
- {
- Type t = bt.baseType;
-
- if (t == null)
- {
- return;
- }
-
- if (t.IsInterface)
- {
- Debugger.LogWarning("{0} has a base type {1} is Interface, use SetBaseType to jump it", bt.name, t.FullName);
- bt.baseType = t.BaseType;
- }
- else if (dropType.IndexOf(t) >= 0)
- {
- Debugger.LogWarning("{0} has a base type {1} is a drop type", bt.name, t.FullName);
- bt.baseType = t.BaseType;
- }
- else if (!beDropBaseType || baseType.IndexOf(t) < 0)
- {
- int index = allTypes.FindIndex((iter) => { return iter.type == t; });
-
- if (index < 0)
- {
- #if JUMP_NODEFINED_ABSTRACT
- if (t.IsAbstract && !t.IsSealed)
- {
- Debugger.LogWarning("not defined bindtype for {0}, it is abstract class, jump it, child class is {1}", t.FullName, bt.name);
- bt.baseType = t.BaseType;
- }
- else
- {
- Debugger.LogWarning("not defined bindtype for {0}, autogen it, child class is {1}", t.FullName, bt.name);
- bt = new BindType(t);
- allTypes.Add(bt);
- }
- #else
- Debugger.LogWarning("not defined bindtype for {0}, autogen it, child class is {1}", t.FullName, bt.name);
- bt = new BindType(t);
- allTypes.Add(bt);
- #endif
- }
- else
- {
- return;
- }
- }
- else
- {
- return;
- }
-
- AutoAddBaseType(bt, beDropBaseType);
- }
-
- static BindType[] GenBindTypes(BindType[] list, bool beDropBaseType = true)
- {
- allTypes = new List<BindType>(list);
-
- for (int i = 0; i < list.Length; i++)
- {
- for (int j = i + 1; j < list.Length; j++)
- {
- if (list[i].type == list[j].type)
- throw new NotSupportedException("Repeat BindType:" + list[i].type);
- }
-
- if (dropType.IndexOf(list[i].type) >= 0)
- {
- LogManager.LogWarning(list[i].type.FullName + " in dropType table, not need to export");
- allTypes.Remove(list[i]);
- continue;
- }
- else if (beDropBaseType && baseType.IndexOf(list[i].type) >= 0)
- {
- LogManager.LogWarning(list[i].type.FullName + " is Base Type, not need to export");
- allTypes.Remove(list[i]);
- continue;
- }
- else if (list[i].type.IsEnum)
- {
- continue;
- }
-
- AutoAddBaseType(list[i], beDropBaseType);
- }
-
- return allTypes.ToArray();
- }
-
- [MenuItem("Lua/Gen Lua Wrap Files", false, 1)]
- public static void GenerateClassWraps()
- {
- if (!beAutoGen && EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- if (!File.Exists(CustomSettings.saveDir))
- {
- Directory.CreateDirectory(CustomSettings.saveDir);
- }
-
- allTypes.Clear();
- BindType[] typeList = CustomSettings.customTypeList;
-
- BindType[] list = GenBindTypes(typeList);
- ToLuaExport.allTypes.AddRange(baseType);
-
- for (int i = 0; i < list.Length; i++)
- {
- ToLuaExport.allTypes.Add(list[i].type);
- }
-
- for (int i = 0; i < list.Length; i++)
- {
- ToLuaExport.Clear();
- ToLuaExport.className = list[i].name;
- ToLuaExport.type = list[i].type;
- ToLuaExport.isStaticClass = list[i].IsStatic;
- ToLuaExport.baseType = list[i].baseType;
- ToLuaExport.wrapClassName = list[i].wrapName;
- ToLuaExport.libClassName = list[i].libName;
- ToLuaExport.extendList = list[i].extendList;
- ToLuaExport.Generate(CustomSettings.saveDir);
- }
-
- LogManager.Log("Generate lua binding files over");
- ToLuaExport.allTypes.Clear();
- allTypes.Clear();
- AssetDatabase.Refresh();
- }
-
- static HashSet<Type> GetCustomTypeDelegates()
- {
- BindType[] list = CustomSettings.customTypeList;
- HashSet<Type> set = new HashSet<Type>();
- BindingFlags binding = BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase | BindingFlags.Instance;
-
- for (int i = 0; i < list.Length; i++)
- {
- Type type = list[i].type;
- FieldInfo[] fields = type.GetFields(BindingFlags.GetField | BindingFlags.SetField | binding);
- PropertyInfo[] props = type.GetProperties(BindingFlags.GetProperty | BindingFlags.SetProperty | binding);
- MethodInfo[] methods = null;
-
- if (type.IsInterface)
- {
- methods = type.GetMethods();
- }
- else
- {
- methods = type.GetMethods(BindingFlags.Instance | binding);
- }
-
- for (int j = 0; j < fields.Length; j++)
- {
- Type t = fields[j].FieldType;
-
- if (ToLuaExport.IsDelegateType(t))
- {
- set.Add(t);
- }
- }
-
- for (int j = 0; j < props.Length; j++)
- {
- Type t = props[j].PropertyType;
-
- if (ToLuaExport.IsDelegateType(t))
- {
- set.Add(t);
- }
- }
-
- for (int j = 0; j < methods.Length; j++)
- {
- MethodInfo m = methods[j];
-
- if (m.IsGenericMethod)
- {
- continue;
- }
-
- ParameterInfo[] pifs = m.GetParameters();
-
- for (int k = 0; k < pifs.Length; k++)
- {
- Type t = pifs[k].ParameterType;
- if (t.IsByRef) t = t.GetElementType();
-
- if (ToLuaExport.IsDelegateType(t))
- {
- set.Add(t);
- }
- }
- }
-
- }
-
- return set;
- }
-
- [MenuItem("Lua/Gen Lua Delegates", false, 2)]
- static void GenLuaDelegates()
- {
- if (!beAutoGen && EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- ToLuaExport.Clear();
- List<DelegateType> list = new List<DelegateType>();
- list.AddRange(CustomSettings.customDelegateList);
- HashSet<Type> set = GetCustomTypeDelegates();
-
- foreach (Type t in set)
- {
- if (null == list.Find((p) => { return p.type == t; }))
- {
- list.Add(new DelegateType(t));
- }
- }
-
- ToLuaExport.GenDelegates(list.ToArray());
- set.Clear();
- ToLuaExport.Clear();
- AssetDatabase.Refresh();
- LogManager.Log("Create lua delegate over");
- }
-
- static ToLuaTree<string> InitTree()
- {
- ToLuaTree<string> tree = new ToLuaTree<string>();
- ToLuaNode<string> root = tree.GetRoot();
- BindType[] list = GenBindTypes(CustomSettings.customTypeList);
-
- for (int i = 0; i < list.Length; i++)
- {
- string space = list[i].nameSpace;
- AddSpaceNameToTree(tree, root, space);
- }
-
- DelegateType[] dts = CustomSettings.customDelegateList;
- string str = null;
-
- for (int i = 0; i < dts.Length; i++)
- {
- string space = ToLuaExport.GetNameSpace(dts[i].type, out str);
- AddSpaceNameToTree(tree, root, space);
- }
-
- return tree;
- }
-
- static void AddSpaceNameToTree(ToLuaTree<string> tree, ToLuaNode<string> parent, string space)
- {
- if (space == null || space == string.Empty)
- {
- return;
- }
-
- string[] ns = space.Split(new char[] { '.' });
-
- for (int j = 0; j < ns.Length; j++)
- {
- List<ToLuaNode<string>> nodes = tree.Find((_t) => { return _t == ns[j]; }, j);
-
- if (nodes.Count == 0)
- {
- ToLuaNode<string> node = new ToLuaNode<string>();
- node.value = ns[j];
- parent.childs.Add(node);
- node.parent = parent;
- node.layer = j;
- parent = node;
- }
- else
- {
- bool flag = false;
- int index = 0;
-
- for (int i = 0; i < nodes.Count; i++)
- {
- int count = j;
- int size = j;
- ToLuaNode<string> nodecopy = nodes[i];
-
- while (nodecopy.parent != null)
- {
- nodecopy = nodecopy.parent;
- if (nodecopy.value != null && nodecopy.value == ns[--count])
- {
- size--;
- }
- }
-
- if (size == 0)
- {
- index = i;
- flag = true;
- break;
- }
- }
-
- if (!flag)
- {
- ToLuaNode<string> nnode = new ToLuaNode<string>();
- nnode.value = ns[j];
- nnode.layer = j;
- nnode.parent = parent;
- parent.childs.Add(nnode);
- parent = nnode;
- }
- else
- {
- parent = nodes[index];
- }
- }
- }
- }
-
- static string GetSpaceNameFromTree(ToLuaNode<string> node)
- {
- string name = node.value;
-
- while (node.parent != null && node.parent.value != null)
- {
- node = node.parent;
- name = node.value + "." + name;
- }
-
- return name;
- }
-
- static string RemoveTemplateSign(string str)
- {
- str = str.Replace('<', '_');
-
- int index = str.IndexOf('>');
-
- while (index > 0)
- {
- str = str.Remove(index, 1);
- index = str.IndexOf('>');
- }
-
- return str;
- }
-
- [MenuItem("Lua/Gen LuaBinder File", false, 4)]
- static void GenLuaBinder()
- {
- if (!beAutoGen && EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- allTypes.Clear();
- ToLuaTree<string> tree = InitTree();
- StringBuilder sb = new StringBuilder();
- List<DelegateType> dtList = new List<DelegateType>();
-
- List<DelegateType> list = new List<DelegateType>();
- list.AddRange(CustomSettings.customDelegateList);
- HashSet<Type> set = GetCustomTypeDelegates();
-
- List<BindType> backupList = new List<BindType>();
- backupList.AddRange(allTypes);
- ToLuaNode<string> root = tree.GetRoot();
- string libname = null;
-
- foreach (Type t in set)
- {
- if (null == list.Find((p) => { return p.type == t; }))
- {
- DelegateType dt = new DelegateType(t);
- AddSpaceNameToTree(tree, root, ToLuaExport.GetNameSpace(t, out libname));
- list.Add(dt);
- }
- }
-
- sb.AppendLineEx("//this source code was auto-generated by tolua#, do not modify it");
- sb.AppendLineEx("using System;");
- sb.AppendLineEx("using UnityEngine;");
- sb.AppendLineEx("using LuaInterface;");
- sb.AppendLineEx();
- sb.AppendLineEx("public static class LuaBinder");
- sb.AppendLineEx("{");
- sb.AppendLineEx("\tpublic static void Bind(LuaState L)");
- sb.AppendLineEx("\t{");
- sb.AppendLineEx("\t\tfloat t = Time.realtimeSinceStartup;");
- sb.AppendLineEx("\t\tL.BeginModule(null);");
-
- GenRegisterInfo(null, sb, list, dtList);
-
- Action<ToLuaNode<string>> begin = (node) =>
- {
- if (node.value == null)
- {
- return;
- }
-
- sb.AppendFormat("\t\tL.BeginModule(\"{0}\");\r\n", node.value);
- string space = GetSpaceNameFromTree(node);
-
- GenRegisterInfo(space, sb, list, dtList);
- };
-
- Action<ToLuaNode<string>> end = (node) =>
- {
- if (node.value != null)
- {
- sb.AppendLineEx("\t\tL.EndModule();");
- }
- };
-
- tree.DepthFirstTraversal(begin, end, tree.GetRoot());
- sb.AppendLineEx("\t\tL.EndModule();");
-
- if (CustomSettings.dynamicList.Count > 0)
- {
- sb.AppendLineEx("\t\tL.BeginPreLoad();");
-
- for (int i = 0; i < CustomSettings.dynamicList.Count; i++)
- {
- Type t1 = CustomSettings.dynamicList[i];
- BindType bt = backupList.Find((p) => { return p.type == t1; });
- sb.AppendFormat("\t\tL.AddPreLoad(\"{0}\", LuaOpen_{1}, typeof({0}));\r\n", bt.name, bt.wrapName);
- }
-
- sb.AppendLineEx("\t\tL.EndPreLoad();");
- }
-
- sb.AppendLineEx("\t\tDebugger.Log(\"Register lua type cost time: {0}\", Time.realtimeSinceStartup - t);");
- sb.AppendLineEx("\t}");
-
- for (int i = 0; i < dtList.Count; i++)
- {
- ToLuaExport.GenEventFunction(dtList[i].type, sb);
- }
-
- if (CustomSettings.dynamicList.Count > 0)
- {
-
- for (int i = 0; i < CustomSettings.dynamicList.Count; i++)
- {
- Type t = CustomSettings.dynamicList[i];
- BindType bt = backupList.Find((p) => { return p.type == t; });
- GenPreLoadFunction(bt, sb);
- }
- }
-
- sb.AppendLineEx("}\r\n");
- allTypes.Clear();
- string file = CustomSettings.saveDir + "LuaBinder.cs";
-
- using (StreamWriter textWriter = new StreamWriter(file, false, Encoding.UTF8))
- {
- textWriter.Write(sb.ToString());
- textWriter.Flush();
- textWriter.Close();
- }
-
- AssetDatabase.Refresh();
- Debugger.Log("Generate LuaBinder over !");
- }
-
- static void GenRegisterInfo(string nameSpace, StringBuilder sb, List<DelegateType> delegateList, List<DelegateType> wrappedDelegatesCache)
- {
- for (int i = 0; i < allTypes.Count; i++)
- {
- Type dt = CustomSettings.dynamicList.Find((p) => { return allTypes[i].type == p; });
-
- if (dt == null && allTypes[i].nameSpace == nameSpace)
- {
- string str = "\t\t" + allTypes[i].wrapName + "Wrap.Register(L);\r\n";
- sb.Append(str);
- allTypes.RemoveAt(i--);
- }
- }
-
- string funcName = null;
-
- for (int i = 0; i < delegateList.Count; i++)
- {
- DelegateType dt = delegateList[i];
- Type type = dt.type;
- string typeSpace = ToLuaExport.GetNameSpace(type, out funcName);
-
- if (typeSpace == nameSpace)
- {
- funcName = ToLuaExport.ConvertToLibSign(funcName);
- string abr = dt.abr;
- abr = abr == null ? funcName : abr;
- sb.AppendFormat("\t\tL.RegFunction(\"{0}\", {1});\r\n", abr, dt.name);
- wrappedDelegatesCache.Add(dt);
- }
- }
- }
-
- static void GenPreLoadFunction(BindType bt, StringBuilder sb)
- {
- string funcName = "LuaOpen_" + bt.wrapName;
-
- sb.AppendLineEx("\r\n\t[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]");
- sb.AppendFormat("\tstatic int {0}(IntPtr L)\r\n", funcName);
- sb.AppendLineEx("\t{");
- sb.AppendLineEx("\t\ttry");
- sb.AppendLineEx("\t\t{");
- sb.AppendLineEx("\t\t\tLuaState state = LuaState.Get(L);");
- sb.AppendFormat("\t\t\tstate.BeginPreModule(\"{0}\");\r\n", bt.nameSpace);
- sb.AppendFormat("\t\t\t{0}Wrap.Register(state);\r\n", bt.wrapName);
- sb.AppendFormat("\t\t\tint reference = state.GetMetaReference(typeof({0}));\r\n", bt.name);
- sb.AppendLineEx("\t\t\tstate.EndPreModule(reference);");
- sb.AppendLineEx("\t\t\treturn 1;");
- sb.AppendLineEx("\t\t}");
- sb.AppendLineEx("\t\tcatch(Exception e)");
- sb.AppendLineEx("\t\t{");
- sb.AppendLineEx("\t\t\treturn LuaDLL.toluaL_exception(L, e);");
- sb.AppendLineEx("\t\t}");
- sb.AppendLineEx("\t}");
- }
-
- static string GetOS()
- {
- return LuaConst.osDir;
- }
-
- static string CreateStreamDir(string dir)
- {
- dir = Application.streamingAssetsPath + "/" + dir;
-
- if (!File.Exists(dir))
- {
- Directory.CreateDirectory(dir);
- }
-
- return dir;
- }
-
- static void BuildLuaBundle(string subDir, string sourceDir)
- {
- string[] files = Directory.GetFiles(sourceDir + subDir, "*.bytes");
- string bundleName = subDir == null ? "lua" + AppConst.ExtName : "lua" + subDir.Replace('/', '_') + AppConst.ExtName;
- bundleName = bundleName.ToLower();
-
- #if UNITY_5
- for (int i = 0; i < files.Length; i++)
- {
- AssetImporter importer = AssetImporter.GetAtPath(files[i]);
-
- if (importer)
- {
- importer.assetBundleName = bundleName;
- importer.assetBundleVariant = null;
- }
- }
- #else
- List<Object> list = new List<Object>();
-
- for (int i = 0; i < files.Length; i++)
- {
- Object obj = AssetDatabase.LoadMainAssetAtPath(files[i]);
- list.Add(obj);
- }
-
- BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle;
-
- if (files.Length > 0)
- {
- string output = string.Format("{0}/{1}/" + bundleName, Application.streamingAssetsPath, GetOS());
- File.Delete(output);
- BuildPipeline.BuildAssetBundle(null, list.ToArray(), output, options, EditorUserBuildSettings.activeBuildTarget);
- }
- #endif
- }
-
- static void ClearAllLuaFiles()
- {
- string osPath = Application.streamingAssetsPath + "/" + GetOS();
-
- if (Directory.Exists(osPath))
- {
- string[] files = Directory.GetFiles(osPath, "Lua*" + AppConst.ExtName);
-
- for (int i = 0; i < files.Length; i++)
- {
- File.Delete(files[i]);
- }
- }
-
- string path = osPath + "/Lua";
-
- if (Directory.Exists(path))
- {
- Directory.Delete(path, true);
- }
-
- path = Application.streamingAssetsPath + "/Lua";
-
- if (Directory.Exists(path))
- {
- Directory.Delete(path, true);
- }
-
- path = Application.dataPath + "/temp";
-
- if (Directory.Exists(path))
- {
- Directory.Delete(path, true);
- }
-
- path = Application.dataPath + "/Resources/Lua";
-
- if (Directory.Exists(path))
- {
- Directory.Delete(path, true);
- }
-
- path = Application.persistentDataPath + "/" + GetOS() + "/Lua";
-
- if (Directory.Exists(path))
- {
- Directory.Delete(path, true);
- }
- }
-
- [MenuItem("Lua/Gen LuaWrap + Binder", false, 4)]
- static void GenLuaWrapBinder()
- {
- if (EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- beAutoGen = true;
- AssetDatabase.Refresh();
- GenerateClassWraps();
- GenLuaBinder();
- beAutoGen = false;
- }
-
- [MenuItem("Lua/Generate All", false, 5)]
- static void GenLuaAll()
- {
- if (EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- beAutoGen = true;
- GenLuaDelegates();
- AssetDatabase.Refresh();
- GenerateClassWraps();
- GenLuaBinder();
- beAutoGen = false;
-
- EditorUtility.DisplayDialog("提示", "生成全部接口文件成功", "确定");
- }
-
- [MenuItem("Lua/Clear wrap files", false, 6)]
- static void ClearLuaWraps()
- {
- string[] files = Directory.GetFiles(CustomSettings.saveDir, "*.cs", SearchOption.TopDirectoryOnly);
-
- for (int i = 0; i < files.Length; i++)
- {
- File.Delete(files[i]);
- }
-
- ToLuaExport.Clear();
- List<DelegateType> list = new List<DelegateType>();
- ToLuaExport.GenDelegates(list.ToArray());
- ToLuaExport.Clear();
-
- StringBuilder sb = new StringBuilder();
- sb.AppendLineEx("using System;");
- sb.AppendLineEx("using LuaInterface;");
- sb.AppendLineEx();
- sb.AppendLineEx("public static class LuaBinder");
- sb.AppendLineEx("{");
- sb.AppendLineEx("\tpublic static void Bind(LuaState L)");
- sb.AppendLineEx("\t{");
- sb.AppendLineEx("\t\tthrow new LuaException(\"Please generate LuaBinder files first!\");");
- sb.AppendLineEx("\t}");
- sb.AppendLineEx("}");
-
- string file = CustomSettings.saveDir + "LuaBinder.cs";
-
- using (StreamWriter textWriter = new StreamWriter(file, false, Encoding.UTF8))
- {
- textWriter.Write(sb.ToString());
- textWriter.Flush();
- textWriter.Close();
- }
-
- AssetDatabase.Refresh();
-
- EditorUtility.DisplayDialog("提示", "清理全部接口文件成功", "确定");
- }
-
- public static void CopyLuaBytesFiles(string sourceDir, string destDir, bool appendext = true, string searchPattern = "*.lua", SearchOption option = SearchOption.AllDirectories)
- {
- if (!Directory.Exists(sourceDir))
- {
- return;
- }
-
- string[] files = Directory.GetFiles(sourceDir, searchPattern, option);
- int len = sourceDir.Length;
-
- if (sourceDir[len - 1] == '/' || sourceDir[len - 1] == '\\')
- {
- --len;
- }
-
- for (int i = 0; i < files.Length; i++)
- {
- string str = files[i].Remove(0, len);
- string dest = destDir + "/" + str;
- if (appendext) dest += ".bytes";
- string dir = Path.GetDirectoryName(dest);
- Directory.CreateDirectory(dir);
- File.Copy(files[i], dest, true);
- }
- }
-
-
- [MenuItem("Lua/Copy Lua files to Resources", false, 51)]
- public static void CopyLuaFilesToRes()
- {
- ClearAllLuaFiles();
- string destDir = Application.dataPath + "/Resources" + "/Lua";
- CopyLuaBytesFiles(LuaConst.luaDir, destDir);
- AssetDatabase.Refresh();
- LogManager.Log("Copy lua files over");
- }
-
- [MenuItem("Lua/Copy Lua files to Persistent", false, 52)]
- public static void CopyLuaFilesToPersistent()
- {
- ClearAllLuaFiles();
- string destDir = Application.persistentDataPath + "/" + GetOS() + "/Lua";
- CopyLuaBytesFiles(LuaConst.luaDir, destDir, false);
- AssetDatabase.Refresh();
- LogManager.Log("Copy lua files over");
- }
-
- static void GetAllDirs(string dir, List<string> list)
- {
- string[] dirs = Directory.GetDirectories(dir);
- list.AddRange(dirs);
-
- for (int i = 0; i < dirs.Length; i++)
- {
- GetAllDirs(dirs[i], list);
- }
- }
-
- static void CopyDirectory(string source, string dest, string searchPattern = "*.lua", SearchOption option = SearchOption.AllDirectories)
- {
- string[] files = Directory.GetFiles(source, searchPattern, option);
-
- for (int i = 0; i < files.Length; i++)
- {
- string str = files[i].Remove(0, source.Length);
- string path = dest + "/" + str;
- string dir = Path.GetDirectoryName(path);
- Directory.CreateDirectory(dir);
- File.Copy(files[i], path, true);
- }
- }
-
- [MenuItem("Lua/Build Lua files to Resources (PC)", false, 53)]
- public static void BuildLuaToResources()
- {
- ClearAllLuaFiles();
- string tempDir = CreateStreamDir("Lua");
- string destDir = Application.dataPath + "/Resources" + "/Lua";
-
- string path = Application.dataPath.Replace('\\', '/');
- path = path.Substring(0, path.LastIndexOf('/'));
- File.Copy(path + "/Luajit/Build.bat", tempDir + "/Build.bat", true);
- CopyLuaBytesFiles(LuaConst.luaDir, tempDir, false);
- Process proc = Process.Start(tempDir + "/Build.bat");
- proc.WaitForExit();
- CopyLuaBytesFiles(tempDir + "/Out/", destDir, false, "*.lua.bytes");
-
- Directory.Delete(tempDir, true);
- AssetDatabase.Refresh();
- }
-
- [MenuItem("Lua/Build Lua files to Persistent (PC)", false, 54)]
- public static void BuildLuaToPersistent()
- {
- ClearAllLuaFiles();
- string tempDir = CreateStreamDir("Lua");
- string destDir = Application.persistentDataPath + "/" + GetOS() + "/Lua/";
-
- string path = Application.dataPath.Replace('\\', '/');
- path = path.Substring(0, path.LastIndexOf('/'));
- File.Copy(path + "/Luajit/Build.bat", tempDir + "/Build.bat", true);
- CopyLuaBytesFiles(LuaConst.luaDir, tempDir, false);
- Process proc = Process.Start(tempDir + "/Build.bat");
- proc.WaitForExit();
-
- path = tempDir + "/Out/";
- string[] files = Directory.GetFiles(path, "*.lua.bytes");
- int len = path.Length;
-
- for (int i = 0; i < files.Length; i++)
- {
- path = files[i].Remove(0, len);
- path = path.Substring(0, path.Length - 6);
- path = destDir + path;
-
- File.Copy(files[i], path, true);
- }
-
- Directory.Delete(tempDir, true);
- AssetDatabase.Refresh();
- }
-
- [MenuItem("Lua/Build bundle files not jit", false, 55)]
- public static void BuildNotJitBundles()
- {
- ClearAllLuaFiles();
- CreateStreamDir(GetOS());
-
- #if !UNITY_5
- string tempDir = CreateStreamDir("Lua");
- #else
- string tempDir = Application.dataPath + "/temp/Lua";
-
- if (!File.Exists(tempDir))
- {
- Directory.CreateDirectory(tempDir);
- }
- #endif
- CopyLuaBytesFiles(LuaConst.luaDir, tempDir);
-
- AssetDatabase.Refresh();
- List<string> dirs = new List<string>();
- GetAllDirs(tempDir, dirs);
-
- #if UNITY_5
- for (int i = 0; i < dirs.Count; i++)
- {
- string str = dirs[i].Remove(0, tempDir.Length);
- BuildLuaBundle(str.Replace('\\', '/'), "Assets/temp/Lua");
- }
-
- BuildLuaBundle(null, "Assets/temp/Lua");
-
- AssetDatabase.SaveAssets();
- string output = string.Format("{0}/{1}", Application.streamingAssetsPath, GetOS());
- BuildPipeline.BuildAssetBundles(output, BuildAssetBundleOptions.DeterministicAssetBundle, EditorUserBuildSettings.activeBuildTarget);
-
- //Directory.Delete(Application.dataPath + "/temp/", true);
- #else
- for (int i = 0; i < dirs.Count; i++)
- {
- string str = dirs[i].Remove(0, tempDir.Length);
- BuildLuaBundle(str.Replace('\\', '/'), "Assets/StreamingAssets/Lua");
- }
-
- BuildLuaBundle(null, "Assets/StreamingAssets/Lua");
- Directory.Delete(Application.streamingAssetsPath + "/Lua/", true);
- #endif
- AssetDatabase.Refresh();
- }
-
- [MenuItem("Lua/Build Luajit bundle files (PC)", false, 56)]
- public static void BuildLuaBundles()
- {
- ClearAllLuaFiles();
- CreateStreamDir(GetOS());
-
- #if !UNITY_5
- string tempDir = CreateStreamDir("Lua");
- #else
- string tempDir = Application.dataPath + "/temp/Lua";
-
- if (!File.Exists(tempDir))
- {
- Directory.CreateDirectory(tempDir);
- }
- #endif
-
- string path = Application.dataPath.Replace('\\', '/');
- path = path.Substring(0, path.LastIndexOf('/'));
- File.Copy(path + "/Luajit/Build.bat", tempDir + "/Build.bat", true);
- CopyLuaBytesFiles(LuaConst.luaDir, tempDir, false);
- Process proc = Process.Start(tempDir + "/Build.bat");
- proc.WaitForExit();
-
- AssetDatabase.Refresh();
-
- string sourceDir = tempDir + "/Out";
- List<string> dirs = new List<string>();
- GetAllDirs(sourceDir, dirs);
-
- #if UNITY_5
- for (int i = 0; i < dirs.Count; i++)
- {
- string str = dirs[i].Remove(0, sourceDir.Length);
- BuildLuaBundle(str.Replace('\\', '/'), "Assets/temp/Lua/Out");
- }
-
- BuildLuaBundle(null, "Assets/temp/Lua/Out");
-
- AssetDatabase.Refresh();
- string output = string.Format("{0}/{1}", Application.streamingAssetsPath, GetOS());
- BuildPipeline.BuildAssetBundles(output, BuildAssetBundleOptions.DeterministicAssetBundle, EditorUserBuildSettings.activeBuildTarget);
- Directory.Delete(Application.dataPath + "/temp/", true);
- #else
- for (int i = 0; i < dirs.Count; i++)
- {
- string str = dirs[i].Remove(0, sourceDir.Length);
- BuildLuaBundle(str.Replace('\\', '/'), "Assets/StreamingAssets/Lua/Out");
- }
-
- BuildLuaBundle(null, "Assets/StreamingAssets/Lua/Out/");
- Directory.Delete(tempDir, true);
- #endif
- AssetDatabase.Refresh();
- }
-
- [MenuItem("Lua/Clear all Lua files", false, 57)]
- public static void ClearLuaFiles()
- {
- ClearAllLuaFiles();
- }
-
-
- [MenuItem("Lua/Gen BaseType Wrap", false, 101)]
- static void GenBaseTypeLuaWrap()
- {
- if (!beAutoGen && EditorApplication.isCompiling)
- {
- EditorUtility.DisplayDialog("警告", "请等待编辑器完成编译再执行此功能", "确定");
- return;
- }
-
- string dir = CustomSettings.toluaBaseType;
-
- if (!File.Exists(dir))
- {
- Directory.CreateDirectory(dir);
- }
-
- allTypes.Clear();
- ToLuaExport.allTypes.AddRange(baseType);
- List<BindType> btList = new List<BindType>();
-
- for (int i = 0; i < baseType.Count; i++)
- {
- btList.Add(new BindType(baseType[i]));
- }
-
- GenBindTypes(btList.ToArray(), false);
- BindType[] list = allTypes.ToArray();
-
- for (int i = 0; i < list.Length; i++)
- {
- ToLuaExport.Clear();
- ToLuaExport.className = list[i].name;
- ToLuaExport.type = list[i].type;
- ToLuaExport.isStaticClass = list[i].IsStatic;
- ToLuaExport.baseType = list[i].baseType;
- ToLuaExport.wrapClassName = list[i].wrapName;
- ToLuaExport.libClassName = list[i].libName;
- ToLuaExport.Generate(dir);
- }
-
- LogManager.Log("Generate base type files over");
- allTypes.Clear();
- AssetDatabase.Refresh();
- }
-
- static void CreateDefaultWrapFile(string path, string name)
- {
- StringBuilder sb = new StringBuilder();
- path = path + name + ".cs";
- sb.AppendLineEx("using System;");
- sb.AppendLineEx("using LuaInterface;");
- sb.AppendLineEx();
- sb.AppendLineEx("public static class " + name);
- sb.AppendLineEx("{");
- sb.AppendLineEx("\tpublic static void Register(LuaState L)");
- sb.AppendLineEx("\t{");
- sb.AppendLineEx("\t\tthrow new LuaException(\"Please click menu Lua/Gen BaseType Wrap first!\");");
- sb.AppendLineEx("\t}");
- sb.AppendLineEx("}");
-
- using (StreamWriter textWriter = new StreamWriter(path, false, Encoding.UTF8))
- {
- textWriter.Write(sb.ToString());
- textWriter.Flush();
- textWriter.Close();
- }
- }
-
- [MenuItem("Lua/Clear BaseType Wrap", false, 102)]
- static void ClearBaseTypeLuaWrap()
- {
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_ObjectWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_DelegateWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_StringWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_EnumWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_TypeWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "System_Collections_IEnumeratorWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "UnityEngine_ObjectWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "LuaInterface_EventObjectWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "LuaInterface_LuaMethodWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "LuaInterface_LuaPropertyWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "LuaInterface_LuaFieldWrap");
- CreateDefaultWrapFile(CustomSettings.toluaBaseType, "LuaInterface_LuaConstructorWrap");
-
- LogManager.Log("Clear base type wrap files over");
- AssetDatabase.Refresh();
- }
- }
|