UniWindowController
macOS 和 Windows 的统一窗口控制器 缩写:UniWinC
README
概述
这是一个用于 Unity 构建的 Windows / macOS 独立应用程序的库。 该库控制自身窗口的透明度、无边框、位置、大小等。 它还允许接受文件和文件夹拖放。
https://twitter.com/i/status/1314440790945361920
演示
您可以在发布页面找到一些示例构建。
安装
如果您使用 UPM,您还可以从 UPM 执行版本升级。
A. 使用 Unity 包管理器 (UPM)
- 从 Unity 编辑器的[窗口]菜单中打开[包管理器]。
- 选择[+],然后选择[从 git URL 添加包...]。
- 输入 https://github.com/kirurobo/UniWindowController.git#upm 并[添加]。
B. 使用 UnityPackage
- 从发布页面下载 .unitypackage 文件。
- 在 Unity 编辑器中导入资产。
在您的 Unity 项目中使用
- 将 Runtime/Prefabs 中的
UniWindowController
预制体添加到您的场景中。 - 选择放置在场景中的
UniWindowController
,查看检查器。
- 适当修复 Player Settings(绿色按钮将一次性更改所有设置)
- 根据您的喜好调整
IsTransparent
等设置
- 如果您想通过鼠标拖动移动窗口,请添加 Runtime/Prefabs 中的
DragMoveCanvas
预制体。
- 这需要 EventSystem 才能工作。如果您的场景中没有,请添加 UI → Event System。
- 为 PC / Mac 独立版本构建
- 启动构建
限制
- 透明度在 Unity 编辑器中不可用。请构建并尝试。
- 它可以实现置顶、移动窗口等功能,但我不建议在运行时关闭游戏视图或更改停靠排列。同时,当焦点转移到游戏视图时,窗口将重新获取。
- 尚未确定对触摸操作的适当支持。
- 在 Windows 上,如果将
TransparentType
从 Alpha 更改为 ColorKey,您将失去美观的半透明效果,但触摸操作将更自然。
- 在 Windows 上,如果将
- 不支持多个窗口。
- 这尚未经过全面测试,可能存在不稳定的行为。
有关已知问题,另请参阅 Issues。
系统要求
- Unity:2019 4.31f1 或更高版本
- 脚本运行时:.NET 4.x 或更高版本
- 操作系统:Windows 10、Windows 11 或 macOS
开发环境为 Unity 2020.4.30f1,Windows 11 / macOS 13.3
附加信息
关于命中测试
当窗口成功变为透明时,看起来就像是一个非矩形窗口。 然而,这只是外观,实际上窗口仍然存在为矩形窗口。 因此,通过直接查看鼠标光标下方,如果是透明的,鼠标操作会传递到下面的窗口(点击穿透),如果是不透明的,鼠标操作会恢复正常。
提供两种类型的命中测试。(您也可以选择禁用自动命中测试并自行控制或不控制。)
名称 | 方法 | 注意 |
---|---|---|
Opacity | 检查透明度 | 与外观匹配且自然,但处理较重 |
Raycast | 检查碰撞体 | 轻量级,但需要碰撞体 |
从性能角度来看,推荐使用 Raycast 方法,但如果忘记添加碰撞体,您将无法触摸屏幕,因此默认为 Opacity。
另外,请注意,触摸操作可能感觉不舒服,因为您无法提前看到手指下方的颜色。 由于我们尚未找到最佳解决方案,很抱歉触摸支持暂时搁置。
关于透明度方法(仅在 Windows 上可选)
支持触摸操作的一种方法是为分层窗口选择单色透明。 如果选择此选项,无法表达半透明效果,性能也会降低,但由于命中测试留给 Windows 处理,触摸操作应该符合您的感觉。
名称 | 描述 | 注意 |
---|---|---|
Alpha | 反映渲染结果的透明度 | 这是标准方法 |
ColorKey | 仅匹配 RGB 的一种颜色是透明的 | 性能较差,但触摸更自然 |
C# 脚本编程
这是可以从 Unity 中的其他脚本操作的内容。 规格尚未确定,可能会发生变化。
UniWindowController.cs
这是主要脚本。 以下属性可以从其他脚本操作。(可能会添加其他属性。)
名称 | 类型 | 描述 |
---|---|---|
isTransparent | bool | 设置/取消透明(非矩形)窗口 |
isTopmost | bool | 始终设置/取消置顶 |
isZoomed | bool | 最大化/取消最大化窗口。还可以获取当前状态 |
isHitTestEnabled | bool | 启用/禁用自动命中测试。如果启用,isClickThrough 将根据鼠标光标位置自动更改。 |
isClickThrough | bool | 设置/取消点击穿透状态。 |
windowPosition | Vector2 | 允许您获取/设置窗口位置。主显示器的左下角为原点,坐标系向上为正,窗口的左下角为坐标系。 |
windowSize | Vector2 | 您可以获取/设置窗口大小。 |
UniWindowMoveHandler.cs
如果将此脚本附加到 UI 元素(将成为 Raycast 目标),您可以通过拖动该 UI 元素来移动窗口。 例如,它假定附加到一个带有"您可以在此处抓取移动"句柄的图像上。
在名为 DragMoveCanvas 的预制体中,我们使用覆盖整个透明屏幕的面板。 通过将 Layer 设置为"Ignore Raycast",即使面板是 Raycast,自动命中测试也会被排除。 这允许在屏幕上任何位置拖动。 但是,其他 UI 操作将优先于拖动。(这是由于 DragMoveCanvas 中较小的 Sort Order。)
源文件夹层次结构
如果您只想使用这个库,可以在 Release 中下载 .unitypackage,不需要克隆这个存储库。 如果您想查看/构建源代码,请参考以下内容。
- UniWinC
- 这是一个 Unity 项目。
- 它已经包含了构建好的 DLL 和 bundle。
- 该项目的内容在发布中作为 .unitypackage 提供。
- VisualStudio
- 有一个用于生成 Windows x86 和 x64 的 LibUniWinC.dll 的解决方案。
- 使用 Release 构建将覆盖 Unity 文件夹下的 DLL。
- 还包括一个用于测试的 Windows Forms 应用程序项目。
- Xcode
- 有一个用于生成 macOS 的 LibUniWinC.bundle 的项目。
- 构建它将覆盖 Unity 文件夹下的 .bundle。
致谢
- macOS 代码基于かりばぁ的 Unity + Mac + Swift で透過最前面ウィンドウを作る。
- 我使用了 hecomi 的 Unity で .unitypackage で配布していたアセットを Package Manager 対応してみた 来在 GitHub Actions 中生成 UPM 分支。
在此向他们表示感谢。