通过脚本设置层次结构过滤器

时间:2015-04-11 08:53:09

标签: unity3d unity3d-editor

在Unity Editor的Hierarchy窗口的顶部,有一个用于过滤层次结构的字段:

unity hierarchy window: filter

我的问题是你是否可以从编辑器脚本中设置过滤器以及如何设置。我几乎无法在网上找到任何东西。

提前致谢。

3 个答案:

答案 0 :(得分:2)

感谢d4RK我发现了如何使用Reflection:

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。

答案 1 :(得分:2)

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;
    }
}

现在坏消息,由于它们的保护级别,您既不能直接访问层次结构窗口,也不能使用SetSearchFilter方法。

也许你可以编写一个编辑器脚本,类似于层次结构视图,你可以完全控制它,并且可以做你想做的任何事情。

答案 2 :(得分:0)

从Unity 2018开始,SetSearchFilter method还需要一个布尔值。

因此更改此行

object[] parameters = new object[]{filter, filterMode, false};

object[] parameters = new object[]{filter, filterMode, false, false};

这应该可以解决提到的TargetParameterCountException Ugo Hed