DA项目技术小结

最近一直在忙的项目终于要在海外进行付费测试了,抽空小结一下用到的技术要点。

项目是基于Unity Tilemap-Isometric的2D休闲养成游戏,场景装饰物是Sprite和Spine,角色则是3D的。

1. 地图地表采用了类似《魔兽争霸》的地表纹理八方向自动拼接方式,产品可以直接通过画刷进行绘制而不用手动处理拐角问题。效果和算法参考了:https://www.cnblogs.com/sifenkesi/archive/2011/03/03/1970051.html。

2. 地图海水效果参考了一些竞品的Shader,暴力用GPA和AdrenoProfiler抓帧分析渲染方式,随后对Shader进行修改调整,最终效果只能说差强人意吧。抓帧相关内容可以看:https://blog.csdn.net/ZhangDi2017/article/details/100069880。

3. 为了让3D角色和2D场景进行正确的遮挡穿插,仿造《部落冲突》的方式,先将角色渲染到RT上,再将RT作为2DMesh的材质贴图,这样可以通过调整SortingGroup就实现和2D场景的穿插关系。《部落冲突》的渲染方式可以看:https://blog.csdn.net/ZhangDi2017/article/details/103742707。

4. Spine的动画会在每帧进行更新,哪怕动画只用1帧。Spine动画的Update包含大量的数学计算,占用很高的CPU,因此要对Spine进行优化,一个很有效的方法就是判断动画是否只有1帧,如果是则播放后立刻禁用动画组件。考虑到有些Spine动画不在屏幕内,可以将出屏幕的Spine动画暂停。

5. 3D模型在Tilemap-Isometric模式下的显示问题。需要调整3D模型父物体的角度,以便在统一3D模型和Tilemap的x-y坐标。算出来是一个直观上很难理解的欧拉角:Vector3(335.9052f, 50.76849f, 333.4349f)。这个角度便是将正方体视觉上调整为正六边形的角度。

6. 游戏逻辑方面,实现了一套剧情脚本系统和一套触发器系统。剧情系统把动作拆分到原子级别供产品去调用,比如移动角色、缩放镜头、播放特效等,线性执行,通过等待时间来控制一些异步操作如等待角色移动到某位置。触发器系统则仿造了《魔兽争霸3》的触发器系统,每个触发器分为事件条件和动作,游戏逻辑会抛出各种事件如当角色进入某区域,这时相关触发器会检查是否满足条件,如果满足条件则开始执行动作。

7. UI动画方面,2D游戏UI动画还是很重要的,项目基于DoTween实现了一套动画编辑系统,基本思路是将各种动画类型拆分到原子级别让美术同学自行组装出复杂的动画效果。例如:奖励物品先从小放大缩放掉出,停顿一会儿,按贝塞尔曲线飞到背包图标的位置,接着背包图标缩放弹性一下,最后播放音效。这套系统使得动画不需要程序来硬编码,美术可以完全掌控动画效果。

8. 最后推荐一下项目采用的脚本语言,C#实现的虚拟机,我们客户端主程大佬自行研发。链接:https://github.com/qingfeng346/Scorpio-CSharp。比Lua内存占用小,调用C#时比Lua速度要快。语法缺什么可以自己实现。比如C#的语法糖:delegate?.Invoke(args),我们在脚本里则实现了更为简洁的语法:delegate?.(args)。值得一提的是,我们游戏逻辑部分没有Tick,靠的是各种Timer,游戏脚本也不需要gameObject.transform.position = xxxx这样冗余的访问,大部分常用功能都在C#里面封装好了,比如Util.SetActive(obj, false1),obj可以是很多类型比如Image、Transform,C#这边会取obj对应的GameObject,进行容错处理等等,这样的做法好处是大幅减少了脚本对C#的反复冗余调用,让脚本真正的发挥脚本语言的胶水作用。

等项目正式上线再补一下游戏截图。

最后感慨一下,项目虽小,也是五脏俱全,开发期间既要把控研发进度,也要兼顾性能问题。另外也要重视各种自动化生产工具和检查工具,通过这些工具制定程序、美术规范来保证产出内容的合格性,及时发现问题,减少后期返工的可能。

你可能感兴趣的:(Unity)