Unity控制程序退出

这篇具有很好参考价值的文章主要介绍了Unity控制程序退出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  大家好,我是阿赵。
  最近把公司的游戏发布到各种PC的游戏大厅,遇到了挺多奇怪的需求。之前介绍了一些Unity发布PC端控制窗口最大最小化、修改exe信息等问题,这次来探讨一下退出游戏的问题。

一、收到奇怪的需求

  某游戏大厅要求,运行游戏后,如果玩家没有创建角色进入游戏,不准玩家退出游戏,点击exe窗口的关闭按钮,也不能关游戏。
  先不讨论这个需求是否道德的问题。单纯从技术的角度,看看这个需求是怎样实现的。

二、分析问题

  由于游戏本身是通过Unity引擎来做的,所以只能通过Unity提供的API来解决这个问题。
关于游戏退出的API,大概有这么几个:
1、Application.wantsToQuit
2、Application.quitting
3、MonoBehaviour.OnApplicationQuit
4、Application.Quit
  先说Application.Quit,这是主动调用的方法,调用了之后,程序就退出了,相当于点exe窗口的叉按钮关闭。
  然后是MonoBehaviour.OnApplicationQuit,这个是MonoBehaviour的一个生命周期,会在游戏退出的时候自动调用。
  然后是Application.wantsToQuit,这是一个注册回调,在程序想退出的时候,会调用这个注册的方法,如果在方法里面返回true,则程序会正常退出,如果在方法里面返回false,则程序并不会退出。
  最后是Application.quitting,这个也是一个注册回调方法,在程序真正退出的时候,会调用这个方法。
