游戏优化系列三:Unity游戏的黑屏问题解决方法

游戏优化系列三:Unity游戏的黑屏问题解决方法,第1张

大家好,我叫Jack冯;

本人20年硕士毕业于广东工业大学,于2020年6月加入37手游安卓团队;目前主要负责海外游戏发行安卓相关开发。

一、背景

二、分析及解决

1、生命周期分析

(1)黑屏情况

(2)解决方法

(3)正常显示

2、涉及方法解析

(1)onWindowFocusChanged (boolean hasFocus)

(2)Android生命周期

(3)对比Android原生工程

(4)unity脚本生命周期

(5)分析脚本生命周期

三、结论

在Unity游戏工程中,经常遇到这样的问题:打开登录d框时,点击Home键先处理其他事宜再返回,发现屏幕黑屏;或者打开了其他接受输入焦点的对话框或d出窗口,点击返回键时发生屏幕黑屏,需要触摸屏幕(获得焦点)才能正常显示。

具体情形见下图:

其中,生命周期顺序如下:

- 打开页面:onCreate--onStart--onResume--onWindowFocusChanged:true

- 点击登录:--onWindowFocusChanged:false

- 点击Home返回:--onPause

- 重新进入:--onRestart--onStart--onNewIntent--onResume--onWindowFocusChanged:false(此时app页面出现黑屏)

在游戏主活动UnityPlayerActivity中,重写onStart()方法,添加获取焦点的方法,可避免黑屏。

其中,生命周期顺序如下:

- 打开页面:onCreate--onStart--onWindowFocusChanged:true--onResume--onWindowFocusChanged:true

- 点击登录:--onWindowFocusChanged:false

- 点击Home返回:--onPause

- 重新进入:--onRestart--onStart--onWindowFocusChanged:ture--onNewIntent--onResume(此时app页面正常显示)

由上可见,二者生命周期的异同在于,是否在调用onStart后调用一次onWindowFocusChanged:true,来获取当前窗口的焦点,实现正常交互。

当activity的当前窗口获得或失去焦点时调用,hasFocus == true表示当前窗口获得焦点,false则表示失去焦点。用法:

- eg:打开页面,当前activity处于活动栈最上层的活动,获得焦点--onWindowFocusChanged:ture;

- 点击登录,d框覆盖在原activity的上层,原activity失去焦点 --onWindowFocusChanged:false;(不仅限d框,还可以是其他获取焦点的页面)

- 此后点击Home键、再返回app,原activity仍然是失去焦点的状态(如果没有手动重新获取焦点),当前页面显示黑屏。

- onCreate (Bundle savedInstanceState):活动创建时调用一次,用于初始化当前活动数据和绑定页面的组件等。参数Bundle:如果活动在关闭后重新初始化,此参数则包含其最近一次调用 onSaveInstanceState(Bundle)存储的数据。

- onStart ():在活动创建方法onCreate(Bundle)或重新启动方法onRestart()之后调用,开始绘制视图、动画等,呈现给用户,其后一般调用onResume()。(可视化状态)

- onResume ():在onRestoreInstanceState()、onRestart()或onPause()之后调用,当前活动位于活动栈的顶部,即将开始与用户进行交互、准备好接收输入事件。(还不能响应输入事件)

- onPause ():活动仍在屏幕上可见,但用户不再与其交互时进行调用,eg:d框等页面覆盖了当前活动时。

- onStop ():当活动在屏幕上不可见时调用,eg:点击home键返回桌面

- onRestart ():在 onStop ()方法后,重新打开原activity时调用,其后一般调用onStart ()和onResume ()

- onDestroy ():在销毁活动之前执行任何最后的清理时调用。一般是活动即将结束(调用 finish()),或系统暂时销毁了此活动实例以节省空间

图为原生工程的AndroidDemo。对比UnityDemo,生命周期方法执行虽一致、焦点丢失情况则不相同。

为了进一步对比,下面引入unity脚本的常见生命周期方法。

unity脚本的常见生命周期方法如下:

-- Awake:始终在任何 Start 函数之前并在实例化组件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)

