Unity3D游戏开发最佳实践20技巧(三)

本文详细介绍了游戏开发过程中的资源管理技巧,包括剧情文本的高效存储、本地化实现、日志系统优化、帧率计算器创建、截图与坐标打印快捷键、Debug选项配置以及命名规则与目录结构的最佳实践。


【文本】

38、如果你有很多的剧情文本,那么把他们放到一个文件里面。
不要把他们放到Inspector的字段中去编辑。这些需要做到不打开Unity,也不用保存Scene就可以方便的修改。
39、如果你计划实现本地化,那么把你的字符串分离到一个统一的位置。
有很多种方法来实现这点。例如,定义一个文本Class,为每个字符串定义一个public的字符串字段,并把他们的默认值设为英文。其他的语言定义为子类,然后重新初始化这些字段为相应的语言的值。
另外一种更好的技术(适用于文本很大或者支持的语言数量众多),可以读取几个单独的表单,然后提供一些逻辑,根据所选择的语言来选取正确的字符串。


                                                                                                                                                                       
【测试与调试】
40、实现一个图形化的Log用来调试物理、动画和AI。
这可以显著的加速调试工作。详见这里。
41、实现一个HTML的Log。
在很多情况下,日志是非常有用的。拥有一个便于分析的Log(颜色编码、有多个视图、记录屏幕截图等)可以使基于Log的调试变动愉悦。详见这里。
42、实现一个你自己的帧速率计算器。
没有人知道Unity的FPS计算器在做什么,但是肯定不是计算帧速率。实现一个你自己的,让数字符合直觉并可视化。
43、实现一个截屏的快捷键。
很多BUG是图形化的,如果你有一个截图,就很容易报告它。一个理想的系统,应该在PlayerPrefes中保存一个计数,并根据这个计数,使得所有成功保存的截屏文件都不被覆盖掉。截屏文件应该保存在工程文件夹之外,这可以防止人们不小心把它提交到版本库中。
44、实现一个打印玩家坐标的快捷键。
这可以在汇报位置相关的BUG时明确它发生在世界中的什么位置,这可以让Debug容易一些。
45、实现一些Debug选项,用来方便测试。
一些例子:
  • 解锁所有道具;
  • 关闭所有敌人;
  • 关闭GUI;
  • 让玩家无敌;
  • 关闭所有游戏逻辑;
46、为每一个足够小的团队,创建一个适合他们的Debug选项的Prefab。
设置一个用户标识文件,单不要提交到版本库,在游戏运行时读取它。下面是原因:
  • 团队的成员不会因为意外的提交了自己的Debug设置而影响到其他人。
  • 修改Debug设置不需要修改场景。
47、维护一个包含所有游戏元素的场景。
例如,一个场景,包括所有的敌人,所有可以交互的对象等等。这样可以不用玩很久,而进行全面的功能测试。
48、定义一些Debug快捷键常量,并把他们保存在统一的地方。
Debug键通常(方便起见)在一个地方来处理,就像其他的游戏输入一样。为了避免快捷键冲突,在一个中心位置定义所有常量。一种替代方案是,在一个地方处理所有按键输入,不管他是否是Debug键。(负面作用是,这个类可能需要引用更多的其他对象)


【文档】
49、为你的设置建立文档。
代码应该拥有最多的文档,但是一些代码之外的东西也必须建立文档。让设计师们通过代码去看如果进行设置是浪费时间。把设置写入文档,可以提高效率(如果文档的版本能够及时更新的话)。
用文档记录下面这些:
  • Layer的使用(碰撞、检测、射线检测——本质上说,什么东西应该在哪个Layer里);
  • Tag的使用;
  • GUI的depth层级(说什么应该显示在什么之上);
  • 惯用的处理方式;
  • Prefab结构;
  • 动画Layer。


【命名规则和目录结构】
50、遵从一个命名规范和目录结构,并建立文档
命名和目录结构的一致性,可以方便查找,并明确指出什么东西在哪里。
你很有可能需要创建自己的命名规则和目录结构,下面的例子仅供参考。

普遍的命名规则
  • 名字应该代表它是什么,例如鸟就应该叫做Bird
  • 选择可以发音、方便记忆的名字。如果你在制作一个玛雅文化相关的游戏,不要把关卡命名为QuetzalcoatisReturn
  • 保持唯一性。如果你选择了一个名字,就坚持用它。
  • 使用Pascal风格的大小写,例如ComplicatedVerySpecificObject
    不要使用空格,下划线,或者连字符,除了一个例外(详见为同一事物的不同方面命名一节)。
  • 不要使用版本数字,或者标示他们进度的名词(WIP、final)。
  • 不要使用缩写:DVamp@W应该写成DarkVampire@Walk
  • 使用设计文档中的术语:如果文档中称呼一个动画为Die,那么使用DarkVampire@Die,而不要用DarkVampire@Death
  • 保持细节修饰词在左侧:DarkVampire,而不是VampireDarkPauseButton,而不是ButtonPaused。举例说明,在Inspector中查找PauseButton,比所有按钮都以Button开头方便。(很多人倾向于相反的次序,认为那样名字可以自然的分组。然而,名字不是用来分组的,目录才是。名字是用来在同一类对象中可以快速辨识的。)
  • 为一个序列使用同一个名字,并在这些名字中使用数字。例如PathNode0, PathNode1。永远从0开始,而不是1。
  • 对于不是序列的情况,不要使用数字。例如 Bird0, Bird1, Bird2,本应该是Flamingo, Eagle, Swallow
  • 为临时对象添加双下划线前缀,例如__Player_Backup

为同一事物的不同方面命名
在核心名称后面添加下划线,后面的部分代表哪个方面。例如
  • GUI中的按钮状态:EnterButton_Active、EnterButton_Inactive
  • 贴图: DarkVampire_Diffuse, DarkVampire_Normalmap
  • 天空盒:JungleSky_Top, JungleSky_North
  • LOD分组:DarkVampire_LOD0, DarkVampire_LOD1

结构
场景组织、工程目录、脚本目录应该使用相似的模式。
目录结构
[AppleScript] 
?
1
MaterialsGUIEffectsMeshes  Actors     DarkVampire     LightVampire     ...  Structures     Buildings     ...  Props     Plants     ...  ...PluginsPrefabs  Actors  Items  ...Resources  Actors  Items  ...Scenes  GUI  Levels  TestScenesScriptsTexturesGUIEffects...


场景结构
[size=11.818181991577148px]CamerasDynamic ObjectsGameplay   Actors   Items   ...GUI   HUD   PauseMenu   ...ManagementLightsWorld   Ground   Props   Structure   ...
[size=11.818181991577148px]脚本目录结构

[size=11.818181991577148px]ThirdParty   ...MyGenericScripts   Debug   Extensions   Framework   Graphics  IO   Math   ...MyGameScripts   Debug   Gameplay      Actors      Items      ...   Framework   Graphics   GUI   ...


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值