2D游戏中,角色预制体Image和Sprite怎么选择?
选型的时候搜了一下,Sprite更优,本来决定用Image的这样方便UI血条什么跟随不需要自己单独写代码了,但是发现Image对于帧动画支持并不好,需要手动SetNativeSize,感觉不如Sprite。以下是抄来的:
1.首先分析下两者的异同。
使用上,两者区别不大,都是使用一个Sprite源进行渲染,而Image需要位于某个Canvas下才能显示出来。场景中的Sprite可以像普通的3D游戏物体一样对待,通过Transform组件进行移动等操作,而Image则使用RectTransform进行布局,以便通过Canvas统一管理。由于RectTransform可以设置大小、对齐方式等,Image可以说更加方便一点,这也是很多人选择使用Image的原因。
渲染上,Sprite使用SpriteRenderer组件渲染,而Image则由CanvasRenderer组件渲染。两者在视觉上没有任何区别(都使用默认材质时)。它们默认的渲染也都是在Transparent Geometry队列中。
而在引擎的处理上,两者则有很大的不同。将Wireframe选项打开然后在场景中观察,就可以清楚地发现 ...
战斗同步思考(未完)
需求拆解战斗同步1.战斗同步有2种模式,一种是离线验证模式,在本地记录操作帧和随机种子,发送到服务端,再重新演算战斗逻辑;另一种是同步模式,客户端只转发操作帧,由服务端下发真实操作帧。服务器成本原因,优先实现第一种。
2.结果验证
3.掉落验证
战斗流程1.实现战前匹配(可以是玩家也可以是Boss)、匹配成功后在服务端对所有玩家建立房间,下发开始。房间用状态机管理。进入房间后,启动倒计时,超过设定的最长战斗时长(10分钟)就判定失败,战斗视为失败,服务器回收资源。
2.从第一回合到最终回合,每一个回合的内部,进行回合触发时机的执行、行动优先级的判定、技能逻辑的执行、存活死亡的结算、战斗胜负的判定这几个程序步骤。
技术实现伪随机1.PRD算法
这是伪随机在游戏中最常见的用法,因此直接就被玩家用Pseudo Random Distribution的缩写PRD来指代了。
在WAR3中,一个暴击率20%的英雄,并不是每一刀都20%暴击率的。而是以5.57%作为初始暴率,如果第一刀不暴,则第二刀的暴率增加到初始值的2倍:11.14%;如果还是不暴,就继续增加到初始值的3倍:16.71%,以此类 ...
Unity中如何把RGB图和Alpha图分离的图片还原
Unity中如何把RGB图和Alpha图分离的图片还原一.RGB图、Alpha图简述RGB图RGB图是指由红、绿、蓝三个基本色光按不同比例合成的图像,是最常见的彩色图像。RGB图像的每个像素点由三个通道的颜色值组成,通常用三元组(R,G,B)表示,其中R表示红色通道,G表示绿色通道,B表示蓝色通道,三个通道的值均为0-255之间的整数。
Alpha图Alpha图是指一种用于描述图像透明度的图像格式,通常用于PNG格式的图像中。Alpha图像的每个像素点也由一个通道的值表示,通常用A表示,取值范围为0-255,0表示完全透明,255表示完全不透明。
二.为什么需要拆成2种图打包?1.ETC不支持透明通道ETC是一种Unity支持的贴图压缩格式,用于安卓设备,不过目前不支持ETC2的已经少到可以忽略了。
ETC:不支持透明通道,被所有 android 设备支持
ETC2:支持透明通道,Android 设备的 GPU 必须支持 OpenGL es 3.0 才可以使用,对于不支持的设备,会以未压缩的形式存在内存中,占用更多内存
PVRTC:所有苹果设备都可以使用,要求压缩纹理长宽相等,且是 ...
Spine安装和简单了解、导入unity
1.首先简单了解下spine导出的东西是什么。spine导出的文件会有3个:png图集、atlas图集切分文件、记录骨骼、动画的一个二进制skel文件 或者 一个json文件。
2.要把spine导出的文件导入进unity,只要事先在spine-unity页面下载好对应的 spine-runtime unitypackage就可以。注意这个版本卡的特别死,unity版本和spine导出版本是必须严格遵照要求的,具体看页面。安装好对应的package之后,需要先把atlas后缀加上.txt,再给二进制文件skel加上.bytes,json就不用改了,然后直接复制粘贴文件到unity里就会自动转换。
3.在这里记录一个大坑,众所周知 Spine3.8.75 这个版本是网上能找到的破解版本。所以Spine直接在自己的 3.8版本unity runtime里,特别在2个地方写了一行:
12if ("3.8.75" == skeletonData.version) throw new Exception("Unsupported skeleton dat ...
书籍笔记 - 程序是怎样跑起来的(硬件软件交互理解)
CPUCPU可直接执行的“机器码”,到底能处理什么?简单来说分为4种,
数据传送指令:用于寄存器、内存、外围设备之间进行数据读写的操作。也就是读写操作。
运算指令:用累加寄存器执行算术运算、逻辑运算、比较运算和位移运算。
跳转指令:实现条件分支、循环、强制跳转等。其实就是个goto。
call/return指令:函数的调用 / 返回调用前的地址。和c#的函数栈桢展开是类似的。
二进制数如何在硬件层面理解二进制、bit、byte?像计算机的CPU和内存都是IC的一种,IC就是有很多引脚的集成电路,而每一个引脚的状态只有直流电压0V和5V,这两种。因此计算机的信息只能转化成二进制。
而**位(bit)**这个数据结构,就刚好对应了这个规律。
**字节(byte)**则是8个bit,因为内存和磁盘都是用字节为最小单位来存储、读写数据的,所以用位bit不能直接读写数据,所以都会在高位补0实现bit转byte。
而一个CPU有32位,就意味着它有32个引脚来处理信息的输入和输出,也就是说一次可以处理32位的二进制数信息。
为什么计算机内用补码来存数?(比如-1是11111111而不是10000 ...
TCP、UDP的区别
什么是TCP、UDP协议,他们都只工作在传输层。
什么是TCP的挥手、握手三次握手、传输确认、四次挥手。
三次握手:建立连接用的。客户端发起请求给服务端,服务端返回消息给客户端发番号,客户端再发送请求给服务端,完成连接的建立。
为什么需要第三步?为了解决网络信道不可靠问题。第一个请求包阻塞了,所以客户端重新再做了第一步成功建立了连接,此时之前的那个阻塞包又恢复了,此时如果没有第三步服务端就会成功建立第二个连接。
传输确认:一包数据可能拆成多包发送,如何处理丢包问题?这些包的到达顺序不一定,如何处理乱序问题?答案是通过回复确认包。
这个根据下图模型理解。首先TCP会在建立连接之后,会创建如下的发送缓冲区。每次发送报文时,除了数据内容,还会在TCP协议头中附带本次数据内容的序列号(起始下标)+长度。接收端收到这个包后,会进行回复确认,内容为序列号+长度,也就是下一包的其实序列号。这样做是为了能够把整个包根据序列号和长度重组,中间遇到丢包的情况申请重发即可。
四次挥手:结束连接用的。
一、二挥手:客户端发送结束包给服务端;服务端返回一个包表示自己进入终止等待状态。这前两次挥手完之后,服务端 ...
工具篇:代码热更新
非常感谢 HybridCLR(代号wolong) 的作者walon大佬。
初识HybridCLR简介能够不写lua,简直就是神。
HybridCLR : github
HybridCLR li2cpp plus : github
HybridCLR示例项目 : github
手册:github.io
HybridCLR 由两部分构成 il2cpp_plus 仓库 (opens new window)和 HybridCLR 仓库 (opens new window)。il2cpp_plus 仓库基于 unity 原始 il2cpp 作了少量修改(几百行),使得它可以支持动态注册元数据,进行可以动态加载 dll。HybridCLR 仓库是 HybridCLR 的核心源代码。
HybridCLR的安装基于这两部分,安装有一定的版本规则。具体见支持的 Unity 版本文档。
配置第一个Unity项目搭建环境Unity版本2020.3.7
拷贝HybridCLR li2cpp plus项目中的libil2cpp文件夹 到对应版本Editor的Editor\Data\il2cpp文件夹下 ...
Games101 - 渲染管线、Shader、Texture
图形渲染管线图形渲染管线 Graphics (Real-time Rendering) Pipeline
Graphics Pipeline前面学的流程串起来,就是下图。里面还涉及到了 Shader 和 Texture Mapping 的时机。
Shader一般指 Shader Programs ,是一个程序,会对一个像素点/片段进行处理、着色。可以用OpenGL的语言写,也就是GLSL。
在线shader测试:http://shadertoy.com/view/ld3Gz2
shader展示:https://youtu.be/XuSnLbB1j6E
纹理映射 Texture Mapping前面已经知道,每个像素点的漫反射系数kd乘以光照强度,会得到该像素点最终的颜色。显然,每个像素点的漫反射系数是由物体本身的颜色属性来决定的,而这个像素点的颜色属性我们会通过一张材质图来确定。这就是贴图。
uvuv坐标是指纹理展开后,纹理上的坐标。u和v的范围,都定义在0-1之内。
纹理前面已经学了,三角面内进行插值着色,是用重心坐标来计算出任一个点对应的uv贴图坐标的(也就是决定漫反射系数k) ...
Games101 - 着色
目前为止我们学会了什么?
相机和物体 -> 变换坐标到原点 -> 拉伸后映射成2D图像 -> 对2D图像进行光栅化:滤波、采样、后处理,最终变成屏幕上的像素点
现在我们引入着色。
着色 Shading什么是着色?着色在普世意义上,是对明暗、颜色进行绘制。
而在图形学中,着色是一个对物体应用材质的过程,正是材质的不同才导致颜色不同。
理解一个简单的着色模型Blinn-Phong Reflectance Model 是一个常用参考的光照反射模型,它分为以下:
高光 Specular highlights:一根光线打到光滑平面(比如镜面)上,会往镜面反射附近去反射。
漫反射 Diffuse reflections:一根光线打到粗糙平面(比如墙面)上,被反射到各个地方的情况。图中茶杯从浅黄到深黄的变化。
环境光照 Ambient lighting:是由间接光源组成的光源统称。图中光线并没有直接打到箭头处,而是打到桌面上被反射,反射光再打到了箭头处。
开始前先定义一个“着色点” shading point虽然反射到的面有曲面、有直面,但我们只观察一个最小的反射点,那么曲面的 ...
Games101 - 光栅化
学之前你必须知道视锥这是透视相机的概念,用来衡量视距的大小。一般用2种属性来描述一个视锥:
near面的宽高比
垂直视角 Vertical Field of View
有了上面2个确定值,然后再自己定义一个near的值(近平面与相机的距离),就能确定成像了,视锥完成。
屏幕上的概念分辨率,也就是1080p、2k等,就是像素的多少。
屏幕 Raster,德语中的屏幕的意思,而屏幕是一个光栅成像设备。
光栅化 Rasterize,把东西画在屏幕上的过程。
像素 Pixel,全名picture element,是最小单位的小正方形,它的颜色由Red、Green、Blue三个色(0~255)来混和成。
屏幕发展过程过去方式
示波器
阴极射线管 Cathode Ray Tube:和示波器原理相同,用很多电子打在屏幕上。通过扫描一样的方式,一条一条画横线,组成图像。
隔行扫描 Raster Scan:上面的画横线,优化的话还会在一帧只画1、3、5…奇数行,下一帧再只画偶数行。这样省去了一半的工作量,也能一定程度欺骗到肉眼。
现代方式
液晶显示器 LCD(Liquid ...

