通过脚本设置层次过滤器
Setting a hierarchy filter via script
在 Unity 编辑器的层次结构 window 顶部,有一个用于过滤层次结构的字段:
我的问题是您是否可以从编辑器脚本中设置过滤器以及如何设置。我在网上几乎找不到任何东西。
提前致谢。
感谢 d4RK,我发现了如何使用反射来实现它:
public const int FILTERMODE_ALL = 0;
public const int FILTERMODE_NAME = 1;
public const int FILTERMODE_TYPE = 2;
public static void SetSearchFilter(string filter, int filterMode) {
SearchableEditorWindow[] windows = (SearchableEditorWindow[])Resources.FindObjectsOfTypeAll (typeof(SearchableEditorWindow));
foreach (SearchableEditorWindow window in windows) {
if(window.GetType().ToString() == "UnityEditor.SceneHierarchyWindow") {
hierarchy = window;
break;
}
}
if (hierarchy == null)
return;
MethodInfo setSearchType = typeof(SearchableEditorWindow).GetMethod("SetSearchFilter", BindingFlags.NonPublic | BindingFlags.Instance);
object[] parameters = new object[]{filter, filterMode, false};
setSearchType.Invoke(hierarchy, parameters);
}
这可能不是最优雅的方式,但它很有魅力,可以轻松扩展以将相同的过滤器应用于 SceneView。
UnityEditor.SceneModeUtility.SearchForType
似乎是朝着正确的方向迈出了一步。
好消息是,您可以在 MonoDevelop 中看到该方法的实现。
仔细观察它会告诉我们需要的方法。
public static void SearchForType (Type type)
{
Object[] array = Resources.FindObjectsOfTypeAll (typeof(SceneHierarchyWindow));
SceneHierarchyWindow sceneHierarchyWindow = (array.Length <= 0) ? null : (array [0] as SceneHierarchyWindow);
if (sceneHierarchyWindow)
{
SceneModeUtility.s_HierarchyWindow = sceneHierarchyWindow;
if (type == null || type == typeof(GameObject))
{
SceneModeUtility.s_FocusType = null;
sceneHierarchyWindow.ClearSearchFilter ();
}
else
{
SceneModeUtility.s_FocusType = type;
if (sceneHierarchyWindow.searchMode == SearchableEditorWindow.SearchMode.Name)
{
sceneHierarchyWindow.searchMode = SearchableEditorWindow.SearchMode.All;
}
sceneHierarchyWindow.SetSearchFilter ("t:" + type.Name, sceneHierarchyWindow.searchMode, false);
sceneHierarchyWindow.hasSearchFilterFocus = true;
}
}
else
{
SceneModeUtility.s_FocusType = null;
}
}
现在坏消息是,由于它们的保护级别,您既不能直接访问层次结构 window,也不能使用 SetSearchFilter
方法。
或许您可以编写一个类似于层次结构视图的编辑器脚本,您可以在其中完全控制,并可以为所欲为。
从 Unity 2018 开始,SetSearchFilter method.
需要一个额外的布尔参数
所以改变这一行
object[] parameters = new object[]{filter, filterMode, false};
到
object[] parameters = new object[]{filter, filterMode, false, false};
这应该解决提到的 TargetParameterCountException
Ugo Hed。
在 Unity 编辑器的层次结构 window 顶部,有一个用于过滤层次结构的字段:
我的问题是您是否可以从编辑器脚本中设置过滤器以及如何设置。我在网上几乎找不到任何东西。
提前致谢。
感谢 d4RK,我发现了如何使用反射来实现它:
public const int FILTERMODE_ALL = 0;
public const int FILTERMODE_NAME = 1;
public const int FILTERMODE_TYPE = 2;
public static void SetSearchFilter(string filter, int filterMode) {
SearchableEditorWindow[] windows = (SearchableEditorWindow[])Resources.FindObjectsOfTypeAll (typeof(SearchableEditorWindow));
foreach (SearchableEditorWindow window in windows) {
if(window.GetType().ToString() == "UnityEditor.SceneHierarchyWindow") {
hierarchy = window;
break;
}
}
if (hierarchy == null)
return;
MethodInfo setSearchType = typeof(SearchableEditorWindow).GetMethod("SetSearchFilter", BindingFlags.NonPublic | BindingFlags.Instance);
object[] parameters = new object[]{filter, filterMode, false};
setSearchType.Invoke(hierarchy, parameters);
}
这可能不是最优雅的方式,但它很有魅力,可以轻松扩展以将相同的过滤器应用于 SceneView。
UnityEditor.SceneModeUtility.SearchForType
似乎是朝着正确的方向迈出了一步。
好消息是,您可以在 MonoDevelop 中看到该方法的实现。 仔细观察它会告诉我们需要的方法。
public static void SearchForType (Type type)
{
Object[] array = Resources.FindObjectsOfTypeAll (typeof(SceneHierarchyWindow));
SceneHierarchyWindow sceneHierarchyWindow = (array.Length <= 0) ? null : (array [0] as SceneHierarchyWindow);
if (sceneHierarchyWindow)
{
SceneModeUtility.s_HierarchyWindow = sceneHierarchyWindow;
if (type == null || type == typeof(GameObject))
{
SceneModeUtility.s_FocusType = null;
sceneHierarchyWindow.ClearSearchFilter ();
}
else
{
SceneModeUtility.s_FocusType = type;
if (sceneHierarchyWindow.searchMode == SearchableEditorWindow.SearchMode.Name)
{
sceneHierarchyWindow.searchMode = SearchableEditorWindow.SearchMode.All;
}
sceneHierarchyWindow.SetSearchFilter ("t:" + type.Name, sceneHierarchyWindow.searchMode, false);
sceneHierarchyWindow.hasSearchFilterFocus = true;
}
}
else
{
SceneModeUtility.s_FocusType = null;
}
}
现在坏消息是,由于它们的保护级别,您既不能直接访问层次结构 window,也不能使用 SetSearchFilter
方法。
或许您可以编写一个类似于层次结构视图的编辑器脚本,您可以在其中完全控制,并可以为所欲为。
从 Unity 2018 开始,SetSearchFilter method.
需要一个额外的布尔参数所以改变这一行
object[] parameters = new object[]{filter, filterMode, false};
到
object[] parameters = new object[]{filter, filterMode, false, false};
这应该解决提到的 TargetParameterCountException
Ugo Hed。