文章目录
- ,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是什么?
- 游戏状态机初始化: , 进入更新流程
- 创建多个状态机插槽,并插入队列
- 流程包括:
- 装完插槽,开始调用并进入第1个位置的状态:
- a\ 开始进入第一状态:显示更新界面
- 在update中一直检测是否完成
- b\ 开始进入 第一次进游戏(状态)
- 如第一次进游戏
- 使用SQLTools 微型数据库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DUJcDHJj-1652254645435)(en-resource://database/5299:1)]
- 读取等级包:
- 读取版本号:
- 应用等级包与版本号
- c\ 请求差异文件状态(更新用)
- 1、读取网络状态, 当前设备是否能正常上网。
- 2、再判断手机上存储是否能用, 不能用的话,也要报错[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydTyrDpd-1652254645443)(en-resource://database/5309:1)]
- 3、再把提示信息打出来,给玩家知道,正在更新,不然以为卡死了
- 4、再初始化下载管理器信息, 如需要下载的总大小,当前已下载了多少,下载的速度等等。这些信息都清零[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
- 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的协程还用另一类比较常用的情形:跨越多帧,多时间点的流程写进一个函数. 举个例子就是补间动画每一帧移动一点点,或者一个ui动画先停几秒播这个再过几秒播那个… 看一下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[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0Sa2QRi-1652254645415)(en-resource://database/5269:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4XQv8igq-1652254645416)(en-resource://database/5515:0)]
在update中判断,随着Time.deltaTime时间的流逝,一点点设置 进度条空间的Scale,达到进度条动画增长的效果。
从commonalityBundle.unity3d中,加载出特效
然后在platform/loading目录中, 预先存放了 加载需要的进度条、logo、bg等png图片。 用文件流加载出来并设置到Texture中:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXoPrSt3-1652254645416)(en-resource://database/5271:1)]
把他们的值都归0,
实现加载进度条
进度条初始化设置完了,再开始 UIResourceManager Init, 初始化UI资源管理器, 并对进度条的资源进行配置,和逻辑实现设置DontDestroyOnLoad, 以免进入游戏界面被销毁
初始化 图集、icon、字体的加载委托
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbGmkClm-1652254645418)(en-resource://database/5273:1)]
用于在其它任意位置,静态调用加载游戏所需资源赋值完后,把主委托置空,释放内存
读取加载配置项的lua文件, misc/loading.lua[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
比如更新框中的“加载中。。。”,可以任意改成其它的“游戏正在加载。。。”,
“进入游戏中。。。”,可以改成“游戏马上开始。。。”等。
以及文字的颜色等,都可以配置修改
为什么用配置项
:用配置项的方式,可以动态调整游戏内容,而不用修改代码。
使项目更不容易出错。且可以实现一套代码, 应对多套产品的需求。
使用DoTween,
调整特效动画b\ 对加载动画的特效,
使用 DoTween插件, DoLocalRotate 360度 1.5秒, 和 -1, 表示循环播放,
自身1.5秒旋转一周动画特效处理完, 将总进度赋值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGmg1vKK-1652254645420)(en-resource://database/5277:1)]
然后进度条逻辑中判断,进度条当前大于0.05时,才赋值到0.05,以免超过了。
辅助信化初始化(第三次帧)-打印设备信息给log,
a\ 打印设备信息给log, 如cpu、设备名、进程数、内容大小、显卡设备名等
This Device’s cpuName = Intel® Engine (Info): graphicsDeviceName = Intel® HD Graphics 4600, graphicsDeviceVersion = Direct3D 11.0 [level 11.1] systemMemorySize = 16253, graphicsMemorySize = 1136 SupportImmageEffct = True, SupportRenderTexture = True, SupportStencilBuffer = 1, SupportsInstancing = True
辅助信息初始化(第三次帧)-sdk初始化
b\ 平台消息句柄器, 用来提供各方sdk平台进行通信
如语音平台、回调系统等
辅助信化初始化(第三次帧)-对lua初始化
c\ 对lua初始化
绑定 c#对应的wrap类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GV7yp8Lu-1652254645421)(en-resource://database/5279:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFrKg7rU-1652254645424)(en-resource://database/5517:0)]
d\ http访问器 开启(HttpAccessor)
开启两个线程数, 每个容量为4096 Byte 字节数,
用于在进行http在线下载和更新资源
http是什么?
Hypertext Transfer Protocol 超文本传输协议是Internet 协议套件模型中的一个应用层协议,用于分布式、协作、超媒体信息系统HTTP 是万维网数据通信的基础,其中超文本文档包括指向用户可以轻松访问的其他资源的超链接,例如通过鼠标单击或在 Web 浏览器中点击屏幕[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TrnusyyT-1652254645425)(en-resource://database/5281:1)]
游戏状态机初始化: , 进入更新流程
public const uint MAX_STATE_SINK_NUM = 16; //最大支持的状态槽位数量
public const uint MAX_STATE_NUM = 64; //最大支持的状态数量
每个状态机中有三个主要方法:进入、更新、退出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlJkqwUN-1652254645428)(en-resource://database/5283:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMgWB6po-1652254645429)(en-resource://database/5519:0)]
创建多个状态机插槽,并插入队列
把将要进行的多个流程,逐一插入 插槽队列中。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XYSBcL0W-1652254645430)(en-resource://database/5285:1)]
并设置好回调的监听 。
流程包括:
{
a\ 显示更新界面
b\ 如果是第一次进入游戏,创建一个数据库
c\ 发送资源更新请求,请求版本号,差异列表,远程版本文件,等等。
d\ 文件下载
e\ 文件解压状态
f\ 更新完成
g\ 更新异常状态
}
装完插槽,开始调用并进入第1个位置的状态:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sq9Y15a2-1652254645430)(en-resource://database/5287:1)]
在状态机的执行中,需要进行检查的逻辑判断[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbyc6QOz-1652254645431)(en-resource://database/5289:1)]
五重判断:
1、状态机是否为空?
2、不为空的话, 是否当前已经在当前状态机中?
3、是的话,当前状态机是否能重进?
4、如果能重进的话, 需要先退出当前状态机,再进入当前状态机
5、如果当前不在状态机中,则可直接进入状态机
a\ 开始进入第一状态:显示更新界面
设置进度End 为 false[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYOXGZ8O-1652254645432)(en-resource://database/5291:1)]
然后在while循环中,不断地根据时间的流逝的累计,设置进度条的缩放,达到流畅的进度条增长动画效果。并持有这个增加量。
当增量的总量达到1时,即100%进度。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8MhJ5Ou-1652254645432)(en-resource://database/5293:1)]
在update中一直检测是否完成
在此状态()的update函数中,会一直等待, 是否显示完成:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5JLUkkF-1652254645434)(en-resource://database/5295:1)]
而这个显示完成的状态,是在之前 “打开加载面板”这个函数,加载完成界面后,才会调用的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mq8lbNff-1652254645434)(en-resource://database/5297:1)]
因为资源加载的速度,比数据和逻辑的处理慢得多,所以需要在这个update中一直检测,资源是否加载完, 加载完了才能进入下一个逻辑处理。
这时候在资源加载完成后,也就是界面都显示后,再把进度条的进度设置为0,让它重新开始跑进度。
再把进度条的小特效,锚点设置为如下, 保证它缩放时,是以最右边为基准点。
rectTransform.anchorMin = new Vector2(1, 0.5f);
rectTransform.anchorMax = new Vector2(1, 0.5f);
b\ 开始进入 第一次进游戏(状态)
ToFirstTimeGame
主要逻辑:
//看是否第一次进入游戏
//如果是第一次进入游戏的话将版本号跟资源等级都写到数据库里面 sqlite
如第一次进游戏
:如何判断你是不是第一次点进来呢?
使用SQLTools 微型数据库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DUJcDHJj-1652254645435)(en-resource://database/5299:1)]
select info_value from client_info where info_type = ‘{0}’" 查询字段“first_game”
如果查询没有结果,则返回0,代表第一次进入游戏。并将该值设置为1, 那下次进来,再查结果就是1了,会判断为 不是第一次进游戏了。
修改“更新框”中的文字说明为“如果您是第一次打开游戏,请耐心等待加载”,以免玩家等太久退出。
再把那些版本号、等级号也设置进去。
读取等级包:
不同等级包,存放对应当玩家升级到对应等级时,所需资源。
好处是,不用一开始就加载下载很多资源,导致进游戏等待时间长。
如40级之前,就加载少量资源即可。version/version.txt[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5jiJi448-1652254645435)(en-resource://database/5301:1)]
读取版本号:
version/level.txt[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1uNkpL7g-1652254645440)(en-resource://database/5303:1)]
应用等级包与版本号
如何让等级包和版本号排上用场?
当如果不是第一次进游戏时,就根据版本号与等级号,判断是否改用更高等级的资源了。
本地微型数据库里记录了等级号与版本号, 然后本地资源更新目录里也有对应的等级与版本号,
如果判断这两个等级号不同, 说明角色已经升级到突破当前包的资源了,那么就发送更新请求,请求到对应资源进行下载 。不然玩家体验不到应有的内容。
比如40级升到42级了,但包里的游戏资源还是40级的,就不行了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLXnalUX-1652254645441)(en-resource://database/5305:1)]
版本号也同理,说明已经有版本更新了,玩家当前是旧的版本,也要发送更新请求。
让玩家体验新版本内容。
还有两条线:
1、(Http线程启动)
2、FxManager ReadEffectDependencyConfig
c\ 请求差异文件状态(更新用)
正在发送更新请求
1、读取网络状态, 当前设备是否能正常上网。
如果需要请求(如appStore),但又没网,就要提示报错了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KOWdzRR0-1652254645442)(en-resource://database/5307:1)]
2、再判断手机上存储是否能用, 不能用的话,也要报错[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydTyrDpd-1652254645443)(en-resource://database/5309:1)]
3、再把提示信息打出来,给玩家知道,正在更新,不然以为卡死了
4、再初始化下载管理器信息, 如需要下载的总大小,当前已下载了多少,下载的速度等等。这些信息都清零[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
5、再调用线程去下载先停止:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
再开启下载的线程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
启用最多六个(自定义)线程数去进行下载,并将它们放到线程池中进行管理[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
有了请求后,先放入下载队列中。并在线程中,去从请求队列中拿出来,再调用。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRfqwbSh-1652254645448)(en-resource://database/5319:1)]
再组装每个下载的请求的参数:如请求的url链接、超时数、协议类型、请求的方式(Get or Post)等。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
GET 与 Post区别
GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST没有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbJM4Jiv-1652254645450)(en-resource://database/5323:1)]
通俗来说, Get用于请求与查看服务器资源, Post用于修改服务器的资源
7、校验MD5以核对同一资源
下载完成后,对其计算MD5值,并与下载的数据中对应的md5计算,做校验, 如相等,说明是同一个资源。成功。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxoPgsR7-1652254645451)(en-resource://database/5325:1)]
8、上一步是下载在内存中了, 现在将下载的资源,写入到本地
怎么写入呢?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZV1JOds8-1652254645452)(en-resource://database/5327:1)]
先获取他需要写入的路径, (不同设备,有固定写法,通常在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、下载如失败则重试
再在资源服务器中,依次读取下载完成队列, 并最终检查结果,如果发现改资源下载结果是未成功的,且重试次数小于最大可重试的次数, 就将重试次数累加一次,并再对其开启一次下载。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eqDx7qeF-1652254645458)(en-resource://database/5337:1)]
下载成功后移除队列
如果发现资源是下载成功的,则开始调用该资源的“下载文件完成时的回调函数”, 并将这条信息移除队列[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rr7fzQa0-1652254645459)(en-resource://database/5339:1)]
这里“下载文件完成时的回调函数”,是具体有哪些可能的作用?
成功后移除回调
每次资源下载结束后,还要在下载结果中判断,是否成功,未成功的话, 将“全部下载完成的回调“置空。(也就是,有一个失败,就算全部失败)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nx2032tI-1652254645459)(en-resource://database/5341:1)]
12、最后再释放掉 这个http请求(节约内存)
13、注意:这些操作都需要加锁。
什么是线程锁?
比如同一个文本,你打开的时候看到里面写的”123", 然后你在后面加个4,再保存, 你以为这个文本变成了“1234"。但其实同一时间,别人也打开了这个文本,他可能改成了“321”,并且可能是在你之后保存的, 所以就会导致最后的结果不是你想要的“1234”。这时候加以加锁,当你在操作它的时候,就锁住,别人无法操作。 至少保证你操作完的结果,是你想要的。
到这里,结束了更新的前期预备工作。
14、再开始 移动设备的配置请求。根据 不同渠道、操作系统、本地版本、等级、sdk等级、服务器id、和app版本,发送请求php信息。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipABXppS-1652254645460)(en-resource://database/5343:1)]
[EngineKeyPath]>>>>>>>>StartMobileConfigReqGet:url http://xxxxx.com/mobile_config_api/mobile_config_3d.php?ditch_name=222&os_type=windows&local_res_version=10460&level=40&sdk_version=222_v3&channel_id=&app_version=
15、开启协程,来发送请求[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAq18ymP-1652254645461)(en-resource://database/5345:1)]
再使用 unity下载方法下载:UnityWebRequest[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjzQLJKc-1652254645462)(en-resource://database/5347:1)]
aa 使用UnityWebRequest,发送Post请求
UnityWebRequest.Post(requestData.Url, requestData.PostForm);
bb 使用yield return,等待信息返回的结果
yield return webRequest.SendWebRequest();
cc 使用isDone,判断下载是否已完成。
webRequest.isDonedd
下载完成后,接收数据,
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启动
PhpNet:Instance():RequestHttpGet(whole_url,false,get_params,{},back,1)[2022-04-26 17:45:31] Lua (Info): [LuaKeyPath] DeviceLogPhp request start_lua http://xxxxx//api/client_lost_rate.phplua端重调网络属性NetManager:如lua连接超时时间,lua连接超时重试次数, setUrl, setIsPost等lua调用c#的异步Http请求[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uRTbnH5-1652254645484)(en-resource://database/5393:1)]
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计算适配
ScreenTool:Instance():CalculateAspect()
lua调用硬件信息初始化 --硬件配置信息初始化
HardWareQualitySetting.New()
GameNet.New()
ua调用c#,初始化网路
角色信息初始化,登录平台信息,合服记录数据,服务器列表,角色信息,登录场景信息等
UserInfo.Init()
获取登录平台信息(通过launch)
合服记录数据
平台登录信息
服务器列表
登录服务器信息
登录场景信息
角色信息
当前是否处于创建角色中
上一新创建的角色ID
lua状态机启动
GameLoop:Instance():Start()
进入-----初始化状态类------ 流程,
进入该状态,加载用户之前对音乐、音效的设置,及音量大小,音量开关的设置,并应用这些设置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
https://blog.csdn.net/qq_21407523/article/details/114297309
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUf6L8k7-1652254645491)(en-resource://database/5523:0)]
打开选服界面后,界面加载完成时,自动调用设备唤起SDK
DeviceArouseSDK,
从配置文件中,判断当前是否sdk登录,是的话,调用拉起sdk的登录界面
self.is_sdk == "1" then --普通SDK登录[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTRZTLot-1652254645491)(en-resource://database/5413:1)]
否则的话,判断为内部登录,直接调用SDK成功的函数,
保存用户的Cookie,
设置登录的状态等。
读取cookie,如果已有,直接自动填充用户信息,
再点登录,后面就可以进游戏了。
结束。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVkry5eX-1652254645492)(en-resource://database/5415:1)]