游戏是一门复杂的艺术与技术
Start(Unity生命周期问题)常见如: Awake OnEnabel Start Update(每帧调用) FixUpdate(固定帧调用) OnMouse OnTirgger(触发器) OnCollision(碰撞器) OnDestory OnDisable OnApplication等GameObject maingame =
GameObject.FindWithTag("MainCamera");
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C5HICson-1652254645326)(en-resource://database/5179:1)]
什么是协程?程和线程、进程类似,但不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
比较协程和线程。
多个线程相对独立,有自己的上下文,切换受系统控制;
而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
–知乎1.协程解决了什么问题?协程属于异步编程的范畴,在这个领域内我们来比较一下他“竞争对手”们。
回调函数: 他的机制很简单,但是他的一个弊端就是把代码切分成很多个函数中,尤其是你回调里套回调,一个逻辑上的流程被切分成零碎的很多处代码,容易把人给绕晕了。
多线程:协程和线程一个很大的区别就是,线程是在OS层面支持的,而协程是在用户态层面实现的。线程的执行,什么时候被切出去,多个线程的执行顺序和抢占我们是无法控制的,所以需要引入一些锁的机制来保证协作运行。
而协程不一样,那些东西会一口气执行完(这里指不会被其他协程打扰),什么时候交出执行权挂起,程序员都很精准地控制。
所以总的来说,协程有两个特点:逻辑清晰,执行可控。
一提到”异步“, 在很多开发场景里想到的都是I/O等各种阻塞。但因为游戏开发场景,unity的协程还用另一类比较常用的情形:跨越多帧,多时间点的流程写进一个函数. 举个例子就是补间动画每一帧移动一点点,或者一个ui动画先停几秒播这个再过几秒播那个… 看一下unity协程支持的yield return的迭代器,大多都是和时间,帧有有关的(比如null,waitForSeconds…)简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换
编程建议
如果几乎是每一帧都yield null,别写协程了,直接把代码放进update,lateupdate这种回调里。这可读性更强,因为update回调就是干这种事情的。
嵌套的协程,会带来更多的内存开销(下面的实现原理会说)。 但是嵌套的协程很多时候会让流程更清晰可读,所以自己权衡啦。
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)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPbsjjoz-1652254645333)(en-resource://database/5185:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0E87pMA-1652254645335)(en-resource://database/5459:2)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AoHT5xej-1652254645336)(en-resource://database/5461:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SszepAZe-1652254645337)(en-resource://database/5189:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2y2rN1We-1652254645338)(en-resource://database/5191:1)]
Template模板、GUI模板DontDestroyOnLoad(GameUIManager.m_Instance.m_GUI); 设置不销毁GameUIManager.m_Instance.m_GUI.localPosition = new Vector3(-2000, -2000, 0); 设置位置在屏幕外因为切场景时,加载资源的对象不应被销毁
增加UGUICamera组件初始化相机参数[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tN42cfaF-1652254645342)(en-resource://database/5193:1)]
如cullingMask: a This is used to render parts of the Scene selectively. 只渲染UI层, (因为是UI类型游戏)
b orthographic = true 设置正交模式 正交模式、透视模式(近大远小)c this.m_CurrentCamera.clearFlags = CameraClearFlags.Depth;How the camera clears the background.Clear only the depth buffer. 只清理深度缓存 (记录了深度信息)会保留前一帧的颜色或以前显示的任何内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jllfBme-1652254645343)(en-resource://database/5463:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUer0NRq-1652254645345)(en-resource://database/5195:1)]
什么是深度缓冲区?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
时,物体会被渲染出来。
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)]
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 支持
可影响游戏对象的光源数量没有限制
所有光源都按像素进行评估, 这意味着它们都能与法线贴图等正确交互所有光源都可以有剪影和阴影。
g:this.m_CurrentCamera.allowHDR = false;
High dynamic range rendering.
高动态范围 (HDR) 技术能够产生比标准动态范围 (SDR) 图像更高的亮度动态范围的图像,可以对颜色和亮度进行逼真的描绘。
在标准渲染中,像素的红色、绿色和蓝色值均使用一个 0 到 1 范围内的 8 位值进行存储,其中 0 表示零强度,1 表示显示设备的最大强度。
这一有限的数值范围无法准确反映我们在现实生活中对光的感知方式,并且当存在非常亮或非常暗的元素时,会导致图像不真实。
在 HDR 渲染中,像素值使用浮点数进行存储。
这种情况下允许更大范围的值,可以更准确地表示人眼感知颜色和亮度的方式。
主要用来支持发光效果, 如火焰、太阳照射反射等Unity 会将场景渲染到 HDR 图像缓冲区,并使用该 HDR 图像执行渲染操作
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 属性的摄像机,将会对数据执行查询以确定该摄像机可以看到的内容。
请注意,启用遮挡剔除后,摄像机将执行视锥体剔除和遮挡剔除。
i: this.m_CurrentCamera.allowMSAA = false;
MSAA rendering.
是否启动此技术。
Multisample anti 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(超采样反走样)以一个更大的分辨率来渲染场景,然后再把相邻像素值做一个过滤(比如平均等)得到最终的图像提高了采样率,提升了画面。
但它需要更多的显存空间以及更多的着色计算(每个子采样点都需要进行光照计算),所以一般不会使用这种技术
原理:多重采样反走样只计算每个像素的颜色,而对于那些子采样点只计算一个覆盖信息(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)]
Element that can be used for screen rendering.渲染屏幕
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.
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)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXpiQLgH-1652254645387)(en-resource://database/5237:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FW52pR0W-1652254645388)(en-resource://database/5499:0)]
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)]
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翻转了, 是否接收射线
CalculateAspect[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqOytALV-1652254645391)(en-resource://database/5243:1)]
根据真实设备的比例,与UI制作的标准比例,去计算一个比值,来决定是要按高还是按宽去适配。
比如两个分辨率,都用宽/高, 如果设备的值比UI的计算值小,则说明不是比较宽的手机,所以按高度适配。
否则按宽度。
原则是:高手机用高适配,宽手机用宽适配。
之后各种节点挂在到这个上面
a-- AddComponent
作用: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)]
b—AddComponent
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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.鼠标、键盘、手柄, 去配置输入设备的参数。
a\ InitTypeTraits 初始化各种类型
UIHelper.doLuaString = Singleton
在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)]
b\ InitStackTraits 初始化委托特性,
用于lua与c#交互[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4pwajH4-1652254645397)(en-resource://database/5251:1)]
c\ lua状态机类的初始化LuaNewState
获取lua委托 doLuaString(), 用于执行lua文件
用来给游戏资源上颜色,表达出他们需要的外观,无论是文字、UI、模型、特效等全部需要显示的游戏资源,都需要使用着色器上色。
比如显示出什么颜色、每个顶点显示的位置、每个片元的颜色、是否半透明、是否接收光照、是否投射出阴影、能否被遮挡、采用什么样的光照模型、是否抗锯齿、以及屏幕后处理等等,
每个对象物体,需要到哪个层级。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)]
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执行
engineconfig_debug.lua里面的配置,主要有引擎相关的,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1HleQPTH-1652254645404)(en-resource://database/5259:1)]
比如
lua文件的路径,
是否打印lua日志,
是否打印日志到提示框,
是否打印引擎日志,
是否将日志输出到log文件,
是否上传lua , c#异常,
是否打印日志到服务端、
服务器的端口配置多少、
是否显示更新提示、
资源下载超时的时间、
下载后是否检查md5等等fps设置多少等,
是否显示机器人,
是否开始翅膀,将上一步的配置,应用出来
//允许ios使用序列化属性
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");作用:保存文件时需要。
每个游戏资源的 大小、版本、md5码
ServicePointManager.DefaultConnectionLimit = 50; 默认连接限制数
string path = "pack/rawpack/local_res.json";先读取二进制, 再转为string (json格式), 将json转为类对象 (对象包含 大小、版本、md5)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTgPVP7g-1652254645408)(en-resource://database/5261:1)]
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.AddMemoryPressure(10 * 1024 * 1024); //大于10M时,进行回收, 以免被GC回收通知运行时在安排垃圾回收时应考虑分配大量的非托管内存。1M=1024KB 1KB=1024Byte
,(如刘海屏手机,超过留黑底)如iphone刘海屏之类的,
(什么是刘海屏, 水滴屏等), 会导致游戏画面被刘海遮挡
就是提前计算好游戏主界面的大小,保证游戏的显示画面不会被遮挡计算方式:比如在超出某个比例的部分,全部用黑色背景遮盖。
比如手机是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,达到进度条动画增长的效果。
然后在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)]
用于在其它任意位置,静态调用加载游戏所需资源赋值完后,把主委托置空,释放内存
比如更新框中的“加载中。。。”,可以任意改成其它的“游戏正在加载。。。”,
“进入游戏中。。。”,可以改成“游戏马上开始。。。”等。
以及文字的颜色等,都可以配置修改
:用配置项的方式,可以动态调整游戏内容,而不用修改代码。
使项目更不容易出错。且可以实现一套代码, 应对多套产品的需求。
调整特效动画b\ 对加载动画的特效,
使用 DoTween插件, DoLocalRotate 360度 1.5秒, 和 -1, 表示循环播放,
自身1.5秒旋转一周动画特效处理完, 将总进度赋值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGmg1vKK-1652254645420)(en-resource://database/5277:1)]
然后进度条逻辑中判断,进度条当前大于0.05时,才赋值到0.05,以免超过了。
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
b\ 平台消息句柄器, 用来提供各方sdk平台进行通信
如语音平台、回调系统等
c\ 对lua初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GV7yp8Lu-1652254645421)(en-resource://database/5279:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFrKg7rU-1652254645424)(en-resource://database/5517:0)]
开启两个线程数, 每个容量为4096 Byte 字节数,
用于在进行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\ 更新异常状态
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sq9Y15a2-1652254645430)(en-resource://database/5287:1)]
在状态机的执行中,需要进行检查的逻辑判断[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbyc6QOz-1652254645431)(en-resource://database/5289:1)]
五重判断:
1、状态机是否为空?
2、不为空的话, 是否当前已经在当前状态机中?
3、是的话,当前状态机是否能重进?
4、如果能重进的话, 需要先退出当前状态机,再进入当前状态机
5、如果当前不在状态机中,则可直接进入状态机
设置进度End 为 false[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYOXGZ8O-1652254645432)(en-resource://database/5291:1)]
然后在while循环中,不断地根据时间的流逝的累计,设置进度条的缩放,达到流畅的进度条增长动画效果。并持有这个增加量。
当增量的总量达到1时,即100%进度。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8MhJ5Ou-1652254645432)(en-resource://database/5293:1)]
在此状态()的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);
ToFirstTimeGame
主要逻辑:
//看是否第一次进入游戏
//如果是第一次进入游戏的话将版本号跟资源等级都写到数据库里面 sqlite
:如何判断你是不是第一次点进来呢?
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
正在发送更新请求
如果需要请求(如appStore),但又没网,就要提示报错了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KOWdzRR0-1652254645442)(en-resource://database/5307:1)]
GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST没有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbJM4Jiv-1652254645450)(en-resource://database/5323:1)]
通俗来说, Get用于请求与查看服务器资源, Post用于修改服务器的资源
下载完成后,对其计算MD5值,并与下载的数据中对应的md5计算,做校验, 如相等,说明是同一个资源。成功。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxoPgsR7-1652254645451)(en-resource://database/5325:1)]
怎么写入呢?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZV1JOds8-1652254645452)(en-resource://database/5327:1)]
再在资源服务器中,依次读取下载完成队列, 并最终检查结果,如果发现改资源下载结果是未成功的,且重试次数小于最大可重试的次数, 就将重试次数累加一次,并再对其开启一次下载。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eqDx7qeF-1652254645458)(en-resource://database/5337:1)]
如果发现资源是下载成功的,则开始调用该资源的“下载文件完成时的回调函数”, 并将这条信息移除队列[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rr7fzQa0-1652254645459)(en-resource://database/5339:1)]
这里“下载文件完成时的回调函数”,是具体有哪些可能的作用?
每次资源下载结束后,还要在下载结果中判断,是否成功,未成功的话, 将“全部下载完成的回调“置空。(也就是,有一个失败,就算全部失败)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nx2032tI-1652254645459)(en-resource://database/5341:1)]
比如同一个文本,你打开的时候看到里面写的”123", 然后你在后面加个4,再保存, 你以为这个文本变成了“1234"。但其实同一时间,别人也打开了这个文本,他可能改成了“321”,并且可能是在你之后保存的, 所以就会导致最后的结果不是你想要的“1234”。这时候加以加锁,当你在操作它的时候,就锁住,别人无法操作。 至少保证你操作完的结果,是你想要的。
[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=
UnityWebRequest.Post(requestData.Url, requestData.PostForm);
yield return webRequest.SendWebRequest();
webRequest.isDonedd
是一种轻量级的数据交换格式。
简洁和清晰的层次结构使,
易于机器解析和生成,并有效地提升网络传输效率。
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)]
ScreenTool:Instance():CalculateAspect()
HardWareQualitySetting.New()
ua调用c#,初始化网路
UserInfo.Init()
获取登录平台信息(通过launch)
合服记录数据
平台登录信息
服务器列表
登录服务器信息
登录场景信息
角色信息
当前是否处于创建角色中
上一新创建的角色ID
GameLoop:Instance():Start()
https://blog.csdn.net/qq_21407523/article/details/114297309
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUf6L8k7-1652254645491)(en-resource://database/5523:0)]
DeviceArouseSDK,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVkry5eX-1652254645492)(en-resource://database/5415:1)]