在 Unity8 年后,我的最新项目中最难的部分,并不是 3D — 而是如何让一个透明、始终在顶层、可拖拽的 Unity 窗口在 Windows 上稳定地工作。
项目概述:
一个 3D 舒适房间小工具,它会坐在你的 Windows 桌面上。一个 avatar 在透明始终在顶层的 Unity 窗口中读书、工作、睡觉,而你可以在其他应用程序中工作。闲置的货币(Amber)会被passively积累,解锁14个房间主题+家具定制。
Unity 技术问题:
Unity 本身并不支持透明始终在顶层的窗口。切换窗口边框、调整透明度等,每种方法都可能会打破输入、打破DWM合成、或打破多显示器焦点。
最终工作的方法:
- 使用 SetWindowLong (GWL_STYLE / GWL_EXSTYLE) 的自定义 Win32 钩子 — 去掉窗口chrome,设置 WS_EX_LAYERED + WS_EX_TOPMOST
- 使用 DwmExtendFrameIntoClientArea + 清空颜色(0,0,0,0)来实现真实的像素级透明度
- 自定义拖拽时的击中测试(无标题栏可抓取)
- 显示器 DPI 意识 — Unity 的默认设置会在多 DPI 设备上引起微妙的布局问题
耗时最多的边缘案例:
- 多显示器:始终在顶层标志在拖拽时会在显示器边界处闪烁
- HDR显示器:透明像素会看起来微妙地发白
- 全屏游戏:需要检测并优雅地暂停
CPU 在空闲时会占用 1-3%
游戏背景:
Lofi Cozy Room — 由 Unity 完全制作。免费试玩版将于 6 月 3 日在 Steam Next Fest 上发布,完整版将于 7 月 14 日发布。
Steam:https://store.steampowered.com/app/4621450/Lofi_Cozy_Room/
如果您正在开发类似的小工具或覆盖项目,欢迎深入讨论 DWM 合成技巧或多显示器处理。也欢迎与我分享您在类似项目中遇到的透明 Unity 覆盖的边缘案例。
评论 (0)