Unity エディターの Hierarchy ウィンドウの上部には、階層をフィルタリングするためのフィールドがあります。
私の質問は、エディター スクリプトからそのフィルターを設定できるかどうか、およびその方法です。これによると、ウェブ上でほとんど何も見つかりません。
前もって感謝します。
Unity エディターの Hierarchy ウィンドウの上部には、階層をフィルタリングするためのフィールドがあります。
私の質問は、エディター スクリプトからそのフィルターを設定できるかどうか、およびその方法です。これによると、ウェブ上でほとんど何も見つかりません。
前もって感謝します。
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
メソッドを使用することもできません。
ヒエラルキー ビューに似たエディタ スクリプトを記述して、完全に制御し、やりたいことが何でもできるようにすることもできます。
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 に同じフィルターを適用するように簡単に拡張できます。