当前位置: 首页 > news >正文

【Unity进阶】Unity发布PC端,隐藏并自定义默认标题栏

开发环境:
Unity2019.3.16f1c1 - 个人版
Visual Studio Community 2019
Windows10 专业版 x64

嘿,各位朋友们!当咱们欢欢喜喜地把项目打包成PC平台的exe窗口程序,准备在电脑上一展游戏风采时,却发现冒出来个Windows风格的白条标题栏,就像一个不速之客闯进了咱们精心布置的游戏派对,和游戏那炫酷风格完全不搭调,这多闹心呐!

别慌,咱有办法把这位“不速之客”请出去,再给它换个符合游戏气质的“酷炫外衣”——隐藏默认标题栏,然后自定义一个超有个性的游戏风格标题栏。这操作就像给游戏窗口变个小魔术,关键就在于调用Windows API函数里的“两大高手”SetWindowLongGetWindowLong,再拉上WS_CAPTION样式标志来帮忙。下面咱就来看看这场“魔术秀”的具体步骤:

创建C#脚本:在Unity项目里新建一个C#脚本,给它起个响亮的名字,就叫WindowStyle。然后别忘了在脚本开头把System.Runtime.InteropServices这个“魔法宝库”的命名空间引进来,这样咱就能召唤出Windows API函数来施展魔法啦。

using System;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;public class WindowsStyle : MonoBehaviour
{}

声明Windows API函数:在脚本里,像念咒语一样,把GetWindowLongSetWindowLong还有GetForegroundWindow这些Windows API函数都声明出来,它们可是这场“魔术”的关键道具。

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hwd, int cmdShow);[DllImport("user32.dll")]
public static extern long GetWindowLong(IntPtr hwd, int nIndex);[DllImport("user32.dll")]
public static extern void SetWindowLong(IntPtr hwd, int nIndex, long dwNewLong);

定义窗口样式常量:接下来,要定义一些能修改窗口样式的“魔法密码”,像GWL_STYLE(它掌控着窗口样式)、WS_CAPTION(专门和标题栏样式打交道)这些,有了它们,咱就能轻松改变窗口的“模样”啦。

/// <summary>
/// 最小化窗口,并激活顶部窗口
/// </summary>
private const int SW_MINIMIZED = 6;/// <summary>
/// 最大化窗口
/// </summary>
private const int SW_MAXIMIZED = 3;/// <summary>
/// 恢复窗口到正常状态(非最小化/最大化)
/// </summary>
private const int SW_RESTORE = 9;/// <summary>
/// 窗口风格
/// </summary>
private const int GWL_STYLE = -16;/// <summary>
/// 标题栏
/// </summary>
private const int WS_CAPTION = 0x00c00000;

编写标题栏处理方法:在脚本里大笔一挥,写个专门的方法。这个方法就像一个神奇的魔法棒,通过调用前面召唤出来的Windows API函数,就能把默认标题栏藏起来。而且,它还能让窗口实现最大化、还原、关闭这些功能,就像给窗口装上了各种“超能力按钮”(不过咱这次就先介绍怎么让方法有这些本事,不搞那些花里胡哨的美术效果啦,就用几个原生Button来假装是标题栏的按钮,凑合凑合先)。

挂载脚本:把写好的这个“魔法脚本”像挂勋章一样,挂到场景里的任意一个对象上,比如主摄像机,让它跟着对象一起在游戏的舞台上发光发热。

打包并测试:最后一步,把挂好脚本的Unity项目打包成exe文件,就像把魔法封印进一个小盒子里。然后打开这个“魔法盒子”,看看隐藏标题栏的效果是不是像咱期待的那样,让游戏窗口变得又酷又炫!

去标题栏前:

去标题栏后:

怎么样,是不是感觉给游戏窗口变个“魔术”也没那么难啦?赶紧动手试试,让你的游戏窗口也来一场华丽的变身吧!

这里是完整代码:

