问题描述
我有以下情况需要回答: 我有一个带孩子的父对象。这些孩子都有独特的网格。每当在 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; } } }
这允许第一个选择来选择组件。从此以后,只有当你选择场景中的非子对象时,选择才会真正改变。