我有以下情况,我需要一个答案:我有一个父对象和子对象。这些孩子都有独特的网格。当这些子元素在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; } } }
这允许第一个选择选择组件。从那时起,只有当你选择场景中的非子对象时,选择才会发生变化。