You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Godot游戏窗口非交互式且仅显示UI?

Godot实现非交互式透明UI窗口方案

针对你需要透明UI窗口且允许用户操作外部元素的需求,以下是分平台的可行方案:

一、Windows平台直接解决方案

利用Windows API修改窗口属性,让窗口忽略鼠标输入且不获取焦点:

extends Node

func _ready():
    if OS.get_name() == "Windows":
        var hwnd = OS.get_native_handle()
        # 获取当前窗口扩展样式并追加所需属性
        var ex_style = OS.windows_get_window_long(hwnd, OS.WINDOW_LONG_EX_STYLE)
        ex_style |= OS.WS_EX_LAYERED | OS.WS_EX_TRANSPARENT | OS.WS_EX_NOACTIVATE
        OS.windows_set_window_long(hwnd, OS.WINDOW_LONG_EX_STYLE, ex_style)
        # 保持窗口置顶但不激活
        OS.windows_set_window_pos(hwnd, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE | OS.SWP_NOACTIVATE)
  • WS_EX_TRANSPARENT:让窗口完全忽略鼠标输入,点击会穿透到下层窗口
  • WS_EX_NOACTIVATE:阻止窗口获取焦点,避免干扰外部操作
  • HWND_TOPMOST:确保UI始终显示在其他窗口上方(按需启用)

二、macOS平台解决方案

通过Objective-C桥接修改NSWindow属性:

extends Node

func _ready():
    if OS.get_name() == "macOS":
        var ns_window = OS.get_native_handle()
        var objc_window = ObjCClass.new("NSWindow")
        # 设置窗口忽略鼠标事件
        objc_window.performSelector("setIgnoresMouseEvents:", [true], ns_window)
        # 设置窗口层级为状态栏层级(保持顶层)
        var status_bar_level = ObjCClass.new("NSWindow").performSelector("statusBarWindowLevel")
        objc_window.performSelector("setLevel:", [int(status_bar_level)], ns_window)

三、跨平台辅助优化

配合Godot内部设置增强效果:

  1. 开启透明背景:在项目设置Display > Window > Transparent Background设为true
  2. 禁用内部输入处理:重写输入回调阻止Godot处理任何输入
func _input(event):
    pass

func _unhandled_input(event):
    pass

注意事项

  • 系统API调用为平台专属,需根据目标平台编写分支代码
  • 测试时需确认UI元素渲染正常,透明区域无残留遮挡
  • 若需要窗口可拖动,可单独添加拖动逻辑(如监听特定UI区域的鼠标事件)

内容的提问来源于stack exchange,提问作者RevoidTeam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:10:06