-- OnEnable:(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。

-- OnLevelWasLoaded:场景全部加载完成后

-- Start:仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。

-- FixedUpdate:调用 FixedUpdate 的频度常常超过 Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。

-- Update:每帧调用一次 Update。这是用于帧更新的主要函数。

-- LateUpdate:每帧调用一次 LateUpdate__(在 Update__ 完成后)。

-- OnGUI:每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。

-- OnApplicationPause:一帧最后时调用,调用后会再触发一帧以刷新图像和切换暂停状态

-- OnApplicationQuit:在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。

-- OnDisable:行为被禁用或处于非活动状态时,调用此函数。

-- OnDestroy:对象存在的最后一帧完成所有帧更新之后,调用此函数(可能应 ObjectDestroy 要求或在场景关闭时销毁该对象)。

这里将生命周期方法在UnityDemo中打印出来,主要对比黑屏情况下的生命周期情况。

具体日志如下:

综合分析,从桌面返回游戏App时,由于unity丢失焦点(I/Unity: UnityPlayerActivity OnApplicationFocus:False ),脚本没有执行,即无法渲染游戏画面对象,致使黑屏。

如果根据第二点添加获取焦点方法后,由下图可以看到继续执行的unity脚本生命周期方法,先获取到焦点、中止pause状态并绘制页面进行正常显示。即工程重新获取焦点后才会绘制图像。

《桃源深处有人家》是由游戏开发公司FrostweepGames开发的,使用的是Unity游戏引擎。Unity是当前流行的游戏引擎之一,支持跨平台开发,并具有高效的工作流程、强大的渲染能力、灵活的物理系统、易用的资源管理和可视化开发等优点,在游戏开发中得到广泛应用。该游戏的开发公司FrostweepGames成立于2012年,总部位于俄罗斯,专注于移动平台和PC平台的游戏开发。他们的游戏设计和开发实力不断提升,在业界不断获得好评,成为值得关注的小型游戏开发公司之一。该游戏采用的是俯视角度,玩家需要在游戏中探索和解谜,有着独特的故事情节和美术风格。

你这样学不对。

我给你说说一般的路线,再给你说为啥以Python做Unity开发不好。

先学Unity的场景编辑器可视化的部分(比如地形和基本物理设置),这部分不涉及太多编程。在学动画调节部分。慢慢的引入编程控制。然后要使用联网游戏,学习网络功能。最后学习shader编程。第一趟学习过程的迭代(以上所有环节),以网上的系列教程或书籍教程为主。然后第二遍,在重新认识场景编辑器,以官方参考手册为主,选择几个常用的插件,这一次应该有实践项目。因为Unity本身也是巨大的体系,所谓Unity专家也只是对某一个方面特别在行,你要有着重点和切入点,这以你的游戏类型和风格为标准(你是做2D/3D,你是重视觉呈现还是玩法,有没有联网功能等)

Unity的脚本运行环境是Mono,是一个开源的NET框架,你知道NET的话就应该知道它是和编程语言无关的(都会编译成 CLI 汇编)。Mono绑定了多个语言,官方的是C#,一个第三方开发者绑定了Python也就是Boo,而Unity公司在这个Boo之上绑定了JavaScript也就是UnityScript,但是Boo(基于Mono CLR实现)并不是那个真正的Python(基于C语言实现),它们的运行时完全不同。而且Boo和UnityScript的编译后的 CLI 汇编效率要比 C# 的低。Unity 官方也在一步步的降低对Boo和UnityScript的支持。

但是学Python和做Unity游戏有关系吗?

有,但不是用在Unity本身的开发上,可以用Python-WSGI 编写游戏服务端,并搭建在云服务器上。当然替代的技术有 PHP、Java 等

自学U3d并不容易,一般参加培训学习的话基本都四个月。unity3d培训课程主要分六大阶段,内容涵盖AR综合项目的讲解、C#编程语言、Unity引擎、项目架构与项目管理、VR综合项目及图形学、面试阶段。自学需要更久,且没有项目经验很难找工作。

行业应用:

ATM领域应用(汽车、运输、制造)

工业VR/AR的应用场景就是构建在数字世界与物理世界融合的基础之上,作为衔接虚拟产品和真实产品实物之间的桥梁,VR和AR内容为Unity驱动。

全世界所有VR和AR内容中60%均为Unity驱动。Unity实时渲染技术可以被应用到汽车的设计、制造人员培训、制造流水线的实际 *** 作、无人驾驶模拟训练、市场推广展示等各个环节。

Unity最新的实时光线追踪技术可以创造出更加逼真的可交互虚拟环境,让参与者身临其境,感受虚拟现实的真实体验。Unity针对ATM领域的工业解决方案包括: INTERACT工业VR/AR场景开发工具、Prespective数字孪生软件等等。

全球顶级的50家AEC公司和10家领先汽车品牌中,已有超过一半的公司正在使用Unity的技术。戴姆勒集团子公司Protics已经使用Unity研发了专门的混合现实流水线;工业巨头ABB使用Unity打造一个增强型实地流程辅助系统;沃尔沃和Varjo使用VR技术创造安全驾驶功能。

宝马BMW使用Unity实现实时光线追踪汽车设计可视化;雷克萨斯Lexus使用Unity制作实时渲染市场推广展示;宜家IKEA Place,用户购买家具之前查看实际效果等。

百度百科-Unity

Unity按钮热更新没反应原因如下:

1脚本中的代码没有正确更新:如果您使用的是按钮热更新插件,可能需要在脚本中添加一些额外的代码来完成更新过程。如果您没有正确更新脚本代码,按钮可能会失效。请确保您更新了所有必要的代码并正确地实现了按钮热更新。

2资源路径没有正确配置:按钮热更新通常需要加载新资源,这些资源需要正确的路径才能被访问。如果您没有正确配置资源路径,按钮可能无法加载正确的资源。请确保您正确地设置了资源路径并更新了所有必要的资源。

Unity是一款跨平台的游戏引擎,可以用于开发各种类型的游戏和应用程序。它支持多种平台,包括PC、移动设备、游戏主机等。

1、游戏行业

不论你是程序员或美术师、独立制作人或大型团队的成员,都能使用 Unity 制作游戏。

3D 游戏是Unity 游戏引擎重要的应用方向之一,从最初的文字游戏到二维游戏、三维游戏,再到网络三维游戏,游戏在其保持实时性和交互性的同时,其逼真度和沉浸感在不断地提高和加强。随着三维技术的快速发展和软硬件技术的不断进步,在不远的将来,3D 虚拟现实游戏必将成为主流游戏市场应用方向。

点击卡片领取海量U3D学习资源/面试攻略/简历模版

2、动画行业

从独立的“精品制作屋”到面向全球的媒体制作商,世界各地的工作室都在利用实时渲染的威力加快制作速度、解决工作流程中遇到的障碍并通过 Unity 来提高创造力。

在动画产业中对于Unity的使用是关乎生存的问题,而不是选择问题。除了节省预算之外,在Unity中动画资产可以重复用于各种目的。过去的单一的动画场景资产现在可以在一个项目中的多个场景中被使用,甚至还能够将它们的用途扩展到游戏和其他各种媒体之中。

3、工业

当今世界工业已经发生了巨大的变化,先进科学技术的应用显现出巨大的威力。Unity3D 引擎已经被世界上一些大型企业广泛地应用到工业仿真的各个环节,对企业提高开发效率,加强数据采集、分析、处理能力,减少决策失误,降低企业风险起到了重要的作用。

点击卡片领取海量U3D学习资源/面试攻略/简历模版

4、全息投影

全息投影技术属于3D技术的一种,原指利用干涉原理记录并再现物体真实的三维图像的技术。而后随着科幻**与商业宣传的引导,全息投影的概念逐渐延伸到舞台表演、展览展示等商用活动中。Unity引擎由于其强大的3D渲染与交互功能,越来越多的成为了全息投影项目开发中,开发者中意的辅助工具

5、虚拟现实

Unity引擎可以实现虚拟室内设计效果,它不仅仅是一个演示媒体,而且还是一个设计工具。它以视觉形式反映了设计者的思想,在装修房屋之前,首先要做的事是对房屋的结构、外形做细致的构思。

为了使之定量化,还需设计许多图纸,当然这些图纸只有内行人能读懂。虚拟室内设计可以把这种构思变成看得见的虚拟物体和环境,使以往传统的设计模式提升到数字化的所见即所得的完美境界,大大提高了设计和规划的质量与效率。

点击卡片领取海量U3D学习资源/面试攻略/简历模版

近几年,Unity引擎还被更多的使用到影视合成、产品交互、会场宣传等方向。正是使用Unity引擎,百度、京东、大众等企业,实现了会展影片制作、全息投影、3D立体影片、车身投影秀、COOLUX潘多拉立体投影等多种交互体验项目。

以上就是关于游戏优化系列三:Unity游戏的黑屏问题解决方法全部的内容,包括:游戏优化系列三:Unity游戏的黑屏问题解决方法、桃源深处有人家是什么游戏引擎开发的、Unity3D 学习路线等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9340903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存