Unity3d 通过脚本设置层次结构过滤器
在Unity编辑器的“层次”窗口顶部,有一个用于过滤层次的字段: 我的问题是,您是否可以从编辑器脚本设置过滤器,以及如何设置过滤器。我在网上几乎找不到任何与此相关的东西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
提前感谢。多亏了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:指定的参数数量与期望的数量不匹配。