每个Unity开发人员应该知道的30件事

多年来与Unity一起工作,我获得了有关如何更好地改善工作流程的提示和技巧。 此列表中包括我的个人提示和技巧,但我还包括一些我最近发现非常有用的技巧。 我根据Unity游戏开发的各个方面将它们分为几类。

接口

  1. 为特定的工作流程创建自定义布局。 我通常使用布局,将项目面板保留为一列模式。 如果您喜欢在特定布局中使用面板和窗口,请将其保存,然后可以轻松地在布局之间切换以加快工作流程。 在本课程中,了解如何创建布局:https://cgcookie.com/lesson/using-layouts/。
  2. 如果需要将两个游戏对象与检查器面板进行比较,请复制检查器面板,选择对象,然后锁定该面板。 然后,您可以选择第二个对象,并与两个检查器面板并排查看它们。
  3. 处于播放模式时,您可以为编辑器添加色彩。 这很有用,因为将不会保存在播放模式下所做的更改,因此在播放模式下具有明显的红色调可以确保您知道。
  4. 组件的右上角有一个齿轮图标。 使用它来向上移动它们,复制值并将其从游戏对象中删除
  5. 大型画布会阻塞您在场景中的视线而感到烦恼吗? 通过单击右上角的“眼睛”图标隐藏UI层。

动画

  1. 使用头像蒙版可根据身体部位组合多个动画。 这减少了对多个自定义动画(例如上半身和下半身特定的动画)的需求。 例如,您可以在执行单独的上身动画时运行,而无需每个动画的运行状态。
  2. 您可以使用逆运动学来模仿握持或握持机制,例如握住方向盘,握持各种武器等。
  3. 对于使用参数时需要立即发生的所有动画过渡,请取消选中“具有退出时间”。 退出时间确定动画剪辑必须在过渡之前完成播放。 这是一个通常被人们忽视的事情,人们会忘记并且想知道为什么他们的动画被延迟或无法按预期工作。
  4. 您可以镜像不同方向的动画。 可以将左转动画镜像为右转动画。 进行测试以确保其外观符合预期。 注意: 这不会反转动画,并且仅适用于人形动画。
  5. 可以通过为速度添加负值反转动画剪辑。 这适用于通用和人形动画,例如向前走也可以用于向后走。

脚本编写

  1. 使用范围属性将滑块添加到数值。 如果您在团队中工作,这将特别有用,因为设置值的任何人都无法添加比您期望使用的值低或高的值。 这也使事情看起来更容易。
  2. 通常,拥有多个执行特定任务的较小脚本比一个难以修改的巨型脚本要好。 考虑一下默认的Unity组件,例如Rigidbody,AudioSource,Colliders等。这些组件都执行特定的任务,并且可以相互配合使用,但是刚体将不会播放音频剪辑,也不知道如何操作。 请注意 ,情况并非总是如此,但是在可行的情况下,请保持模块化。
  3. 整理脚本,使其易于阅读。 我喜欢将公共变量放在顶部,将私有变量放在底部。 对方法执行相同的操作,因此无需深入了解脚本即可轻松理解它们。 我喜欢以一种看起来像功能“时间表”那样的方式来组织我的脚本。
  4. 工具提示和标题是通知其他人特定变量/组指的好方法。
  5. 使用Gizmos和Handles类来测试各种游戏机制,例如绘制线球以表示游戏中炸药的范围或查看敌方角色的半径:
  6. 在计算机上本地保存有用的代码段和完整脚本。 我在计算机上专门保留了一个文件夹,用于存放可能容易忘记的多个项目中使用的有用代码。 对于从头开始重建的完整脚本,也是如此。
  7. 尽可能缓存组件并将其存储在Start或Awake方法的变量中。 不需要在更新中使用GetComponent。
  8. 写出循环/ if语句/等时,按两次制表符可快速自动完成开括号和括号的括弧。 例如,写出“ if”,后跟两个选项卡,查看代码自动完成为完整的if语句。

性能

  1. 尽可能使用纹理图集。 这与性能相伴,但如果多个资产共享相似的纹理贴图和材质,也使文件组织变得更容易。 以下是塔防流程中用于多个道具和游戏对象的纹理地图集的示例,这些纹理和地图都在一个较大的纹理图中
  2. 尽可能在场景中烘烤照明。 如果将照明设置为实时,则可能会浪费大量性能。 如果您不需要所有物体都具有实时照明,则将它们(游戏对象)设置为静态并烘烤。 您还可以混合使用实时照明和烘焙照明。 在本课程中了解有关光照贴图烘焙的更多信息:https://cgcookie.com/course/fundamentals-of-lighting-2/
  3. 如果需要使用网格碰撞器(复合碰撞器性能更高),建议您构建同一网格的低多边形版本以用作网格碰撞器。 这不仅提供了更高质量的网格对撞机,而且还可以改善性能。 您也可以使用Convex来提供帮助,但这可能无法提供理想的结果,因此可以自己创建帮助。
  4. 使用Debug.Log消息完成后,将其删除或注释掉。 其他任何调试消息和/或“绘制”调试方法也是如此。
  5. “统计”窗口可能无法准确确定每秒正确的帧数。 建议您创建自己的FPS计数器,并使用事件探查器获得更准确的性能统计信息。 我通常使用stats窗口来确定设置通过调用,但是为了进行更深入的性能测试,无论是自定义工具还是内置Profiler
  6. 使用可能的最低分辨率纹理贴图来减小尺寸并提高性能。
  7. 如果您希望一遍又一遍地使用多个对象,请使用对象池系统重用对象而不破坏它们。 快速实例化和销毁多个对象可能会降低性能,但效率却不高。

项目组织

  1. 在场景中使用空的游戏对象将类似的物品分组在一起。 例如,将所有建筑物/树木/地形分组为一个名为“环境”的组。 这不仅使查找对象更加容易,而且使禁用/启用对象组更加容易。
  2. 同样,将空的游戏对象用作网格之类的父对象。 尽可能避免将脚本或组件直接放在网格上。 使用空父对象可以轻松修改网格,而无需重新创建/添加组件。 它还允许您控制网格对象的位置/旋转,同时保持父对象一致。
  3. 在项目面板中创建一个标准的文件夹结构。 以下是我通常如何排列文件夹的图像。 名称取决于您,但请尽量保持一致。
  4. 避免文件的歧义命名。 命名事物是什么。 如果您有垃圾桶支撑,请将其命名为“ TrashCan_Prop”。 任何人都应该能够浏览您的场景层次结构或项目面板,并且对仅基于名称的对象应该有很好的了解。
  5. Unity Services是管理项目的好方法,即Collaborate和Cloud Build服务。 我使用Collaborate保存项目的版本,然后可以将其授予团队中的其他成员。 Cloud Build是在多个平台上构建我们的游戏,然后自动将指向最终构建版本的链接通过电子邮件发送给团队成员的好方法。