如何在Unity3D';从自定义编辑器窗口查看场景

如何在Unity3D';从自定义编辑器窗口查看场景,unity3d,unity3d-editor,Unity3d,Unity3d Editor,为了加快场景设置,我开发了一系列自定义编辑器。我想在其中一个编辑器上添加一个新功能,该功能可以检测在SceneView中单击对象的时间(从而防止选择更改,因为此编辑器的目的是在它们之间链接对象) 我通过在SceneView上防止鼠标位置的默认选择和光线投射来实现这一点。我唯一的问题是,当对象没有任何碰撞器时,它将无法工作(在这些对象上添加碰撞器是不可能的)。然而,编辑器能够在没有碰撞器的情况下检测对象上的点击 我的google fu带来的所有东西都是“添加对撞机”方法(不可能)或“自己做光线投射

为了加快场景设置,我开发了一系列自定义编辑器。我想在其中一个编辑器上添加一个新功能,该功能可以检测在SceneView中单击对象的时间(从而防止选择更改,因为此编辑器的目的是在它们之间链接对象)

我通过在SceneView上防止鼠标位置的默认选择和光线投射来实现这一点。我唯一的问题是,当对象没有任何碰撞器时,它将无法工作(在这些对象上添加碰撞器是不可能的)。然而,编辑器能够在没有碰撞器的情况下检测对象上的点击

我的google fu带来的所有东西都是“添加对撞机”方法(不可能)或“自己做光线投射”(对我来说有点过火)


请注意,我不是在寻找解决方法,我已经找到了一堆解决方法(所有场景对象上的Bounds.IntersectRay、在SelectionChange上还原选择、使用selection.gameObjects等)。出于好奇,我真的在寻找理想的解决方案(即使没有文档),以便从自定义编辑器的角度更好地理解什么是可能的,什么是不可能的

问得好。我不清楚你为什么不能用OnSelectionChange来做这个?还有,出于好奇,您如何“防止在SceneView上的鼠标位置出现默认选择和光线投射”?我最终使用的解决方案实际上用于SelectionChange。只是当我开始实现这一点的时候,我的想法是建立在一个特定的想法上,建立在我如何在编辑器之外做这类事情的基础上(raycast in OnUpdate,在特定的层上过滤)。只有当我意识到没有collider是不可能做到这一点的时候(但编辑还是设法做到了),我才对它感到好奇。激发我提出这个问题的原因其实更多的是对统一性有一个更好更深入的理解,而不是建立一个实际的解决方案。基本上,您可以在OnSceneGui中获取当前事件,如果您的条件已满,则可以使用event.current.Use()来使用该事件并阻止其转发。正如链接所述,您还必须使用HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(),FocusType.Passive));当EventType为Layout时。在我的例子中,如果切换某个按钮,它将检测到对某个特定对象的单击,并按单击顺序链接它们