记录工作中做的功能和优化
战斗
战争大师和鸽子队的技能、强化重做
根据测试结果反馈,修改了部份小队的强度,战斗时,每个单位自身保存着自己的属性和Buff队列,强化则是通过添加Buff或者修改Buffer数值来对属性值进行修改,Buff有时间属性,在自定义的BuffTimeMax外之外的时间都为限时buff。战斗的触发则通过生成对应的Bullet,Bullet根据是否为远近战,控制位置。近战则根据对应的位置生成Bullet,通过碰撞检测去获取攻击的单位,执行伤害扣除指令
红点系统
整个结构为树状,比如背包为
Backpage-
Backage-Box
Backage-Item
Backage-Skin
Backage-Chest
对于具体的项,跟通过字符串拼接的方式,绑定在对应节点下,游戏启动后获取对应数据,构建整个树,初始化节点的状态,当子状态发生变化时,通知上层改变,上层根据自身有没有变化来决定是否通知上层层级。UI实例在显示时通过数据获取状态。数据对实例有引用,改变红点时通过修改数据来实现对实例的改变。
战争迷雾
沼泽图,美术希望有一层动态的迷雾笼罩着整个场景,同时边缘有稀薄到浓厚的过渡,最开始考虑的是先把每个地块的坐标传递给computeShader,然后computeShadery按照坐标画圆,最后通过pcf等方式过边缘过渡。后面美术认为圆形不满意,要求是方形,pcf实时跑效率也很低。于是采用了后面的方案,urp2d的light2d组件会根据指定的点,生成一个网格,通过调整参数可以得到一个软边缘的渲染效果。我通过这种方式针对地块烘培了相关网格挂在地块下,设置层级为摄像机不渲染的层级。渲染时将这部份网格绘制到rt,并作为一张image的source,方便测试;参数的修改会修改网格的uv,渲染时通过 _FalloffLookup 去获取对应的透明度
1 |
|
增加立体感
对于海面地块,单纯的图片会显得没有立体感,使用上面优化阴影的方法,同样绘制到一张rt图,并根据陀螺仪来做uv偏移,海洋平面采样这种rt图的阴影结果
击杀表现
对于战斗结束后,希望能聚焦最后作战的单位,并压暗其他
实现方式,战斗结束时,将最后作战的两个单位根据y轴排序后,绘制到rt中,rt降分辨率会有明显的锯齿问题,因为还有拉近视角的需求
给普通的图片添加光照效果
在玩棕色尘埃时,发现里面的手绘风地面是有做光照运算的;拆包对应资源并简单写了个光照模型,跟美术聊了下认为游戏是偏卡通风格的,没有相关的需求后没有继续推进
LUT
美术希望在部份场景通过调色,通过lut可以实现,先截一个正常的游戏场景图给美术,美术在psd中进行调色,psd文件中同时放一个没有做修改的lut图,美术调色完后,将lut发给程序后就可以实现lut;BIRP下,部份设备不支持 B10G11R11_UFloatPack32 ,会导致黑屏,URP中才对此做了处理
1 |
|
色彩分离优化大图
项目中一个ui动效使用了三张图的单个通道,来做出波浪的效果;代码中实际上只使用了单个通道,将这三张图的单个通道保存到一张图后,只存在一张图的内存开销,效果不变
OpenCv对于图片的RGB三色通道的提取与合并
Spine和GPUAnimation
在两百个单位的情况下,开销差别不大,如果使用GPUAnimation还需要额外拓展动画播放结束后的处理;所以依旧使用的Spine动画
合批优化
Spine子物体下有一个sprite作为假阴影,在渲染时会打断合批
模仿shadowmap的做法,将sprite假阴影指定为特殊的层级,通过commandBuffer的方式绘制到一张降分辨率的rt图中;参考
奇数负缩放打断合批
因为是2d游戏,所以在scaleX改变时,同时改变scaleZ