我正在嘗試為 Unity 制作自定義編輯器腳本,但我陷入了我認為很簡單的一步。使用 UnityEditor.GetWindow() 時,視窗不會在主選項卡中打開,而是作為單獨的視窗打開。
現在,如果您真的希望無論打開哪個選項卡都將其停靠,您可以使用反射來查找每個繼承者EditorWindow并執行
using Linq;
...
var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes()).Where(type =>type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(EditorWindow))).ToArray();
// This kind of equals doing something like
//var typesList = new List<Type>();
//var assemblies = AppDomain.CurrentDomain.GetAssemblies();
//foreach(var assembly in assemblies)
//{
// var allTypes = assembly.GetTypes();
// foreach(var type in allTypes)
// {
// if(type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(EditorWindow)))
// {
// typesList.Add(type);
// }
// }
//}
//var types = typesList.ToArray();
var window = GetWindow<YOURWINDOW>(types);
請注意,盡管由于訂單原因,這ConsoleWindow幾乎是第一個條目,所以如果打開了控制臺選項卡,它總是首先附加到那個 ^^
您仍然可以添加您喜歡的,例如
var types = new List<Type>()
{
// first add your preferences
typeof(SceneView),
typeof(Editor).Assembly.GetType("UnityEditor.GameView"),
typeof(Editor).Assembly.GetType("UnityEditor.SceneHierarchyWindow"),
typeof(Editor).Assembly.GetType("UnityEditor.ConsoleWindow"),
typeof(Editor).Assembly.GetType("UnityEditor.ProjectBrowser"),
typeof(Editor).Assembly.GetType("UnityEditor.InspectorWindow")
};
// and then add all others as fallback (who cares about duplicates at this point ? ;) )
types.AddRange(AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes()).Where(type =>type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(EditorWindow))));
var window = GetWindow<YOURWINDOW>(types.ToArray());
since it literally goes through this array from start to end and uses the first matching opened window type.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436232.html
標籤:C# unity3d 反射 统一编辑 unity3d 编辑器
上一篇:如何在C#中模仿Javascript“擴展運算子”?
下一篇:將子物件的子物件放入List
