专业网站设计公司地址,wordpress修改404页面模板,接网站建设外包的工作总结,wordpress外网跳转大家好#xff0c;我是阿赵。 最近把公司的游戏发布到各种PC的游戏大厅#xff0c;遇到了挺多奇怪的需求。之前介绍了一些Unity发布PC端控制窗口最大最小化、修改exe信息等问题#xff0c;这次来探讨一下退出游戏的问题。
一、收到奇怪的需求 某游戏大厅要求#xff0… 大家好我是阿赵。 最近把公司的游戏发布到各种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或者falseOnApplicationQuit生命周期还是照样会执行的。 2、执行的顺序是先执行WantsToQuit然后再执行OnApplicationQuit。 3、quitting 方法在WantsToQuit返回false时是不会执行的只有当WantsToQuit返回true游戏真正退出的时候才会执行。但如果是强制关闭进程的情况下quitting也是不会执行的。 知道了这个答案之后就会发现OnApplicationQuit这个方法可能不止你自己调用了有很多插件类的代码都会习惯在OnApplicationQuit这个方法里面做释放资源、关闭线程等清理操作。所以虽然你可能在WantsToQuit里面拦截了游戏关闭但各种插件里面的OnApplicationQuit生命周期还是走到了该释放的东西还是被释放掉了。 就算你想在WantsToQuit之后做些挽救操作也没有用的OnApplicationQuit执行在后面而且是自动执行的所以你很难拦截得到他。 解决办法也是有的不过就需要逐个去修改了。由于WantsToQuit执行得比较前面所以可以定义一个全局变量设置值和WantsToQuit返回结果一样。当各个对象的OnApplicationQuit执行的时候先判断一下这个全局变量如果是true的时候才去执行本身应该执行的代码。