如何仅在SetSearchFilter中过滤包含特定组件的对象?

时间:2018-10-29 17:24:02

标签: c# unity3d

在CustomEditor脚本中,我为附着有特定组件(在本例中为Mesh Renderer)的黄色对象着色。

System.Type type = SceneModeUtility.SearchBar(typeof(BoxCollider), typeof(MeshRenderer));
SceneModeUtility.SearchForType(type);

在EditorWindow脚本中,我正在使用SetSearchFilter:

private void OnGUI()
    {
        CustomHierarchy.gameObjectFontColor = EditorGUILayout.ColorField("Original Font Color", CustomHierarchy.gameObjectFontColor);
        CustomHierarchy.prefabOrgFontColor = EditorGUILayout.ColorField("Prefab Original Font Color", CustomHierarchy.prefabOrgFontColor);
        CustomHierarchy.prefabModFontColor = EditorGUILayout.ColorField("Prefab Modified Font Color", CustomHierarchy.prefabModFontColor);
        CustomHierarchy.inActiveColor = EditorGUILayout.ColorField("Inactive Color", CustomHierarchy.inActiveColor);
        CustomHierarchy.meshRendererColor = EditorGUILayout.ColorField("Mesh Renderer Color", CustomHierarchy.meshRendererColor);

        multipleComponents = GUI.Toggle(new Rect(30, 160, 120, 30), multipleComponents, "Multiple components");
        if(multipleComponents == true)
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        multipleComponentsString = GUI.TextField(new Rect(30, 180, 120, 30), multipleComponentsString, 25);

        GUI.enabled = true;
        filterText = GUI.TextField(new Rect(30, 230, 120, 30), filterText, 25);

        System.Type type = SceneModeUtility.SearchBar(typeof(BoxCollider), typeof(MeshRenderer));
        SceneModeUtility.SearchForType(type);
    }

在这里,我输入filterText TextField,在这种情况下,它是按名称过滤的。

但是我想按名称过滤,但也只过滤连接到它们的对象的Mesh Renderer组件。不是FILTERMODE_TYPE,而是已附加了Mesh Renderer组件的对象。因此,过滤器模式应为Name(1),而且还应同时使用网格渲染器过滤对象。

我试图在OnGUI中添加两行: 两行是:

.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr; // creates two responsive columns
  grid-gap: 10px; // puts 10px between each node in the grid
}

但是随后在EditorWindow中,我看到了3个图标,均为BoxCollider MeshRenderer。 如果单击BoxCollider,它将使用boxcollider过滤所有对象,但是当我在层次结构搜索栏中键入名称时,它将过滤具有名称和box collider的所有对象,但是当我再次单击editorwindow时,它将其更改为所有图标。网格渲染器也是如此。

我不能同时选择boxcollider和meshrenderer,我只能选择其中之一。

EditorWindow的屏幕截图:

EditorWindow

def "GetNumberOfMaxHeightCandles"() {
    given: "A BirthdayCandles object"
    def candles = new BirthdayCandles(testInput)

    when: "I call the max number height method"
    def actual = candles.getNumberOfMaxHeightCandles()

    then: "I should get the frequency count of the max number in the integer array"
    actual == expectedResult

    where:
    testInput                  |     expectedResult
    [1,1,1,3,3,3,3]  as int [] |     4
    [1,1,1,3,3,3,4]  as int [] |     1
}

1 个答案:

答案 0 :(得分:0)

我注意到您正在使用反射来执行此操作。不用了有一个名为SceneModeUtility的未公开说明的API,可用于在编辑器中搜索对象。请参见此enter image description here的非官方API。使用Chrome浏览器可以轻松将其翻译成英文。

如果您只想在编辑器的SearchField中搜索和过滤带有组件(MeshRenderer)的对象,则:

SceneModeUtility.SearchForType(typeof(MeshRenderer));

要使用GameObject上的多个组件过滤搜索并返回结果:

System.Type type = SceneModeUtility.SearchBar(typeof(MeshRenderer), typeof(Rigidbody));

您可以根据需要将任意数量的组件传递给SearchBar函数。