Unity本身也支持大量的文件类型导入器,不受Unity识别的文件会被识别未 DefaultAsset 类型。但是总会有自定义文件类型的需求,又想再Inspector面板看到预览。
博主找到两种解决方案:
使用自定义导入器。但是不支持StreammingAsset目录下文件。本篇暂不讲述。
- 使用自定义Inspector对DefaultAsset 重写。但是如果有多种重写文件,就回出现有的规则会失效。也可能是代码写的有问题。解决方案嘛,当然是依旧用反射。
使用
提供接口ICustomDefaultAssetInspector
,包含两个方法需要实现,如下:
1 2 3 4 5 6 7
| public interface ICustomDefaultAssetInspector { bool CanDraw(string path); void Draw(string path); }
|
需要重写Inspector面板的文件类型,创建一个类并实现上面接口,这里以.lua
文件做实例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class LuaInspector : ICustomDefaultAssetInspector { public bool CanDraw(string path) { return path.EndsWith(".lua"); }
public void Draw(string path) { string text = File.ReadAllText(path); GUILayout.TextArea(text); } }
|
反射内容写过系列文件,也不再赘述了,自行理解吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| [CanEditMultipleObjects, CustomEditor(typeof(DefaultAsset))] public class CustomDefaultAssetInspector : Editor { private readonly Type[] STRING_TYPE = new Type[] { typeof(string) }; Dictionary<object, Type> dict = new Dictionary<object, Type>(); private void OnEnable() { dict.Clear();
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { Type[] classArray = assemblies[i].GetTypes(); foreach (Type clazz in classArray) { if (clazz.IsInterface || clazz.IsAbstract) continue; foreach (Type _interface in clazz.GetInterfaces()) { if (_interface == typeof(ICustomDefaultAssetInspector)) { dict[Activator.CreateInstance(clazz)] = clazz; break; } } } } } public override void OnInspectorGUI() { base.OnInspectorGUI(); string path = AssetDatabase.GetAssetPath(Selection.activeInstanceID);
foreach (var item in dict) { object _ins = item.Key; Type clazz = item.Value;
MethodInfo method1 = clazz.GetMethod("CanDraw", STRING_TYPE); bool canDraw = (bool)method1.Invoke(_ins, new object[] { path }); if (canDraw) { MethodInfo method2 = clazz.GetMethod("Draw", STRING_TYPE); method2.Invoke(_ins, new object[] { path }); } } } }
|