本文翻译自 THEKNIGHTSOFUNITY 博客文章 7 Ways to Keep Your Unity Project Organized

0×00 前言

前几天我在Quora上看到的一个人,询问程序员如何编写包含10,000多行代码以上的项目。当软件变大时,维护起来就更困难了,这是事实。所以这就是事情 - 如果你不保持你的项目井然有序,你将很难跟上节奏。稍后,您将发现自己浪费时间处理混乱的项目而不是添加新功能。任何Unity项目都是如此。以下是(在我看来)最重要的提示,可以帮助您保持项目的有序性。

0×01 资源目录结构

如果不提及组织项目目录结构,我们就不能谈论组织。Unity在这方面给你一个完全的自由,但正因为如此,它经常变得非常混乱。这是我个人使用的目录结构:

  • 3rd-Party
  • Animations
  • Audio
    • Music
    • SFX
  • Materials
  • Models
  • Plugins
  • Prefabs
  • Resources
  • Textures
  • Sandbox
  • Scenes
    • Levels
    • Other
  • Scripts
    • Editer
  • Shaders

注意:

  1. 不要将任何资源存放在根目录中。尽可能使用子目录。
  2. 除非确实需要,否则不要在根目录中创建任何其他目录
  3. 与命名保持一致。如果您决定将camel case用于目录名称和低字母用于资产,请坚持使用该约定。
  4. 不要尝试将特定于上下文的资产移动到常规目录。例如,如果从模型生成材料,请不要将它们移动到Materials目录,因为稍后您将不知道它们来自何处。
  5. 使用第三方存储从资源商店导入的资产。它们通常有自己的结构,不应该改变。
  6. 使用Sandbox 目录进行您不完全确定的任何实验。在处理这类事情时,你最不想要关心的是一个合适的组织。执行您想要的操作,然后在确定要将其包含在项目中时将其删除或整理。当您与其他人一起处理项目时,请创建您的个人Sandbox子目录,如: Sandbox / JohnyC

0×02 场景层次结构

在项目的层次结构旁边还有场景层次结构。和以前一样,我会给你一个模板。您可以根据自己的需要进行调整。

  • Management
  • GUI
  • Cameras
  • Lights
  • World
    • Terrain
    • Props
  • _Dynamic

您应遵循以下几条规则:

  1. 所有的空物体应保持在Vector3.zero,默认旋转角度和缩放比例。
  2. 当您在运行时实例化(克隆) 对象时,请确保将其放在 _Dynamic 中 - 不要污染层次结构的根目录,否则您将发现难以浏览它。
  3. 对于仅作为脚本容器的空对象,请使用“@”作为前缀 - 例如@Cheats。

0×03 为所有物体设置预制体(Prefab)

Unity中的预制件并不完美,但它们是您分享预先配置的对象层次结构的最佳选择。一般来说,尝试预制你放在场景上的所有东西。只需向其中添加一个或多个预制件,您就可以从空场景中创建新关卡。

您应该使用预制件的原因是,当预制件更改时,所有实例也会更改。有100个级别,并希望在所有这些级别上添加相机效果?不是问题!如果您的相机是预制件,只需将相机效果添加到相机预制件即可!

请注意,您不能在另一个预制件中安装预制件。改为使用链接 - 有一个需要分配预制件的字段,并确保在创建实例时分配它。当有意义时,请考虑在 Awake()OnEnable() 中自动连接预制实例。

0×04 了解如何使用版本控制系统(VCS)

Git版本系统介绍
图示. GIT介绍说明

您可能已经了解了有关GIT,Subversion或任何其他VCS的信息。事实上,“了解某事”只是你可能学到的一小部分。您应该专注于了解您选择的重要但不经常使用的VCS功能。为什么?主要是因为VCS系统比您想象的要强大得多,不幸的是,许多用户使用它们只不过是备份和同步解决方案。例如,您是否知道GIT允许您存储更改,因此您可以在以后处理它们而无需向主分支提交任何内容?

程序员倾向于在以后需要时注释掉代码块。不要那样做!如果您正在使用VCS,请了解如何快速浏览文件的先前版本。熟悉它时,如果没有不必要的注释代码块,代码看起来会更好。

这里有一个很好的GIT用户提示资源:http://gitready.com

0×05 学习编写编辑器脚本

Unity在可扩展性方面是一个很棒的游戏引擎(参见资产商店)。学习如何编写编辑器脚本并利用这些知识。您没有必要为脚本创建精美的GUI,它可以是简单的事情,因为菜单条目正在做一些有用的事情。以下是我不久前创建的编辑器脚本的一些示例:

  • Google表格.csv下载 - 我在Google云端硬盘上保存了一个翻译电子表格。它自动将最新版本下载为.csv文件,因此我从未必须手动完成。
  • 随机化树的位置,旋转和大小 - 我有很多树,并希望它看起来更像森林而不是网格。
  • 创建分发 - 为指定目标构建,压缩所有文件并复制到正确的位置。
  • 源代码中的字符串替换 - 我有几个包含应用程序版本的文件。

您可以从官方文档中学习如何创建编辑器脚本。

0×06 防御性编程

你听说过防御性编程吗?维基百科将其定义如下:

防御性编程是一种防御性设计,旨在确保在不可预见的情况下软件的持续功能。特别是当一个软件被滥用时,使用防御性编程技术。

通常,当您编写MonoBehaviours时,您应该确保:

  • 设置所有需要的引用
  • 存在所有必需的组件
  • 如果您使用单身,请确保它们存在
  • 如果您正在搜索对象并期望找到某些内容,请尽快进行
  • 混合编辑器代码(ExecuteInEditMode#if UNITY_EDITOR)在运行场景之前进行尽可能多的检查

对于其中许多检查,您可以使用断言。您还应该阅读NullPointerException Part 12的故事。

0×07 添加作弊器

在学习如何编写编辑器脚本之后,您应该能够编写一组编辑器内作弊。它可以作为解锁某些内容的菜单条目(例如所有级别)。它很容易创建:

一般来说,你应该写作弊,让你:

  • 解锁所有关卡,角色,物品等
  • 给你不朽
  • 添加/减去时间,金钱,硬币等值
  • 让你看到玩家不应该看到的东西
  • 还有其他任何可以帮助您测试游戏的东西

当然更实际(但更难写)是游戏中的作弊。这些类型的作弊可以在Unity编辑器外部执行,但您必须考虑如何执行它。请参阅我们关于实现 鼠标控制的作弊子系统的其他文章。

-EOF-