找回密码
 立即注册
首页 业界区 安全 Godot 4.3 窗口透明区域点击穿透实现教程

Godot 4.3 窗口透明区域点击穿透实现教程

骆贵 2025-7-19 10:23:37
本教程介绍如何在 Godot 4.3 以上项目中,使用纯 GDScript 实现“窗口透明区域点击穿透”效果,适用于桌面宠物、悬浮工具等无边框窗口场景。
适用平台:Windows、macOS
可下载 时钟仙途 查看点击穿透的效果。
1. 基本原理

Godot 4.3 提供了 DisplayServer.window_set_mouse_passthrough() 接口,可以让你指定窗口的哪些区域可以“鼠标穿透”,即点击时事件会传递到下层应用。
该接口需要传入一个多边形顶点数组(PackedVector2Array),用来描述可穿透的区域。
2. 步骤详解

步骤一:设置窗口为无边框和透明

在 project.godot 配置文件中,设置如下参数:
  1. [display]
  2. window/size/borderless = true
  3. window/per_pixel_transparency/allowed = true
复制代码
1.png

2.png

步骤二:用 Path2D 绘制穿透区域


  • 在主场景中添加一个 Path2D 节点。
  • 用编辑器绘制一条闭合曲线,曲线包围的区域即为“可穿透区域”。
  • 你也可以用 Polygon2D 节点,原理类似。
    3.png

步骤三:代码实现穿透逻辑

在主脚本(如 main_page.gd)中添加如下方法:
  1. func _set_window_mouse_passthrough():
  2.     var path_points = $Path2D.curve.get_baked_points()
  3.     var window_size = get_window().size
  4.     var viewport_size = get_window().content_scale_size # 设计分辨率
  5.     var scale = Vector2(float(window_size.x) / viewport_size.x, float(window_size.y) / viewport_size.y)
  6.     var points = []
  7.     for p in path_points:
  8.         # 如果 Path2D 有父节点或偏移,建议用全局坐标
  9.         var global_p = $Path2D.get_global_transform().xform(p)
  10.         points.append(global_p * scale)
  11.     DisplayServer.window_set_mouse_passthrough(points)
复制代码
注意:

  • get_window().content_scale_size 获取的是设计分辨率,get_window().size 是实际窗口像素。
  • 如果 Path2D 有父节点或缩放,建议用 get_global_transform().xform(p) 转为全局坐标。
步骤四:在 _ready() 中调用
  1. func _ready():
  2.     # ... 你的初始化代码 ...
  3.     _set_window_mouse_passthrough()
复制代码
如果窗口的可点击区域会动态变化,可动态生成闭合曲线并重新应用。
5. 参考


  • Godot 官方文档:window_set_mouse_passthrough
出处:http://www.cnblogs.com/tangyikejun/本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册