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}");