文章目录
-
-
-
-
-
- ,A1.游戏点击启动到图片显示的全过程
- 1、MainStart作为启动器挂在场景中, 其Start在方法中,添加组件代理
- 2.每帧结束时,调用NetManager类中的Update方法,每帧执行
- 协程!
- 2.unity中使用协程
- Unity摘录官方文件
- 协程与monobehaviour
- 3.初始化一些常用路径,如dataPath,streamingAssetPath之类的
- 4.常用委托公共代理赋值, 如显示下载速度, 加载贴图函数、获取资源路径等
- 5、显示质量控制,初始化, 获取硬件信息, 内存容量等
- 6、初始化log类, 自定义
- 7、GameUIManager初始化, 在构造函数中,初始化UI, 如游戏加载界面等。
- 8、增加UI Root 组件, 放UI对象
- 9.相机设置: cullingMask
- 9.相机设置:orthographic(正交模式)
- 9.相机设置:clearFlags(背景清理模式)
- 9.相机设置:深度缓冲:(Depth)
- 9.相机设置:远近切割空间(ClipPlane)
- 9.相机设置:m_CurrentCamera.renderingPath (渲染路径)设置
- 9.相机设置:allowHDR(HDR高动态范围)
- 9.相机设置: useOcclusionCulling (遮挡消除)
- 视锥体剔除
- 烘焙
- 9、对相机设置:allowMSAA(多采样反走样)
- Aliasing(走样):
- MSAA算法
- 为何使用四元数?
- 10、增加画布Canvas组件[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-uDTsOKHa-1652254645376)(en-resource://database/5219:1)]
- 10、增加画布Canvas组件-RenderMode
- 11、增加GraphicRaycaster 组件,阻挡射线元素[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUVtwjHP-1652254645384)(en-resource://database/5229:1)]
- 12、增加CanvasScaler 组件,控制图片的缩放设置
- 13、初始化Canvas 属性
- renderMode: 渲染模式
- 有三种模式:a-- ScaleWithScreenSize
- 14、计算适配
- UGUIRoot UI节点创建
- 15.监控创建事件 EventSystem
- 15.标准输入模块 StandaloneInputModule
- 16.初始化lua- 各种类型的初始化
- 16.初始化lua- 各种委托的初始化
- 16.初始化lua- lua状态机的初始化
- 16.doLuaString(), 执行lua文件
- 把 UIResourceManager.CreateInstance 函数实例,赋值UILoadPanelControl,
- 16. 初始化shader管理器
- shader: 是着色器,
- 初始节点级别[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-EMY95J1z-1652254645397)(en-resource://database/5253:1)]
- 设置初始化设备
- 平台信息的初始化platform.lua
- c\读取引擎配置 lua 文件
- d\ 允许ios使用序列属性
- 资源服务器的初始化
- a\ InitLocalVersionJson() 本地资源版本的初始化Json
- b\ 读取远程资源版本信息
- 设置GC , 增加非托管内存的分配
- 创建显示安全区
- a\ 安全区:
- 现在进入第二帧。 加载界面
- 从commonalityBundle.unity3d加载特效
- 实现加载进度条
- 读取加载配置项lua文件, misc/loading.lua[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传
- 为何使用配置项?
- 使用DoTween,
- 辅助信化初始化(第三帧)-打印设备信息log,
- 辅助信息初始化(第三帧)-sdk初始化
- 辅助信化初始化(第三次帧)-对lua初始化
- 绑定 c#对应的wrap类
- d\ http访问器 开启(HttpAccessor)
- http是什么?
- 游戏状态机初始化: , 进入更新过程
- 创建多个状态机插槽并插入队列
- 流程包括:
- 插槽安装后,开始调用并进入第一位:
- a\ 开始进入第一状态:显示更新界面
- 在update测试是否已完成
- b\ 开始进入 第一次进入游戏(状态)
- 比如第一次进入游戏
- 使用SQLTools 微数据库[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-DUJcDHJj-1652254645435)(en-resource://database/5299:1)]
- 阅读等级包:
- 读取版本号:
- 应用等级包和版本号
- c\ 请求差异文件状态(更新)
- 读取网络状态, 目前的设备能否正常上网。
- 2.判断手机上的存储是否可以使用, 如果不能使用,也要报错[外链图片转存失败,源站可能有防盗链机制,建议保存图片直接上传(img-ydTyrDpd-1652254645443)(en-resource://database/5309:1)]
- 3.然后打出提示信息,让玩家知道在更新,否则他们会认为它被卡住了
- 管理器信息的初始化, 如果您需要下载的总尺寸,您已经下载了多少,下载速度等。这些信息已被清除[外部链图存储失败,源站可能有防盗链机制,建议保存图片并直接上传
- 5.然后调用线程下载并停止:[如果外链图片存储失败,源站可能有防盗链机制。建议保存图片并直接上传
- 然后打开下载线程[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传
- 下载最多六个(自定义)线程,并将使用们放到线程池中进行管理[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
- 有了请求后,先放入下载队列中。并在线程中,去从请求队列中拿出来,再调用。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRfqwbSh-1652254645448)(en-resource://database/5319:1)]
- 再组装每个下载的请求的参数:如请求的url链接、超时数、协议类型、请求的方式(Get or Post)等。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
- GET 与 Post区别
- 7、校验MD5以核对同一资源
- 8、上一步是下载在内存中了, 现在将下载的资源,写入到本地
- 先获取他需要写入的路径, (不同设备,有固定写法,通常在PersistentData中。)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LV68tWvK-1652254645453)(en-resource://database/5329:1)]
- 再调用文件IO流API,进行写入。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1H4jadAq-1652254645454)(en-resource://database/5331:1)]
- 9、写入完成后,再把该资源的 路径、版本号、md5值,记录到微型数据库中,即可。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKYf4Bhe-1652254645455)(en-resource://database/5333:1)]
- 10、再把这串数据,放到下载完成的队列里。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vInvMdzM-1652254645457)(en-resource://database/5335:1)]
- 11、下载如失败则重试
- 下载成功后移除队列
- 成功后移除回调
- 12、最后再释放掉 这个http请求(节约内存)
- 13、注意:这些操作都需要加锁。
- 什么是线程锁?
- 到这里,结束了更新的前期预备工作。
- 14、再开始 移动设备的配置请求。根据 不同渠道、操作系统、本地版本、等级、sdk等级、服务器id、和app版本,发送请求php信息。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipABXppS-1652254645460)(en-resource://database/5343:1)]
- 15、开启协程,来发送请求[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAq18ymP-1652254645461)(en-resource://database/5345:1)]
- 再使用 unity下载方法下载:UnityWebRequest[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjzQLJKc-1652254645462)(en-resource://database/5347:1)]
- aa 使用UnityWebRequest,发送Post请求
- bb 使用yield return,等待信息返回的结果
- cc 使用isDone,判断下载是否已完成。
- 下载完成后,接收数据,
- ff 再判断下载的状态态码是否”OK“,
- gg 如果OK,再调用其回调函数。
- hh 在回调函数中,再次判断状态,
- 如果失败,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Geuxpyaz-1652254645463)(en-resource://database/5349:1)]
- 如果失败,判断是否 域名解析失败或者404之类的一些错误,直接进入更新错误状态
- 如果是其它失败,则再尝试两次上面的流程, 如果还不行, 则进入更新错误状态。
- 如果成功:开始分析与解析返回的数据:返回的数据是一段json格式的,所以可以直接转成json进行解析。
- 什么是json?
- 如json解析失败,则直接进入错误提示的状态,及界面。
- 如json解析成功,则根据json的key值,读取到他们,存入table.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mECy3AT-1652254645464)(en-resource://database/5351:1)]
- 也存一份为lua对象。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Z8Yk3Lm-1652254645465)(en-resource://database/5353:1)]
- 再设置进度条: 进展到了10%[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00XGyTob-1652254645465)(en-resource://database/5355:1)]
- 再将数据缓存到客户磁端信息类中:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u65q2kM3-1652254645466)(en-resource://database/5357:1)]
- 再判读,是否有配置跳过更新。有的话,不更新,直接进游戏。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlJtbvvI-1652254645467)(en-resource://database/5359:1)]
- 否则进入更新流程:判断登录模式是否是sdk登录, 是的话,要打开SDK登录的界面。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4cfmkxeD-1652254645468)(en-resource://database/5361:1)]
- 否则,开始判断当前游戏的资源版本,如果本地版本与远程服务器相同。则直接进入”游戏更新完成“的流程。表示不用更新。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoyDtTPy-1652254645468)(en-resource://database/5363:1)]
- 否则,界面出现提示”游戏资源需要更新“。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5qwGTAD-1652254645469)(en-resource://database/5365:1)]
- 显示更新的进度条。执行更新流程:tempVersion旧时版本的作用:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2XNpyyJ-1652254645471)(en-resource://database/5367:1)]
- 全部下载完时 , tempVersion会等于 remoteVersion第一次打开时,tempVersion会读取version.txt覆盖安装,需要检查资源,会置于1,Singleton<ResService>.Instance.SetTempVersion(-1);GoToDownload--显示提示面板:"正在下载最新文 件"ShowTips,计算需要下载的大小,与sd卡的可用空间,如果可用空间不足,则报错[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zcg1HKkA-1652254645472)(en-resource://database/5369:1)]
- 判断当前是否wifi还是数据流量,如果是流量,就要提示用户,是否确认用流量下载?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rBiXc18-1652254645473)(en-resource://database/5371:1)]
- 否则,就进入下载流程,显示提示框,提示”当前已下载xxx, 下载速度是xxx,需要下载xxxM 等”FileDownloadState[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07toeWRP-1652254645474)(en-resource://database/5373:1)]
- 下载完成时回调,将进度条设置为1,(满额)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZAmiBQn-1652254645475)(en-resource://database/5375:1)]
- 进入UpdateFinishState,更新完成的流程隐藏加载的特效,显示“进入游戏中”的提示读取x3d.bytes引擎文件下载完后,Reload一次。Reload lua 的Pak 文件清理md5List列表,释放对象lua.Start();封装lua基础类[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVMnz87V-1652254645476)(en-resource://database/5377:1)]
- 封装物理类:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKCuoUwj-1652254645476)(en-resource://database/5379:1)]
- 封装log类:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bGEKiWg6-1652254645478)(en-resource://database/5381:1)]
- 运行:main.lua (DoFile("main.lua"))在main.lua中,require主要的工具类,公共类,功能的逻辑类,全局的东西[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FI8mpBLj-1652254645479)(en-resource://database/5383:1)]
- UI资源管理器重载,先卸载旧原来的资源,再重载ui的配置资源,如某个UI引用到的是哪些icon, 图集等。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-srRorUWi-1652254645480)(en-resource://database/5385:1)]
- 把json转成类对象(记录引用信息的类)地形管理器重载,场景setting文件中的配置信息,同样转成类对象scene_setting.txt读取特效依赖信息,转类对象effect_setting.txt读取shader包资源,(打在同一个ab包中的)shaderex.unity3d在后面的下载完成后,再回调这一步设置的,停止下载的线程sdk加载完成后shader加载完成之后,加载lua[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pgfjf2AK-1652254645481)(en-resource://database/5387:1)]
- lua周期函数启动, start\ update \ fixedUpdate等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsafXWEG-1652254645482)(en-resource://database/5389:1)]
- 设置富文本表情的资源[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yoqiktwv-1652254645483)(en-resource://database/5391:1)]
- 间隔回调UnityEngine.Time.fixedDeltaTime = 0.02
- 模拟物理UnityEngine.Physics.autoSimulation = false
- 随机种子math.randomseed(tostring(os.time()):reverse():sub(1, 7))发送php的http请求之lua启动
- c#再调用平台原生接口请求http,如安卓平台,使用 AndroidJavaClass.Call("函数名",参数);p[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOKIMhgX-1652254645484)(en-resource://database/5395:1)]
- 安卓接收到回调,再启动新的线程,使用URL java类和Http连接类,并使用BufferedReader读取发送链接后返回的信息[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Adq5kdQF-1652254645486)(en-resource://database/5397:1)]
- 再成功后,使用UnityPlayer.UnitySendMessage("unity对象“,”函数名“,参数)进行调用,做为对此请求的回应。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-if2ptgc8-1652254645486)(en-resource://database/5399:1)]
- lua计算适配
- lua调用硬件信息初始化 --硬件配置信息初始化
- GameNet.New()
- 角色信息初始化,登录平台信息,合服记录数据,服务器列表,角色信息,登录场景信息等
- lua状态机启动
- 进入-----初始化状态类------ 流程,
- 进入该状态,加载用户之前对音乐、音效的设置,及音量大小,音量开关的设置,并应用这些设置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrKScwku-1652254645487)(en-resource://database/5401:1)]
- 此时判断,如果是创角,则打开登录页,(将准备进入创角界面)。否则,打开选服页和登录页。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XI6Mev4V-1652254645488)(en-resource://database/5403:1)]
- 清理玩家等级,下载场景需要的资源[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guWhBfLx-1652254645488)(en-resource://database/5405:1)]
- lua中,调整初始化相机的属性[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-synkHNBo-1652254645489)(en-resource://database/5407:1)]
- 读取场景的配置,设置到相机中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWO13V5b-1652254645489)(en-resource://database/5409:1)]
- 初始化AOI, 增加当前主角的Id和位置到aoi实体。
- AOI:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRguzCxE-1652254645490)(en-resource://database/5411:1)]
- 打开选服界面后,界面加载完成时,自动调用设备唤起SDK
- 从配置文件中,判断当前是否sdk登录,是的话,调用拉起sdk的登录界面
- self.is_sdk == "1" then --普通SDK登录[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTRZTLot-1652254645491)(en-resource://database/5413:1)]
- 否则的话,判断为内部登录,直接调用SDK成功的函数,
- 保存用户的Cookie,
- 设置登录的状态等。
- 读取cookie,如果已有,直接自动填充用户信息,
- 再点登录,后面就可以进游戏了。
- 结束。
-
-
-
-
,A1、游戏点击“启动”至画面显示出来的全流程
游戏是一门复杂的艺术与技术
1、MainStart挂在到场景中,做为启动器, 其Start方法中,增加组件“代理类“
Start(Unity生命周期问题)常见如: Awake OnEnabel Start Update(每帧调用) FixUpdate(固定帧调用) OnMouse OnTirgger(触发器) OnCollision(碰撞器) OnDestory OnDisable OnApplication等GameObject maingame = GameObject.FindWithTag("MainCamera");
2、每帧结束时,调用NetManager类中的Update方法,每帧执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C5HICson-1652254645326)(en-resource://database/5179:1)]
协程!
什么是协程?程和线程、进程类似,但不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。 比较协程和线程。 多个线程相对独立,有自己的上下文,切换受系统控制; 而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。 –知乎1.协程解决了什么问题?协程属于异步编程的范畴,在这个领域内我们来比较一下他“竞争对手”们。 回调函数: 他的机制很简单,但是他的一个弊端就是把代码切分成很多个函数中,尤其是你回调里套回调,一个逻辑上的流程被切分成零碎的很多处代码,容易把人给绕晕了。 多线程:协程和线程一个很大的区别就是,线程是在OS层面支持的,而协程是在用户态层面实现的。线程的执行,什么时候被切出去,多个线程的执行顺序和抢占我们是无法控制的,所以需要引入一些锁的机制来保证协作运行。 而协程不一样,那些东西会一口气执行完(这里指不会被其他协程打扰),什么时候交出执行权挂起,程序员都很精准地控制。 所以总的来说,协程有两个特点:逻辑清晰,执行可控。
2.unity中使用协程
一提到”异步“, 在很多开发场景里想到的都是I/O等各种阻塞。但因为游戏开发场景,unity的协程还用另一类比较常用的情形:. 举个例子就是补间动画每一帧移动一点点,或者那个… 看一下unity协程支持的yield return的迭代器,大多都是和时间,帧有有关的(比如null,waitForSeconds…)简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换
Unity官方文档摘录
编程建议 如果几乎是每一帧都yield null,别写协程了,直接把代码放进update,lateupdate这种回调里。这可读性更强,因为update回调就是干这种事情的。 嵌套的协程,会带来更多的内存开销(下面的实现原理会说)。 但是嵌套的协程很多时候会让流程更清晰可读,所以自己权衡啦。
协程与monobehaviour
MonoBehaviour.enabled = false时,不会停止协程.但明确Destory(MonoBehaviour) 时会停止协程。 MonoBehaviour所绑定的GameObject,SetActive(false)时,也会停止协程 可以使用 MonoBehaviour. 可以用StopCoroutine和MonoBehaviour.StopAllCoroutines 来显式停止协程。 yield return 可以返回的类型 yield return new WaitForFixedUpdate(); //等待,直到下一个固定帧率更新函数 yield return null;//等待下一帧执行,在Update后,LateUpdate前.(注意:null、任意数字、字符串、true、false效果一样) yield return new WaitForEndOfFrame();//等待,直到该帧结束,在渲染所有摄像机和 GUI 之后,在屏幕上显示该帧之前,LateUpdate后。 yield return new WaitForSecondsRealtime(5);//使用未缩放时间将协同程序执行暂停指定的秒数。 yield return new WaitForSeconds(5);//使用缩放时间将协程执行暂停指定的秒数。 yield return new WaitWhile(() => frame < 10);//暂停协程执行,直到提供的委托评估为 /false/。 yield return new WaitUntil(() => frame >= 10);//暂停协程执行,直到提供的委托评估为 /true/ 为什么yield的返回值必须是IEumerator? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keJbZt2b-1652254645329)(en-resource://database/5457:1)]
协程: https://zhuanlan.zhihu.com/p/398458351 线程: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZBn2ody-1652254645331)(en-resource://database/5459:2)]
3、初始化一些常用路径,如dataPath,streamingAssetPath之类的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPbsjjoz-1652254645333)(en-resource://database/5185:1)]
4、为公共代理赋值常用委托, 如显示下载速度, 加载贴图的函数、获取资源路径等等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0E87pMA-1652254645335)(en-resource://database/5459:2)]
5、显示质量控制类,初始化, 获取硬件信息, 内存容量等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AoHT5xej-1652254645336)(en-resource://database/5461:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SszepAZe-1652254645337)(en-resource://database/5189:1)]
6、初始化log类, 自定义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2y2rN1We-1652254645338)(en-resource://database/5191:1)]
7、GameUIManager初始化, 在构造函数中,初始化UI, 如游戏加载界面等。
Template模板、GUI模板DontDestroyOnLoad(GameUIManager.m_Instance.m_GUI); 设置不销毁GameUIManager.m_Instance.m_GUI.localPosition = new Vector3(-2000, -2000, 0); 设置位置在屏幕外因为切场景时,加载资源的对象不应被销毁
8、增加UI Root 组件, 放UI对象
9、对相机设置: cullingMask
增加UGUICamera组件初始化相机参数[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tN42cfaF-1652254645342)(en-resource://database/5193:1)] 如cullingMask: a This is used to render parts of the Scene selectively. 只渲染UI层, (因为是UI类型游戏)
9、对相机设置:orthographic(正交模式)
b orthographic = true 设置正交模式 正交模式、透视模式(近大远小)c this.m_CurrentCamera.clearFlags = CameraClearFlags.Depth;How the camera clears the background.Clear only the depth buffer. 只清理深度缓存 (记录了深度信息)会保留前一帧的颜色或以前显示的任何内容。
9、对相机设置:clearFlags(背景的清理模式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jllfBme-1652254645343)(en-resource://database/5463:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUer0NRq-1652254645345)(en-resource://database/5195:1)]
9、对相机设置:深度缓冲(Depth)
什么是深度缓冲区? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N0FsXXli-1652254645346)(en-resource://database/5197:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkPhH439-1652254645349)(en-resource://database/5465:1)]
深度缓冲是在三维图形中处理图像深度坐标的过程,这个过程通常在硬件中完成,它也可以在软件中完成,它是可见性问题的一个解决方法 深度缓冲也称为Z缓冲 这个缓冲区通常组织成一个保存每个屏幕像素深度的x-y二维数组。 如果场景中的另外一个物体也在同一个像素生成渲染结果,那么图形处理卡就会比较二者的深度,并且保留距离观察者较近的物体。 然后这个所保留的物体点深度保存到深度缓冲区中。 最后,图形卡就可以根据深度缓冲区正确地生成通常的深度感知效果:。这个过程叫作z消隐。
d cullingMask: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hArv9FDS-1652254645350)(en-resource://database/5467:1)]
相机的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csWEZWMu-1652254645351)(en-resource://database/5199:1)] 包含了物体所在的层级[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4UN5tys-1652254645352)(en-resource://database/5201:1)] 时,物体会被渲染出来。
9、对相机设置:远近裁剪空间(ClipPlane)
e:nearClipPlane 近裁剪空间The near clipping plane distance. farClipPlane 远裁剪空间The far clipping plane distance.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GFH1lkcw-1652254645353)(en-resource://database/5203:1)] 只有在裁剪空间范围内的,才会被渲染。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SH544Og1-1652254645354)(en-resource://database/5469:1)]
9、对相机设置:m_CurrentCamera.renderingPath (渲染路径)设置
f:渲染路径: 三种:顶点光照 最低光照保真度且不支持实时阴影的渲染路径 this.m_CurrentCamera.renderingPath = RenderingPath.VertexLit; The rendering path that should be used, if possible.
VertexLit是顶点光照, 此__顶点光照__着色器是最简单的着色器之一。 照射在其上的所有光源在单个通道中渲染,并仅在顶点处计算。
其它几种渲染路径有: 前向渲染 Forward Rendering. 前向渲染根据影响对象的光源在一个或多个通道中渲染每个对象。 在前向渲染中,影响每个对象的一些最亮的光源以完全逐像素光照模式渲染。最多 4 个点光源采用每顶点计算方式。 其他光源以球谐函数 (SH) 计算,采用前向渲染方式渲染实时光源会非常消耗资源如果项目没有使用大量实时光源,或者光照保真度对项目而言不重要, 则此渲染路径可能是这个项目的不错选择补充:顶点着色器-》坐标变换与逐顶点光照,生成片元片元着色器-》纹理采样、给片元着色如屏幕上画一个四边形,占据了19201080的屏幕的一半。则顶点着色器只需要计算四个点。 片元着色器需要计算19201080/2个点的量。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCxIljT5-1652254645355)(en-resource://database/5205:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLSBTPUS-1652254645356)(en-resource://database/5471:0)]
延迟着色 DeferredShading 如果项目具有大量的实时光源并需要高级别的光照保真度,而目标硬件支持延迟着色,那么此渲染路径对于该项目而言可能是一个不错的选择 特点: 不支持半透明对象 正交投影 硬件抗锯齿 (上面三个都在前向渲染中支持) 色对剔除遮罩的支持有限,需要 GPU 支持 可影响游戏对象的光源数量没有限制 所有光源都按像素进行评估, 这意味着它们都能与法线贴图等正确交互所有光源都可以有剪影和阴影。
9、对相机设置:allowHDR(HDR高动态范围)
g:this.m_CurrentCamera.allowHDR = false; High dynamic range rendering. 高动态范围 (HDR) 技术能够产生比标准动态范围 (SDR) 图像更高的亮度动态范围的图像,可以对颜色和亮度进行逼真的描绘。 在标准渲染中,像素的红色、绿色和蓝色值均使用一个 0 到 1 范围内的 8 位值进行存储,其中 0 表示零强度,1 表示显示设备的最大强度。 这一有限的数值范围无法准确反映我们在现实生活中对光的感知方式,并且当存在非常亮或非常暗的元素时,会导致图像不真实。 在 HDR 渲染中,像素值使用浮点数进行存储。 这种情况下允许更大范围的值,可以更准确地表示人眼感知颜色和亮度的方式。 主要用来支持发光效果, 如火焰、太阳照射反射等Unity 会将场景渲染到 HDR 图像缓冲区,并使用该 HDR 图像执行渲染操作
9、对相机设置: useOcclusionCulling (遮挡剔除)
h:this.m_CurrentCamera.useOcclusionCulling = false; (Unity 的内置遮挡剔除在 CPU 上执行运行时计算,这可能会抵消其节省的 CPU 时间)
渲染期间,摄像机是否使用遮挡剔除?
遮挡剔除:“遮挡剔除”过程可防止 Unity 为那些被其他游戏对象完全挡住(遮挡)的游戏对象执行渲染计算。 摄像机在每一帧中执行剔除操作,这些操作会检查场景中的渲染器,并排除(剔除)那些不需要绘制的渲染器。
视锥体剔除
默认情况下,摄像机执行视锥体剔除,这一过程将排除所有不在摄像机视锥体范围内的渲染器。(如剔除相机背后的物体) 但是,视锥体剔除不会检查渲染器是否被其他游戏对象遮挡,因此 Unity 仍会浪费 CPU 和 GPU 时间进行在最终帧中不可见的渲染器的渲染操作。 遮挡剔除将阻止 Unity 执行这些徒劳的操作。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzUAgjGD-1652254645357)(en-resource://database/5207:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9aIPd2C-1652254645358)(en-resource://database/5475:0)]
何时使用:防止无意义的渲染操作可以节省 CPU 和 GPU 时间。 Unity 的内置遮挡剔除在 CPU 上执行运行时计算,这可能会抵消其节省的 CPU 时间。 因此,当项目因过度绘制而具有 GPU 密集型特征时,遮挡剔除最有可能提高性能。 Unity 在运行时将遮挡剔除数据加载到内存中。必须确保有足够的内存来加载此数据可以使用遮挡剔除来遮挡动态游戏对象,但动态游戏对象不能遮挡其他游戏对象。 如果项目会在运行时生成场景几何体,则 Unity 的内置遮挡剔除不适用于该项目。
原理: 怎么计算的?
烘焙
遮挡剔除会在 Unity Editor 中生成有关场景的数据,然后在运行时使用该数据来确定摄像机可以看到的内容。这种生成数据的过程称为烘焙。 比如在任意位置,朝某个方向看时,能看到的内容。在对遮挡剔除数据进行烘焙时,Unity 将场景划分为多个单元,并生成描述单元内几何体以及相邻单元之间可见性的数据然后,Unity 尽可能合并单元,以减小生成的数据的大小。 要配置烘焙过程,可以在 Occlusion Culling 窗口中更改参数,并在场景中使用遮挡区域。 在运行时,Unity 会将这些烘焙的数据加载到内存中,并且对于每个启用了 Occlusion Culling 属性的摄像机,将会对数据执行查询以确定该摄像机可以看到的内容。 请注意,启用遮挡剔除后,摄像机将执行视锥体剔除和遮挡剔除。
9、对相机设置:allowMSAA(多重采样反走样)
i: this.m_CurrentCamera.allowMSAA = false; MSAA rendering. 是否启动此技术。 Multisample anti aliasing多重采样反走样
先说走样:
Aliasing(走样):
走样(混叠)在对不同的信号进行采样时,导致得出的信号相同的现象。 具体到实时渲染领域中,走样有以下三种:几何体走样(几何物体的边缘有锯齿),几何走样由于对几何边缘采样不足导致。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hfu79v4-1652254645359)(en-resource://database/5209:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N9JwDSkm-1652254645360)(en-resource://database/5477:0)]
着色走样,由于对着色器中着色公式(渲染方程)采样不足导致。比较明显的现象就是高光闪烁[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSQ1ViAC-1652254645361)(en-resource://database/5211:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtQ795W5-1652254645362)(en-resource://database/5479:0)]
时间走样,主要是对高速运动的物体采样不足导致。 比如游戏中播放的动画发生跳变等。
SSAA(超采样反走样)以一个更大的分辨率来渲染场景,然后再把相邻像素值做一个过滤(比如平均等)得到最终的图像提高了采样率,提升了画面。
但它需要更多的显存空间以及更多的着色计算(每个子采样点都需要进行光照计算),所以一般不会使用这种技术
MSAA算法
原理:多重采样反走样只计算每个像素的颜色,而对于那些子采样点只计算一个覆盖信息(coverage)和遮挡信息(occlusion)来把像素的颜色信息写到每个子采样点里面,最终根据子采样点里面的颜色值来通过某个重建过滤器来降采样生成目标图像。这就是MSAA的原理。
注意这里有一个很重要的点,就是每个子像素都有自己的颜色、深度模板信息,并且每一个子采样点都是需要经过深度和模板测试才能决定最终是不是把像素的颜色得到到这个子采样点所在的位置,而不是简单的作一个覆盖测试就写入颜色。 (优点): MSAA只对当前像素覆盖掩码不为0的进行着色, 而SSAA对于所有子采样点着色https://www.cnblogs.com/ghl_carmack/p/8245032.html
j:设置Transform ,及全屏扩展[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfsB05hN-1652254645363)(en-resource://database/5213:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epCZdEo0-1652254645371)(en-resource://database/5481:0)]
通过脚本创建 UI 元素 : https://docs.unity3d.com/cn/2017.4/Manual/HOWTO-UICreateFromScripting.html
-------------————localPosition: 矩形轴心点相对于锚点的位置 sizeDelta: The size of this RectTransform relative to the distances between the anchors. 取决于锚点之间的距离。anchorMin, anchorMax,: 矩形左下角和右上角的锚点, 锚点(固定点,用来适配UI) localScale: pivot: 矩形旋转围绕的轴心点的位置,定义为矩形本身大小的一个比例。0,0 相当于左下角,而 1,1 相当于右上角。 比如设置为 (1,1)时, 则旋转时,物体会围绕右上角的点转动。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9wkMqdJ-1652254645372)(en-resource://database/5215:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e40WDl7L-1652254645374)(en-resource://database/5483:0)]
localRotation: 旋转值 (相对于父物体)三个维度,使用 四元数。
什么是四元数? Quaternions are used to represent rotations.They are compact, don’t suffer from gimbal lock and can easily be interpolated. Unity internally uses Quaternions to represent all rotations.
因为普通旋转是按顺序的, 如zyx,的顺序, z是按全局坐标, y和z是按局部坐标。 如果z渲染了90度, 那后面的y和x就处于同个维度了,相当于丢失了一个维度,不能转了。
为什么使用四元数?
因为普通三维向量,会有万向锁问题,且不容易插值。总结欧拉角问题:万向节死锁的根源在于欧拉角的定义方式万向节死锁的结果,不是说不能旋转了,而是会导致旋转不自然要规避万向节死锁,需要选择合适的旋转顺序使用四元数实现旋转[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4XqYAoZZ-1652254645375)(en-resource://database/5217:1)]
10、增加画布Canvas组件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDTsOKHa-1652254645376)(en-resource://database/5219:1)]
Element that can be used for screen rendering.渲染屏幕
10、增加画布Canvas组件-RenderMode
RenderMode: -ScreenSpaceCamera: Render using the Camera configured on the Canvas.在UI前面的3D物体会被渲染出来。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zWdl7kR-1652254645379)(en-resource://database/5223:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7YLKnVjy-1652254645380)(en-resource://database/5489:0)]
-
ScreenSpaceOverlay:Render at the end of the scene using a 2D Canvas.
-
Overlay:覆盖在某某之上。 无论怎么移。
-
UI始终覆盖在其它对象的上面,显示在顶层无论3D物体什么位置, UI都会遮挡3D物体。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A0opRFyT-1652254645382)(en-resource://database/5491:0)]
-
WorldSpace : Render using any Camera in the scene that can render the layer.
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBRrx7en-1652254645382)(en-resource://database/5227:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uwtJX4I-1652254645383)(en-resource://database/5493:0)]
This mode renders the UI as if it were a plane object in the scene UI被当做普通的3D平面物体一样对待, 不再是正交的,有近大远小的效果。 the plane need not face the camera and can be oriented however you like. The size of the Canvas can be set using its Rect Transform but its onscreen size will depend on the viewing angle and distance of the cameraOther scene objects can pass behind, through or in front of the Canvas.
11、增加GraphicRaycaster 组件,阻挡射线元素[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUVtwjHP-1652254645384)(en-resource://database/5229:1)]
A BaseRaycaster to raycast against Graphic elements.对 Graphic元素,阻挡射线,反转时不让接收等。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAyGclQj-1652254645384)(en-resource://database/5231:1)] Type of objects that will block graphic raycasts. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78B6ARPy-1652254645385)(en-resource://database/5495:0)]
12、增加CanvasScaler 组件,控制画面的缩放设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKIRa5yX-1652254645385)(en-resource://database/5233:1)]
控制画面的缩放设置 controlling the overall scale and pixel density of UI elements in the Canvas, This scaling affects everything under the Canvas, including font sizes and image borders.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gr54MnR8-1652254645386)(en-resource://database/5235:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIJabv3e-1652254645387)(en-resource://database/5497:0)]
13、初始化Canvas 属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXpiQLgH-1652254645387)(en-resource://database/5237:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FW52pR0W-1652254645388)(en-resource://database/5499:0)]
renderMode: 渲染模式
Is the Canvas in World or Overlay mode?
worldCamera: camera模式对应的摄像机是哪个Camera used for sizing the Canvas when in Screen Space - Camera. Also used as the Camera that events will be sent through for a World Space [[Canvas].
sortingOrder: 排序ID, 在某个层里面,排第几, 大小会影响显示的遮挡关系
Canvas’ order within a sorting layer.
sortingLayerName: 排序层Name of the Canvas’ sorting layer.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7DWOPx0-1652254645388)(en-resource://database/5239:1)]
uiScaleMode: ui缩放模式: Determines how UI elements in the Canvas are scaled. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbFs9550-1652254645389)(en-resource://database/5501:0)]
有三种模式:a-- ScaleWithScreenSize
positions and sizes can be specified according to the pixels of a specified reference resolution
根据指定的参考分辨率,进行缩放, 可以按宽或者高。是用得最多的模式,方便做适配。 UI缩放的尺寸, 是以宽度来适配,还是高度来适配。
b-- Constant Pixel Sizepositions and sizes of UI elements are specified in pixels on the screen 按绝对的分辨率, 可以按分辨率, 统一比例缩放
c— ConstantPhysicalSize referenceResolution:参考分辨率 The resolution the UI layout is designed for.
screenMatchMode: 匹配的模式[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cl4MEH6C-1652254645390)(en-resource://database/5241:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aMPTR6eQ-1652254645391)(en-resource://database/5503:0)]
是按高度,还是按宽度来。
matchWidthOrHeight: 宽度or高度的比例
this.m_UGUIGraphicRaycaster.ignoreReversedGraphics = false; 如果ui翻转了, 是否接收射线
14、计算适配
CalculateAspect[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqOytALV-1652254645391)(en-resource://database/5243:1)] 根据真实设备的比例,与UI制作的标准比例,去计算一个比值,来决定是要按高还是按宽去适配。 比如两个分辨率,都用宽/高, 如果设备的值比UI的计算值小,则说明不是比较宽的手机,所以按高度适配。 否则按宽度。 原则是:高手机用高适配,宽手机用宽适配。
UGUIRoot UI节点创建
之后各种节点挂在到这个上面
15、创建事件监听 EventSystem
a-- AddComponent<EventSystem>(); 作用:Handles input, raycasting, and sending events.
这是u3d的射线及交互系统, 鼠标、射线、各种事件等,而前面有个Graphics Raycaster是控制哪些ui要阻挡摄像的,以防止点到他后面的UI,导致bug.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vNFPyY9-1652254645392)(en-resource://database/5245:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mkL2KRo-1652254645393)(en-resource://database/5505:0)]
15、标准输入模块 StandaloneInputModule
b—AddComponent<StandaloneInputModule>(); [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYniovMC-1652254645393)(en-resource://database/5507:0)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMoVK3vU-1652254645394)(en-resource://database/5247:1)]
作用: Input module for working with, mouse, keyboard, or controller.鼠标、键盘、手柄, 去配置输入设备的参数。
16.初始化lua- 初始化各种类型
a\ InitTypeTraits 初始化各种类型
UIHelper.doLuaString = Singleton<LuaScriptMgr>.GetInstance().DoString;
在lua中初始化各种基础数据类型, 如数值类型float int string等数组类型 float [], int[]等引擎组件类型 Color Vector3 RaycastHit 等 lua对象类型 LuaTable LuaFunction 等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sleqdgB7-1652254645395)(en-resource://database/5249:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbpUd4mE-1652254645396)(en-resource://database/5509:0)]
16.初始化lua- 初始化各种委托
b\ InitStackTraits 初始化委托特性, 用于lua与c#交互[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4pwajH4-1652254645397)(en-resource://database/5251:1)]
16.初始化lua- lua状态机类的初始化
c\ lua状态机类的初始化LuaNewState
16.doLuaString(), 执行lua文件
获取lua委托 doLuaString(), 用于执行lua文件
把 UIResourceManager.CreateInstance 函数实例,赋值给UILoadPanelControl,
16. 初始化shader管理器
shader: 是着色器,
用来给游戏资源上颜色,表达出他们需要的外观,无论是文字、UI、模型、特效等全部需要显示的游戏资源,都需要使用着色器上色。 比如显示出什么颜色、每个顶点显示的位置、每个片元的颜色、是否半透明、是否接收光照、是否投射出阴影、能否被遮挡、采用什么样的光照模型、是否抗锯齿、以及屏幕后处理等等,
初始化节点层级[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMY95J1z-1652254645397)(en-resource://database/5253:1)]
每个对象物体,需要到哪个层级。unity中的物体,都有层级属性。 用以控制他们的各项细节, 比如某层级是否显示、是否受物体作用、是否接收射线检测等。
初始化设备的设置
a—this.Setting();// 屏幕不休眠 Screen.sleepTimeout = SleepTimeout.NeverSleep
//对ios的设置 对Windows的设置, 如屏幕分辨率等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLUzHgS8-1652254645398)(en-resource://database/5255:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oz6nQtb7-1652254645400)(en-resource://database/5511:0)]
初始化平台信息platform.lua
b----读取平台配置 platform.lua[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTqPCEYn-1652254645400)(en-resource://database/5257:1)]
读取对平台的配置, 如app_name, 应用名 ditch_name 渠道名, 多渠道包 login_mode 是以sdk的模式登录, 如无,则不会走sdk的登录 pay_mode 是否生成真实的订单号 skip_update 是否跳过更新 play_res_download 是否开启边玩边下载 no_file 是否播放场动画 level_pack_download 是否开启等级资源包更新 ( 因为有时候游戏资源特别大, 而人物等级低的时候,也不用下载那么多, 所以可以检测人物的等级,对应开启相应的资源, 就不用一开始就下载很多资源,等很久了) server_host_name 要登录的服务器 server_port 端口号 debug_mode 是否私服读取该lua文件后, 使用前面的 DoFile执行
c\读取引擎配置 lua 文件
engineconfig_debug.lua里面的配置,主要有引擎相关的,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1HleQPTH-1652254645404)(en-resource://database/5259:1)] 比如 lua文件的路径, 是否打印lua日志, 是否打印日志到提示框, 是否打印引擎日志, 是否将日志输出到log文件, 是否上传lua , c#异常, 是否打印日志到服务端、 服务器的端口配置多少、 是否显示更新提示、 资源下载超时的时间、 下载后是否检查md5等等fps设置多少等, 是否显示机器人, 是否开始翅膀,将上一步的配置,应用出来
d\ 允许ios使用序列化属性
//允许ios使用序列化属性 Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");作用:保存文件时需要。
初始化资源服务器
每个游戏资源的 大小、版本、md5码
ServicePointManager.DefaultConnectionLimit = 50; 默认连接限制数
a\ InitLocalVersionJson() 初始化本地资源版本Json
string path = "pack/rawpack/local_res.json";先读取二进制, 再转为string (json格式), 将json转为类对象 (对象包含 大小、版本、md5)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTgPVP7g-1652254645408)(en-resource://database/5261:1)]
b\ 读取远程资源版本信息
string path = "version/remote/" + CommonProxy.GetOsType() + "_remote_file.json";[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlH2WH6y-1652254645410)(en-resource://database/5263:1)] 得到他们各有多少个文件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DggarjvC-1652254645412)(en-resource://database/5265:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1EjZdjm-1652254645413)(en-resource://database/5513:0)]
设置GC , 增加分配非托管内存
GC.AddMemoryPressure(10 * 1024 * 1024); //大于10M时,进行回收, 以免被GC回收通知运行时在安排垃圾回收时应考虑分配大量的非托管内存。1M=1024KB 1KB=1024Byte
创建显示安全区
,(如刘海屏手机,超过留黑底)如iphone刘海屏之类的, (什么是刘海屏, 水滴屏等), 会导致游戏画面被刘海遮挡
a\ 安全区:
就是提前计算好游戏主界面的大小,保证游戏的显示画面不会被遮挡计算方式:比如在超出某个比例的部分,全部用黑色背景遮盖。 比如手机是10002200的, 那么按极限比例1:2计算,把显区域设置成10002000的大小, 高度超过2000的部分,用黑底遮盖[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-25fCJmQd-1652254645414)(en-resource://database/5267:1)]
b\ 创建黑底 左右上下四边, 有过宽或过高的设备, 如平板黑底的宽度与高度的计算方式,如: 2200的, 则超过了200, 顶部黑图就是高度100,宽度1000,
类似这样到这里第一帧就完成了,
现在进入第二帧。打开 加载界面
创建加载界面的面板,全屏适配 创建loading_bg,logo,process_bg,process_fg,process_text等, (此时还没有资源)读取 提前打包好的公共加载资源 platform/loading_commonality.unity3d[外链图片转存失败,源站可能有防盗链机