Unity如何将EditorWindow定位到光标位置打开?
解决Unity EditorWindow打开时定位到光标位置的问题
我明白你遇到的问题了——Event.current.mousePosition确实坑人,它的坐标原点是当前鼠标所在的子窗口(比如Inspector、Project)的左上角,不是全局的主编辑器窗口坐标,直接用它设置窗口位置自然会偏移。
下面是靠谱的解决方案,核心是获取系统屏幕全局的鼠标位置,再转换为主编辑器窗口的内部坐标:
完整代码示例
using UnityEditor; using UnityEngine; public class MousePositionedWindow : EditorWindow { [MenuItem("Window/Position at Mouse")] public static void ShowMousePositionedWindow() { var window = GetWindow<MousePositionedWindow>("Mouse-Aligned Window"); // 延迟一帧设置,确保窗口初始化完成 EditorApplication.delayCall += () => PositionWindowToMouse(window); } private static void PositionWindowToMouse(EditorWindow window) { // 1. 获取鼠标在系统屏幕上的全局坐标(原点为屏幕左上角) Vector2 globalMousePos = UnityEditorInternal.InternalEditorUtility.GetMouseScreenPosition(); // 2. 获取Unity主编辑器窗口在系统屏幕上的位置 Rect mainEditorWindowRect = EditorGUIUtility.GetMainWindowPosition(); // 3. 计算鼠标相对于主编辑器窗口内部的坐标 float relativeX = globalMousePos.x - mainEditorWindowRect.x; float relativeY = globalMousePos.y - mainEditorWindowRect.y; // 4. 保留窗口原有宽高,设置左上角到目标位置 Rect newWindowRect = window.position; newWindowRect.x = relativeX; newWindowRect.y = relativeY; window.position = newWindowRect; } private void OnGUI() { GUILayout.Label("窗口已定位到鼠标位置!", EditorStyles.boldLabel); } }
关键细节说明
为什么不用
Event.current.mousePosition?
这个API的坐标空间是当前接收事件的子窗口的局部坐标,比如鼠标停在Inspector窗口时,它返回的是Inspector窗口内的相对位置,不是主编辑器窗口的全局位置,所以直接赋值会导致窗口跑到错误区域。为什么用
EditorApplication.delayCall?
刚创建窗口时,Unity可能还没完成窗口的初始化布局,延迟一帧设置能确保window.position的初始宽高是正确的,避免窗口被意外拉伸或缩小。坐标转换逻辑
InternalEditorUtility.GetMouseScreenPosition()直接返回鼠标在系统屏幕上的绝对位置(原点是屏幕左上角,x向右、y向下);EditorGUIUtility.GetMainWindowPosition()获取主编辑器窗口在系统屏幕上的位置,用全局鼠标坐标减去主窗口的屏幕坐标,得到的就是鼠标在主编辑器窗口内部的相对位置,这正是EditorWindow.position需要的坐标空间。
内容的提问来源于stack exchange,提问作者rbjacob
相关产品推荐
相关产品推荐

