Unity游戏开发经验点滴

Posted 海洋_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity游戏开发经验点滴相关的知识,希望对你有一定的参考价值。

游戏开发中会遇到各种各样的问题,只有经历过了才会深刻,这里就游戏开发的经验点滴给读者分享一下,下面先从代码说起。
从事IT行业这么多年了,写过或者看过很多代码,有的项目代码写的不错的,大家经过多年的努力都会从初级程序员到主程的发展,作为主程除了做架构设计,带团队外,就是审核代码,现在程序员写的代码,大部分都是只根据需求而写,游戏开发与其他开发最大的不同是需求经常变化,朝令夕改用于游戏策划一点都不为过。这就要求程序员再根据需求写逻辑时,多跟策划沟通,把一些可能发生的事情都考虑完整再动手写代码,即使这么做了,后期还会修改。所以作为逻辑程序员很难的。程序员能做的事情尽量减少自己的工作量,把代码设计的灵活一些,最好的方式就是采用数据驱动。

数据驱动

我在做端游的时候,项目经理说的最多的就是数据驱动,我们的逻辑是通过配置数据让其运行的,表的设计,这些就需要程序员跟策划协商沟通,每个表都有自己的唯一ID项,通过ID去查询数据,程序要做到,逻辑的增加只局限于几个文件,不要牵扯太多。切记在代码里面不能出现具体的ID号,这样一旦策划修改表项,你的逻辑就需要修改,看过一些代码把具体的ID号都写到程序里面了,这么做是非常不好滴,让人感觉不专业,非常业余,还有代码不加注释也是不能容忍的,这个是为了更好的传承,我们说一个公司的技术积累,这个积累也包括代码注释。
在程序启动时,关于数据表的加载问题,很多程序员的一些做法是:在程序启动时,把数据表一次性加载到内存,然后用到数据时再去一条一条查找。这么做可以不?答案是可以的,但不是最优方案,因为首先把所有的数据表一次性加载到内存中,会占用大量的内存,很多人见过的表可能不是很多,但是一旦表格数量很多,表格数据达到万行以上就是一个灾难啊,为了防止灾难发生,加载时就要有选择的去加载,当前场景用到的数据表加载进来,分步骤进行。再有一个问题是遍历数据,服务器大家如果了解过应该知道,它可以离线加载数据,而且可以一次性加载,查找数据不需要去每条遍历,这样提高了运行效率,这种方式客户端也可以使用的,优化要从一点一滴做起。

代码拆分

再说代码的编写,看过游戏开发的代码,动辄几万行,至少几千行。让新人阅读起来非常费劲,再加上没啥注释,看代码简直就是灾难。这种代码就需要重构了,怎么重构?很简单的,首先根据功能进行划分,类有一个修饰词partial,它可以将一个类拆分成多个类,类的名字可以根据功能进行命名,这样一旦扩充起来可以使用多个类文件表示,不用在一个类里面一直写,这样会导致代码非常庞大,函数的定义可以根据类的功能名字去划分。比如下图所示的:

资源打包

unity官方提供了一个打包工具,Assetbundle,我们可以将美术资源,音效,文本文件都可以打成Assetbundle,关于资源打包,我们还需要考虑依赖打包,因为很多模型都会彼此依赖,这个关乎内存的加载和释放。很多人打包并没有使用依赖打包,导致资源重复的加入到内存中,依赖打包还需要注意释放的先后顺序,这个可以通过引用计数的方式进行,另外,这个工具我们可以在此基础上进行扩充,比如加入版本更新的处理等等,效果如下图所示:

角色动作处理

随着Unity版本更新,大部分公司使用的都是Animator,采用AnimatorController控制器的新动画状态机去处理Unity的动作切换,使用这个的好处是,该动画状态机使用了FSM的封装处理,加入了动作的融合,另外,提供了Humandoid模式,不同的角色可以采用同一套骨架的处理等等,Animator作为Animation的替代品,Unity官方一直维护着,细节的东西,Unity引擎都为我们处理过了,我们只需要使用诸如SetTrigger,SetInteger这些函数接口调用就可以,另外还需要动作的帧回调函数,可以采用配置表的方式进行,不需要每次都是在动作上自己填写,一旦动作更换非常麻烦,因为Animator它会牵涉到一些矩阵变换,所以,在不需要的物体上切记不要挂Animator这个组件。因为Max导出模型直接放到Unity引擎时,会自动挂上,导致程序运行时帧率降低,所以可以写个工具检测一下,不需要的可以直接删掉。

Shader优化

Unity官方提供了一些Shader,这些都是最基本的,在开发高品质产品时基本用不上,在我看来,它只适合于学习,不适合做产品开发。Shader的编写其实我们不需要一行一行的代码敲,有几个插件可以使用比如:Shader Forge和Unity自身的Shader Graph。Shader Forge,它为了适配不同的硬件会使用D3D,OpeGL,Metal等等图形库,它做的是非常全面了,但是在android比较挑剔的情况下,我们是不需要的,可以把对应的#pragram 注释掉,这个也是一种优化方式,还有看一下Setpass call的数量,它也是Shader优化的一种方式,当然数据变量的精度也是需要考虑的,另外Shader中尽量避免判断条件语句和循环语句的出现,以及复杂函数的计算等等。
现在游戏品质要求越来越高,角色Shader的渲染,为了提升渲染效果,美术需要制作多张图片,普通的制作方式已经不能满足需求了,也就是通用的法线,高光,反射这些已经无法满足需求了,这就带来一个问题,当程序加载角色资源时,会涉及到大量的图片加载,这样的后果会导致实例化一个角色时间比较长,当然加载时间长也会有其他因素,比如一些废弃的面和动作没有删除掉,但是我们能够控制的是可以将多张图片进行优化,比如颜色有RGBA,我们也可以将贴图按照RGBA通道进行合并,这种方式比较流行。
后处理渲染效果,Unity提供的Post Processing Stack由于效率问题,我们一般会做一些优化操作,这个可以参考UE4的处理方式,可以将一些传统的算法优化,可以将UE4的移植到Unity里面。
贴图的优化可以使用国外提供的压缩方案:www.tinypng.com

特效制作流程

美术制作特效流程,很多特效人员对其执行的并不是特别好,其实非常简单,主要分以下几步:
第一步:一般的特效需要特效人员把特效制作好,按照原点的方式制作,不要产生位移;
第二步:特效名字是根据使用者命名的,命名规范要做好。
第三步:特效的挂节点通过配置表进行配置,然后程序动态的生成虚拟挂节点,这个事情可以由策划提供。
第四步:关于一些特效大招,比如有镜头的控制,一般是由特效人员去制作完成,当然动作这块可以进行配 合,也可以在MAX工具里制作镜头移动然后交付给特效人员使用。
第五步:特效制作完成后,需要策划跟动作一起验收,看是否满足需求,提出修改意见。
第六步:将角色和特效放到游戏实际场景中去看效果,这个需要程序配合,提出修改意见。

总结

游戏开发会涉及到方方面面,这里只是把项目中暴露的一些问题做了总结,以备查阅使用。

以上是关于Unity游戏开发经验点滴的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 动作游戏开发日志自动化扩展数据库

WEB开发经验点滴

Unity C# 游戏开发 事件 消息派发器(图文详细,带源码)

2019版Unity3d游戏开发学习指南

学unity游戏开发好找工作吗?怎么样?

游戏开发前景如何?