Unity - 如何对场景选择做出反应?如何通过在场景视图中选择其子项来强制选择父项

问题描述

我有以下情况需要回答: 我有一个带孩子的父对象。这些孩子都有独特的网格。每当在 SceneView 中选择这些子项时,都需要选择父项。孩子们永远不应该让他们的检查员暴露(哪怕是几分之一秒)。

我该怎么做?

我提出了两种可能的解决方案,但不是我想要的解决方案。

  • 首先在父对象上使用 [SelectionBase] 属性。这工作完美,但只有一次。第一次选择子项时,将选择父项。然而,当我再次点击孩子时,它仍然被选中。

  • 第二种解决方案是对 Selecten.onSelectionChanged 做出反应。然而,这太慢了。如果孩子被选中,我可以将选择设置为父级,但子级仍会暴露几帧。

是否有即时解决方案可以保证 SelectionBase功能,但每次而不是第一次点击它?

提前致谢! :)

解决方法

我找到了一种方法来做我想做的事。我将 [SelectionBase] 属性与编辑器 OnSceneGui 中的一段代码结合起来。

  • 首先将 [SelectionBase] 属性添加到您的类中

  • 第二步把这段代码添加到它的编辑器类中

      private void OnSceneGUI()
      {
          HandleUtility.AddDefaultControl(0);
    
          //Get the transform of the component with the selection base attribute
          Transform selectionBaseTransform = component.transform;
    
          //Detect mouse events
          if (Event.current.type == EventType.MouseDown)
          {
              //get picked object at mouse position
              GameObject pickedObject = HandleUtility.PickGameObject(Event.current.mousePosition,true);
    
              //If selected null or a non child of the component gameobject
              if (pickedObject == null || !pickedObject.transform.IsChildOf(selectionBaseTransform))
              {
                  //Set selection to the picked object
                  Selection.activeObject = pickedObject;
              }
          }
      }
    

这允许第一个选择来选择组件。从此以后,只有当你选择场景中的非子对象时,选择才会真正改变。