Unity-Editor扩展Odin + 自定义EditorWindow记录
没有上下文,可能你不知道这是什么(关于Odin Inspector)
在写一个 Odin 插件的完整文章,卡了三天,之后会放出
使用Unity的人之中 1/10 可能会使用Editor扩展,而这之中的又1/10的 人可能会用Odin这个Editor的附加扩展 ------------ 1%的可能有兴趣
我曾经也是其中之一,一位觉得本身Editor就没什么用,而且Odin又扩展了Editor的Editor模板
对比一下Odin v3.0 和 3.3 的区别
Odin 3.0(2018)
Odin 3.3
不明白为什么?有什么?好对比,就对了
我也不打算解释
Odin Inspector 另外最新版本的<介绍页>,的IMGUI动画,也是藏了一些细节。。。。
(静态美比较重要,存在时间长,而且先有静态美再有动态美)
可能,你还是看不明白
看不明白就对了,看明白了你会想吐
EditorWindow你又明白多少??
if (ButtonTexture(_coreData.tools.icons.effects, 20))
{
AssetsPaletteWindow.Init();
}
public class AssetsPaletteWindow : EditorWindow
{
private Editor _editor;
private AssetsPalette _attachedPalette;
private static AssetsPaletteWindow _currentWindow;
/// <summary>
/// //修复太长问题
/// </summary>
Vector2 _scrollPos;
[MenuItem("D2D/Open Palette &e")]
public static void Init()
{
if (_currentWindow != null)
{
_currentWindow?.Close();
_currentWindow = null;
}
else
{
_currentWindow = ScriptableObject.CreateInstance<AssetsPaletteWindow>();
_currentWindow.position = new Rect(_coreData.tools.palettePosition.x, _coreData.tools.palettePosition.y, _coreData.tools.paletteSize.x, _coreData.tools.paletteSize.y);
_currentWindow.ShowPopup();
}
OnWindowToolsOpen();
}
private void OnEnable()
{
_attachedPalette = AssetsPalette.Instance;
_editor = Editor.CreateEditor(_attachedPalette);
}
private void OnGUI()
{
_scrollPos = GUILayout.BeginScrollView(_scrollPos);
// GUILayout.Space(100);
_editor.OnInspectorGUI();
//一个 Button换色写法
GUI.backgroundColor = Color.red;
if (GUILayout.Button("Close"))
{
//CloseAll();
}
GUI.backgroundColor = Color.white;
GUILayout.EndScrollView();
}
Odin 写标签代码容易带来的问题
简单是优点,而最大的优点往往是最大的缺点-------成也萧何,败也萧何
//定义一个数据类:ReplaceTool,可自然产生折叠效果(IMGUI自带)
/// <summary>
/// 扩展了GameObject 的 EditorInstantiate()一个替换场景”站桩点“的方法
/// </summary>
[Serializable]
public class ReplaceTool
{
//[Foldout("Replace tool")]//最终代码是有的,但其实没有用到的功能,
//!!!这里,我把他屏蔽了,其实功能完全没影响。。。。
//所以就会带来一个”严重“,但不易被发现的问题:就是很多影响启动(或Init初始化)的效率,但实际上没用的代码残留
//”普通“的程序员??是否有意识,或者足够自律,能把折叠多余的代码及时清掉??
//
//你不知道什么什么用的代码就应该清掉|杜绝,--------------”防微杜渐“
[SerializeField] private GameObject _replacer;
//[Foldout("Replace tool")]
[SerializeField] private bool _destroyOldSelected;
//[Foldout("Replace tool")]
[SerializeField] private bool _selectNewAfterSpawn;
[Button("Replace")]
public void Replace()
{
var instances = new List<GameObject>();
var length = Selection.gameObjects.Length;
for (var i = 0; i < length; i++)
{
var g = Selection.gameObjects[i];
var instance = _replacer.EditorInstantiate(g.transform.position, g.transform.parent);
instance.transform.rotation = g.transform.rotation;
instances.Add(instance);
if (_destroyOldSelected)
{
DestroyImmediate(Selection.gameObjects[i]);
length--;
i--;
}
}
if (_selectNewAfterSpawn)
Selection.objects = instances.ToArray();
}
}
/// <summary>
/// 站桩替换,,很简单的功能;实在不知道有什么用
/// </summary>
[Space]
public ReplaceTool replaceTool;
总结,
这个文章,是三段,或四段没什么关系的,又都是Editor 扩展的总结+记录