2

Unity エディターの Hierarchy ウィンドウの上部には、階層をフィルタリングするためのフィールドがあります。

ユニティ階層ウィンドウ: フィルター

私の質問は、エディター スクリプトからそのフィルターを設定できるかどうか、およびその方法です。これによると、ウェブ上でほとんど何も見つかりません。

前もって感謝します。

4

3 に答える 3

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メソッドを使用することもできません。

ヒエラルキー ビューに似たエディタ スクリプトを記述して、完全に制御し、やりたいことが何でもできるようにすることもできます。

于 2015-04-11T17:17:57.190 に答える
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 に同じフィルターを適用するように簡単に拡張できます。

于 2015-04-11T15:07:43.197 に答える