如果写在代码里面,大概是这样的:

  void OnApplicationQuit()
    {
        Debug.Log("OnApplicationQuit");
    }

    static bool WantsToQuit()
    {
        Debug.Log("The game wants to quit");
        if(canQuit == false)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    static void Quiting()
    {
        Debug.Log("The game is quiting");
    }
    [RuntimeInitializeOnLoadMethod]
    static void RunOnStart()
    {
        Application.wantsToQuit += WantsToQuit;
        Application.quitting += Quiting;
}

  所以,针对一开始的需求,似乎答案很简单,就是在WantsToQuit方法里面,通过一定的条件来返回false,让程序不要退出就行了。Application.Quit方法调用之后,其实也是走到WantsToQuit方法。如果在WantsToQuit写死了返回false,那么调用Application.Quit也不会退出游戏了,所以一定要给WantsToQuit里面加条件返回,在某些情况下还是可以控制返回true的。

三、出现新的问题

  刚才说了三个方法,如果我们只处理WantsToQuit方法,有时候会发现在WantsToQuit里面return了false之后,游戏是没有退出,但有些功能异常了。
  这里也不啰嗦,直接说答案吧,造成这种问题的原因是:
1、不论WantsToQuit里面返回true或者false,OnApplicationQuit生命周期还是照样会执行的。
2、执行的顺序是,先执行WantsToQuit,然后再执行OnApplicationQuit。
3、quitting 方法在WantsToQuit返回false时是不会执行的,只有当WantsToQuit返回true,游戏真正退出的时候,才会执行。但如果是强制关闭进程的情况下,quitting也是不会执行的。
  知道了这个答案之后,就会发现,OnApplicationQuit这个方法可能不止你自己调用了,有很多插件类的代码,都会习惯在OnApplicationQuit这个方法里面做释放资源、关闭线程等清理操作。所以虽然你可能在WantsToQuit里面拦截了游戏关闭,但各种插件里面的OnApplicationQuit生命周期还是走到了,该释放的东西还是被释放掉了。
  就算你想在WantsToQuit之后做些挽救操作也没有用的,OnApplicationQuit执行在后面,而且是自动执行的,所以你很难拦截得到他。
  解决办法也是有的,不过就需要逐个去修改了。由于WantsToQuit执行得比较前面,所以可以定义一个全局变量,设置值和WantsToQuit返回结果一样。当各个对象的OnApplicationQuit执行的时候,先判断一下这个全局变量,如果是true的时候,才去执行本身应该执行的代码。文章来源地址https://www.toymoban.com/news/detail-703475.html

到了这里,关于Unity控制程序退出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序做一个圆形图片旋转可以控制开始和结束-音乐播放器的图片旋转功能

    1.在 WXML 文件中添加一个 标签,并设置图片的 src 和样式,并为其绑定一个 animation 用来控制旋转动画。 2.在 WXSS 文件中添加样式,将图片设置为圆形并居中显示。 3.在 JS 文件中定义旋转动画对象和控制方法。 4.在 WXML 文件中添加按钮来触发开始和结束旋转动画。 在以上步骤

    2024年02月16日
    浏览(33)
  • 基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

    作品哔哩哔哩视频:https://www.bilibili.com/video/BV1Yb4y1a7AQ#reply5536921990 资料链接: 蓝牙彩灯v1.01资料链接: CSDN: https://download.csdn.net/download/mbs520/25149435 百度网盘: https://pan.baidu.com/s/14Vout7Q2P6JBDZCCd8Gm6w 提取码:b7it 蓝牙彩灯v1.03资料链接: https://download.csdn.net/download/mbs520/25150035 取

    2024年02月09日
    浏览(33)
  • Qt创建控制台程序选择构建套件问题“No suitable kits found”

    QT 选择构建套件时出现问题: “No suitable kits found” = 没有找到合适的kits套件,在安装Qt Creator时没有安装MinGW,所以只需要进行安装即可。 3.1 选择安装目录下的“MaintenanceTool.exe”,双击计入组件安装界面。 3.2 点击“下一步” 3.3 选择“添加或移除组件”: 3.4 根据自己安装

    2024年02月11日
    浏览(31)
  • IDEA中创建web项目(配置tomcat,tomcat启动报程序包javax.servlet.http不存在,tomcat控制台乱码问题)

    在浏览器地址栏输入: http://localhost:8080/webidea/ 单击工具栏按钮 1、 点击Help = Edit custom VM Options,在最后面添加 “-Dfile.encoding=UTF-8” 2、点击Run菜单的 Edit Configurations,在tomcat配置中的 VM option中添加 “-Dfile.encoding=UTF-8” 3、在第二步的Startup/Connection页签的Run和Debug添加一个key为

    2024年02月21日
    浏览(94)
  • Golang TCP/IP服务器/客户端应用程序,设计一个简单可靠帧传送通信协议。(并且正确处理基于流式控制协议,带来的应用层沾帧[沾包]问题)

    在 Golang 语言标准库之中提供了,对于TCP/IP链接、侦听器的高级封装支持,这易于上层开发人员轻松基于这些BCL(基础类库)实现期望的功能。 TCP/IP链接(客户端) net.Conn 接口 TCP/IP侦听器(服务器) net.Listener Golang 提供了易用的写入数据到远程(对端)实现,而不比像 C/C

    2024年01月24日
    浏览(45)
  • 【控制】滑模控制,小例子,有程序有结果图

    目录 滑模控制的一点笔记和看法 1 【控制】滑动模型控制(Sliding Mode Control) 2 【控制】滑模控制,小例子,有程序有结果图 3 【控制】滑模控制,滑模面的选择 假设存在一个被控系统如下 x ˙ 1 = x 2 x ˙ 2 = x 3 x ˙ 3 = x 1 + x 2 x 3 + u (1) begin{aligned} dot{x}_1 = x_2 \\\\ dot{x}_2 = x_3

    2023年04月20日
    浏览(23)
  • Python程序设计基础:程序流程控制(一)

    程序流程的基本结构主要有三种,顺序结构、选择结构和循环结构,在顺序结构中是按照语句的位置一句一句顺序执行,每条语句有且只会执行一次,而在选择结构和循环结构中,通常是需要根据条件表达式的值来确定下一步的执行流程。 条件表达中一般使用两种运算符:关

    2024年02月11日
    浏览(35)
  • Java的程序逻辑控制

    导读: 本篇是JAVA基础系列,主要总结了程序的逻辑结构,也就是顺序结构、分支结构和循环结构。这三种结构在日常代码编写过程中是离不开的。而一个程序猿是否是老手,从逻辑结构的运用上就可以直观的看出来。 Java的基本结构就是顺序结构,除非特别指明,否则就安装

    2024年03月23日
    浏览(34)
  • #微信小程序(按键控制)

    1.IDE:微信开发者工具 2.实验:微信小程序设计两个按钮,对onenet平台数据流(旧版)来进行http post上传,下位机再http get得到控制信息 3.记录 (1)bind-tap(绑定函数) (2)关键代码 (3)函数绑定 4.代码 index.js

    2024年03月10日
    浏览(26)
  • 微信小程序 主包与分包的控制小程序大小

    为了让用户有更好的体验,小程序于是限制包的大小为2M,在开发中,我们经常会出现内容过大的问题,于是要进行包的大小控制,分包就是一个很好的方式,小程序分包 的好处,分包及将代码进新分块,有点微服务的概念, 为了让用户有更好的体验,小程序于是限制包的大

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包