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

Unity3d 通过脚本设置层次结构过滤器,unity3d,unity3d-editor,Unity3d,Unity3d Editor,在Unity编辑器的“层次”窗口顶部,有一个用于过滤层次的字段: 我的问题是,您是否可以从编辑器脚本设置过滤器,以及如何设置过滤器。我在网上几乎找不到任何与此相关的东西 提前感谢。多亏了d4RK,我找到了使用反射的方法: public const int FILTERMODE_ALL = 0; public const int FILTERMODE_NAME = 1; public const int FILTERMODE_TYPE = 2; public static void SetSe

在Unity编辑器的“层次”窗口顶部,有一个用于过滤层次的字段:

我的问题是,您是否可以从编辑器脚本设置过滤器,以及如何设置过滤器。我在网上几乎找不到任何与此相关的东西


提前感谢。

多亏了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应用相同的过滤器。

UnityEdit.SceneMultility.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;
    }
}
publicstaticvoidsearchfortype(类型)
{
Object[]数组=Resources.FindObjectsOfTypeAll(typeof(SceneHierarchyWindow));

SCENEHERARCHYWINDOW SCENEHERARCHYWINDOW=(array.Length自Unity 2018起,需要一个额外的布尔参数

所以改变这条线

object[]parameters=新对象[]{filter,filterMode,false};

object[]参数=新对象[]{filter,filterMode,false,false};


这应该可以解决前面提到的
TargetParameterCountException

看看这个:@d4RK谢谢,但这不是我想要的。我不想使用过滤器获取对象,但要设置inbuild unity hierarchy Window的过滤器啊,好的,现在我得到了你想要的东西。但是我恐怕,这不可能。但是需要一段时间不管怎么说,看看这个。非常感谢,我不知道MonoDevelop真的能做到。剩下的可以通过一点思考来完成。我必须承认,我不是那么适合与思考一起工作;-)但是,你找到了答案,这真是太棒了!我认为你应该接受你的答案,因为我的答案只是解决方案的第一步,而你的答案已经是解决方案。您好,层次结构变量是什么?我在哪里初始化它?
setSearchType.Invoke(层次结构,参数);
给我这个错误:TargetParameterCountException:指定的参数数量与期望的数量不匹配。