添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Unity macOS 窗口模式如何隐藏标题栏?

Unity macOS 窗口模式如何隐藏标题栏?

Unity 打包出来的 PC 端应用,如果以窗口方式运行,会有缺省的标题栏。在 Windows 上,可以通过 Win32 系统调用 SetWindowLong 之类来设置窗口的标题栏样式,也可以利用命令行参数 -popupwindow,但这个参数不支持 macOS。

在 macOS 上如何隐藏标题栏呢?Unity 打包出来的 macOS 窗口模式,标题栏尤其死板难看。要是整个 3D 动画/游戏区域充满窗口就好了。今天随手试了下,macOS 上也可以通过动态链接库实现。以下快速记录下相关做法。

Objective-C 动态链接库

首先在 Xcode 里创建一个动态链接库的工程,工程里放下面两段 Objective-C 代码:

TitlebarLib.h

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#if __cplusplus
extern "C" {
#endif
int ShowTitleBar();
int HideTitleBar();
#if __cplusplus
#endif

TitlebarLib.m

#import "TitlebarLib.h"
int ShowTitleBar() {
    NSWindow* win = [NSApplication.sharedApplication mainWindow];
    win.titleVisibility = NSWindowTitleVisible;
    win.titlebarAppearsTransparent = false;
    win.movableByWindowBackground = false;
    win.styleMask &= ~NSWindowStyleMaskFullSizeContentView;
    return 0;
int HideTitleBar() {
    NSWindow* win = [NSApplication.sharedApplication mainWindow];
    win.titleVisibility = NSWindowTitleHidden;
    win.titlebarAppearsTransparent = true;
    win.movableByWindowBackground = true;
    win.styleMask |= NSWindowStyleMaskFullSizeContentView;
    return 0;
}

在 Xcode 里把动态库编译出来,得到文件 libTitlebarLib.dylib

在 Unity 代码里使用动态库

在 Unity 游戏或应用项目里,把上面得到的动态库 libTitlebarLib.dylib 直接(或打包在 bundle 里)丢到 Assets/Plugins 文件夹里。根据 XCode 里的编译或打包选项,可能需要在 Unity 里设置一下这个动态库适用的 CPU 类型。

然后在 Unity 代码里用下面这样的方式导入动态库的两个接口函数:

using System.Runtime.InteropServices;
using UnityEngine;
public class GameManager : MonoBehaviour {
  [DllImport("libTitlebarLib")]
  public extern static int ShowTitleBar();
  [DllImport("libTitlebarLib")]
  public extern static int HideTitleBar();
  public void OnShowTitleBar() {
    int ret = ShowTitleBar();
    Debug.Log($"ShowTitleBar = {ret}");