參考http://anchan828.github.io/editor-manual/web/customeditor.html
效果如下:
lua代碼來自https://www.lua.org/cgi-bin/demo?sieve
1.自定義一個Attribute:
using System;
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class CustomAssetAttribute : Attribute
{
public string[] extensions;
public CustomAssetAttribute(params string[] extensions)
{
this.extensions = extensions;
}
}
2.自定義.lua文件的Inspector
//根據選中的lua文件獲取其path,然後讀取內容,通過OnInspectorGUI來顯示
using UnityEditor;
using UnityEngine;
using System.IO;
using System;
[CustomAsset(".lua")]
public class LuaInspector : Editor
{
private string content;
void OnEnable()
{
string path = Application.dataPath + "/" + AssetDatabase.GetAssetPath(Selection.activeObject).Substring(7);
try
{
TextReader tr = new StreamReader(path);
content = tr.ReadToEnd();
tr.Close();
}
catch (Exception e)
{
Debug.Log(e);
}
}
public override void OnInspectorGUI()
{
GUILayout.Label(content);
}
}
3.具體預覽邏輯
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(DefaultAsset))]
public class DefaultAssetInspector : Editor
{
private Editor editor;
private static Type[] customAssetTypes;
[InitializeOnLoadMethod]
static void Init()
{
customAssetTypes = GetCustomAssetTypes();
}
/// <summary>
/// CustomAsset 屬性のついたクラスを取得する
/// </summary>
private static Type[] GetCustomAssetTypes()
{
// ユーザーの作成した DLL 內から取得する
var assemblyPaths = Directory.GetFiles("Library/ScriptAssemblies", "*.dll");
var types = new List<Type>();
var customAssetTypes = new List<Type>();
foreach (var assembly in assemblyPaths
.Select(assemblyPath => Assembly.LoadFile(assemblyPath)))
{
types.AddRange(assembly.GetTypes());
}
foreach (var type in types)
{
var customAttributes =
type.GetCustomAttributes(typeof(CustomAssetAttribute), false)
as CustomAssetAttribute[];
if (0 < customAttributes.Length)
customAssetTypes.Add(type);
}
return customAssetTypes.ToArray();
}
/// <summary>
/// 拡張子に対応した CustomAsset 屬性のついたクラスを取得する
/// </summary>
/// <param name="extension">拡張子(例: .zip)</param>
private Type GetCustomAssetEditorType(string extension)
{
foreach (var type in customAssetTypes)
{
var customAttributes =
type.GetCustomAttributes(typeof(CustomAssetAttribute), false)
as CustomAssetAttribute[];
foreach (var customAttribute in customAttributes)
{
if (customAttribute.extensions.Contains(extension))
return type;
}
}
return typeof(DefaultAsset);
}
private void OnEnable()
{
var assetPath = AssetDatabase.GetAssetPath(target);
var extension = Path.GetExtension(assetPath);
var customAssetEditorType = GetCustomAssetEditorType(extension);
editor = CreateEditor(target, customAssetEditorType);
}
public override void OnInspectorGUI()
{
if (editor != null)
{
GUI.enabled = true;
editor.OnInspectorGUI();
}
}
public override bool HasPreviewGUI()
{
return editor != null ? editor.HasPreviewGUI() : base.HasPreviewGUI();
}
public override void OnPreviewGUI(Rect r, GUIStyle background)
{
if (editor != null)
editor.OnPreviewGUI(r, background);
}
public override void OnPreviewSettings()
{
if (editor != null)
editor.OnPreviewSettings();
}
public override string GetInfoString()
{
return editor != null ? editor.GetInfoString() : base.GetInfoString();
}
//以下、任意で扱いたい Editor クラスの拡張を行う
}