JamesB 发表于 2022-12-11 07:10

保持Unity项目结构清晰的7种方法

翻译自
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

[*]Editor

[*]Shaders


注意:



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


0×02 场景层次结构



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

[*]Management
[*]GUI
[*]Cameras
[*]Lights
[*]World

[*]Terrain
[*]Props

[*]_Dynamic

[*]您应遵循以下几条规则:

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


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



[*]Unity中的预制件并不完美,但它们是您分享预先配置的对象层次结构的最佳选择。一般来说,尝试预制你放在场景上的所有东西。只需向其中添加一个或多个预制件,您就可以从空场景中创建新关卡。
[*]您应该使用预制件的原因是,当预制件更改时,所有实例也会更改。有100个级别,并希望在所有这些级别上添加相机效果?不是问题!如果您的相机是预制件,只需将相机效果添加到相机预制件即可!
[*]请注意,您不能在另一个预制件中安装预制件。改为使用链接 – 有一个需要分配预制件的字段,并确保在创建实例时分配它。当有意义时,请考虑在 Awake() 或 OnEnable() 中自动连接预制实例。

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





[*]您可能已经了解了有关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 1和2的故事。

0×07 添加作弊器



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

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

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

页: [1]
查看完整版本: 保持Unity项目结构清晰的7种方法