【问题标题】:Setting a hierarchy filter via script通过脚本设置层次过滤器
【发布时间】:2019-04-17 00:15:52
【问题描述】:

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

我的问题是您是否可以从编辑器脚本中设置该过滤器以及如何设置。我在网上几乎找不到任何关于此的内容。

提前致谢。

【问题讨论】:

  • @d4RK 谢谢,但这不是我想要的。我不想使用过滤器获取对象,而是设置内置统一层次结构窗口的过滤器
  • 啊好的,现在我得到了你想要的东西。但恐怕这是不可能的。但无论如何我会看看这个。

标签: unity3d unity3d-editor


【解决方案1】:

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 方法。

也许您可以编写一个类似于层次结构视图的编辑器脚本,您可以在其中完全控制,并且可以为所欲为。

【讨论】:

  • 非常感谢,我不知道 MonoDevelop 真的可以做到这一点。其余的可以通过一点反思来完成。
  • 我不得不承认我不太适合,使用反射 ;-) 但它真的很棒,你想出来了!我认为您应该接受您的答案,因为我的只是解决方案的第一步,而您的已经是解决方案。
【解决方案2】:

感谢 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。

【讨论】:

  • 您好,hierarchy 变量是什么?我在哪里初始化它?
  • setSearchType.Invoke(hierarchy, parameters); 给我这个错误: TargetParameterCountException: Number of parameters specified does not match the expected number.
【解决方案3】:

从 Unity 2018 开始,SetSearchFilter method 需要一个额外的布尔参数。

所以改变这一行

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

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

这应该解决提到的TargetParameterCountExceptionUgo Hed

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2011-02-05
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多