using System;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;public class WindowsStyle : MonoBehaviour
{[DllImport("user32.dll")]public static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hwd, int cmdShow);[DllImport("user32.dll")]public static extern long GetWindowLong(IntPtr hwd, int nIndex);[DllImport("user32.dll")]public static extern void SetWindowLong(IntPtr hwd, int nIndex, long dwNewLong);/// <summary>/// 最小化窗口,并激活顶部窗口/// </summary>private const int SW_MINIMIZED = 6;/// <summary>/// 最大化窗口/// </summary>private const int SW_MAXIMIZED = 3;/// <summary>/// 恢复窗口到正常状态(非最小化/最大化)/// </summary>private const int SW_RESTORE = 9;/// <summary>/// 窗口风格/// </summary>private const int GWL_STYLE = -16;/// <summary>/// 标题栏/// </summary>private const int WS_CAPTION = 0x00c00000;private Button btn_hide_bar;private Button btn_show_bar;private Button btn_minimized;private Button btn_maximized;private Button btn_restore;private Button btn_close;private void Awake(){btn_hide_bar = transform.Find("btn_hide_bar").GetComponent<Button>();btn_show_bar = transform.Find("btn_show_bar").GetComponent<Button>();btn_minimized = transform.Find("btn_minimized").GetComponent<Button>();btn_maximized = transform.Find("btn_maximized").GetComponent<Button>();btn_restore = transform.Find("btn_restore").GetComponent<Button>();btn_close = transform.Find("btn_close").GetComponent<Button>();}private void Start(){btn_hide_bar.onClick.AddListener(() => HideTitleBar());btn_show_bar.onClick.AddListener(() => ShowTitleBar());btn_minimized.onClick.AddListener(() => Minimize());btn_maximized.onClick.AddListener(() => Maximize());btn_restore.onClick.AddListener(() => Restore());btn_close.onClick.AddListener(() => Close());}/// <summary>/// 隐藏标题栏/// </summary>private void HideTitleBar(){var hwd = GetForegroundWindow();var wl = GetWindowLong(hwd, GWL_STYLE);wl &= ~WS_CAPTION;SetWindowLong(hwd, GWL_STYLE, wl);}/// <summary>/// 显示标题栏/// </summary>    private void ShowTitleBar(){var hwd = GetForegroundWindow();var wl = GetWindowLong(hwd, GWL_STYLE);wl |= WS_CAPTION;SetWindowLong(hwd, GWL_STYLE, wl);}/// <summary>/// 最小化/// </summary>private void Minimize(){var hwd = GetForegroundWindow();ShowWindow(hwd, SW_MINIMIZED);}/// <summary>/// 最大化/// </summary>private void Maximize(){var hwd = GetForegroundWindow();ShowWindow(hwd, SW_MAXIMIZED);}/// <summary>/// 还原/// </summary>private void Restore(){var hwd = GetForegroundWindow();ShowWindow(hwd, SW_RESTORE);}/// <summary>/// 关闭/// </summary>    private void Close(){Application.Quit();}
}


文章转载自:

http://RcbYH0CI.rksnk.cn
http://FAz8s5C1.rksnk.cn
http://txBi3Jdi.rksnk.cn
http://vcDgeiTV.rksnk.cn
http://hsWqEpf5.rksnk.cn
http://Kg1x9BpK.rksnk.cn
http://c2VUj7uG.rksnk.cn
http://wuJ8iGMf.rksnk.cn
http://NA38ycRM.rksnk.cn
http://K0gxAENW.rksnk.cn
http://um9vEgdU.rksnk.cn
http://wrNrqjWI.rksnk.cn
http://LFGYcoao.rksnk.cn
http://VqmDH1EL.rksnk.cn
http://evmKNFIH.rksnk.cn
http://Z5meRYST.rksnk.cn
http://DwjGw6IP.rksnk.cn
http://kjIT1oRG.rksnk.cn
http://KaabtJlc.rksnk.cn
http://8MBGuFBY.rksnk.cn
http://CaXHJfMa.rksnk.cn
http://grTufUnE.rksnk.cn
http://E4uKXoRd.rksnk.cn
http://657Gghfs.rksnk.cn
http://AkZytVU2.rksnk.cn
http://W7UkKiag.rksnk.cn
http://qTD7G1Qk.rksnk.cn
http://wyvkkTpc.rksnk.cn
http://4rO2eivf.rksnk.cn
http://fJSIYVcW.rksnk.cn
http://www.dtcms.com/a/382228.html

相关文章:

  • 【Qt】编写Qt自定义Ui控件步骤
  • HTTP 状态码背后的逻辑:从请求到响应的完整流程解析(含完整流程图)
  • 如何规划活动宣传软文的发布节奏?
  • 什么是NTP?
  • n8n工作流平台入门学习指南
  • JVM 四大晋升机制
  • ES——(一)基本概念
  • 算法提升之树形数据结构
  • 使用 OpenTelemetry 从你的日志中获取更多信息
  • Java中IntStream的详细用法及典型案例
  • Python ast模块(Abstract Syntax Trees,抽象语法树)介绍及使用
  • UFO²:微软推出的新一代桌面 Agent 操作系统,深度整合 Windows 与智能自动化
  • 嵌入式ARM SOC开发中文专题分享一:ARM SOC外围资源介绍
  • Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害数值模拟与预警中的应用
  • Python项目全面打包指南:从EXE到绿色软件包
  • C语言---运算符
  • 什么是包装类
  • 59.[前端开发-Vue3]Day01-Vue初体验-MVVM-模板语法-常用指令
  • 1.13 Memory Profiler Package - Unity Objects(unity对象页签)
  • Nginx 请求到达nginx,但是到不了业务服?报错408
  • 若依分库分表,在admin模块可查询子库,在API模块无法查询
  • 幸运盒项目—测试报告
  • 如何告诉AI你的写作任务?
  • Windows11设置Jar包打开方式
  • 尝试MuJS
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘modin’问题
  • SceneSplat
  • Docker笔记上篇
  • 基于 Spring Boot+Vue 的高校竞赛管理平台
  • 闪电科创-边缘计算AI辅导