http://blog.theknightsofunity.com/7-ways-keep-unity-project-organized/
一天,我在Quora上看到一个人问:程序员如何用超过一万行的代码编写一个项目。软件做的越大,维护就越困难,这是一个不争的事实。所以这面临的问题就是如果你不让你的项目有条理,就会很难维护它。到后期,你就会发现你并不是在添加新功能而是在把时间浪费在一个凌乱的项目上。每一个Unity项目也是这样的。在我看来,这是非常重要的技巧,可以帮助你保持你的项目条理性。
**
1. Directory Structure 1、目录结构
**
我们不能够在不提到项目目录结构的情况下谈论组织结构。Unity让你可以自由的创建自己想要的目录结构,也正是因为这样,它可能让项目很混乱。下面是我个人使用的目录结构:
3rd-Party(第三方资源)
Animations
Audio
1、Music
2、SFX
Materials
Models
Plugins
Prefabs
Resources
Textures
Sandbox
Scenes
1、Levels
2、Other
Scripts
1、Editor
Shaders
不要在根目录存储任何资源文件,尽可能使用子目录。
除非需要,否则不要在根目录中创建一些额外目录。(意思是不要在根目录创建一些无用目录)
命名一致性。如果你决定使用“骆驼拼写法(骆驼拼写法的意思是依靠单词的大小写拼写复合词:例如:PlayStation\GameManager)”编写目录名和小写字母编写资源,请一直遵守这个规则。
不要尝试将有链接性的特定资源文件移动到常规目录或者通用目录。例如有些Materials是从模型生成的,不要将它们移动到通用目录或者其他Materials目录中,因为你下一次就不知道这些材质来自哪里了。
使用从资源商店下载的第三方资源,不要随便改变其原本的结构。
使用Sandbox(沙盒)目录来测试你不完全确定的东西。当做测试的同时,你最先需要关心的是一个合适的组织结构。这样不论你最后想删除它还是把它组织到你的项目中都可以。当你与其他人一起工作时,请创建你个人的SandBox子目录,例如:Sandbox/JohnyC。
**
2. Scene hierarchy structure 2、场景层次结构
**
在项目层次结构之后也有场景层次结构。像上面的一样,我将提供一个模板,你可以根据你自己的需要进行调整。
Management
GUI
Cameras
Lights
World
1、Terrain
2、Props
_Dynamic
你应该遵循几个规则:
所有空对象应位于(0,0,0,)坐标点,默认旋转和缩放。
当你运行中实例化对象时,请确保将其放在_Dynamic中,不要污染层次结构的根目录,否则将难以浏览Scene hierarchy下的文件(文件太多)。
对于仅用于挂载脚本的空对象,请使用“@”作为前缀。例如@Cheats
3. Use prefabs for everything 3、使用预制体进行所有操作
Unity中的Prefabs并不完美,但是你会发现,它们是共享预配置信息的最好方法。一般来说,我们可以把你想放到场景中的所有东西都做成预制体。你可以仅仅通过创建预制体来从一个空场景中创建新的关卡。
我们应该使用预制体的原因是当预制体有更改时,所有预制体的实例对象也会做相应改动。如果有一百个关卡都需要给相机添加一个相同的效果呢?没问题,如果你的相机是预制体,只需要将效果添加到预制的相机上就行。
不过要注意,你不能在另一个预制体上使用预制体。可以使用代码字段链接解决此种预制体实例预制体的情况,并且确保在父预制体实例的时候才运行该代码字段。可以考虑在Awake()或者OnEnable()中自动检测执行实例预制体对象。
4. Learn how to use version control system (VCS) 4、学习如何使用版本控制系统(VCS)
你可以已经知道GIT、Sbuversion或者其他版本控制工具。可能实际上也只是知道,而并不是很熟悉。其实我们应该了解我们所使用的的VCS的可能不经常使用的另一些重要功能。为什么呢?因为VCS系统比我们想象的要强大的多,而大部分人只是用来备份和同步解决方案。例如,你是否知道GIT是可以允许你隐藏你做的更改,以便你快速处理而不需要向主分支提交任何内容。
程序员倾向于注释掉代码块,以便于稍后来使用。不过不建议这样做。如果你使用VCS,你可以学习如何快速查看先前的版本文件。当你熟练操作VCS后,你会少很多注视到的无用代码块,让你的代码看起来更简洁好看。
下面的链接是一个GIT用户的版本代码查看的使用演示:http://gitready.com/
5. Learn to write editor scripts 5、学习编写编辑器脚本(工具脚本,编辑器扩展脚本等)
Unity作为游戏引擎,在扩展性方面是非常棒的(参见Asset Store)。学习如何编写编辑器脚本并利用这方面知识。你不需要为脚本创建过多的GUI,它是一些可以做非常有用的事情的简单菜单项。以下是我不久前创建的编辑器脚本的一些示例:
Google Sheets.cvs download——我有一个保存在Google云盘的电子转换表格。该工具可以自动下载为最新的.cvs文件,所以我从来没有手动去下载过。
Randomize the position,rotation and size of trees——当有很多树的时候,可以使它们看起来想一个森林,而不是像格子一样整齐排列。
Create distribution(创建分发)——为指定目标创建一个可以将所有文件移动到或者复制进去的路径。
String replace in the sources(资源文件的字符串替换)——我有几个文件,其中包含该工具的不同的程序版本。
你可以从官方文档中学习如何编写编辑器脚本。
6. Learn to program defensively 6、学习防御性编程
防御性编程是防御式设计的一种形式,旨在确保在不可预见的情况下维持软件可发展性的功能。防御性编程技术特别是在软件被滥用时应用更为广泛。
通常,当你写MonoBehaviours时,你应该确保以下几点:
1、所有需要用到的参考是设置的
2、所有必须的组件是存在的
3、如果你使用单例,确保它们是存在的
4、如果你搜索对象或者想要找到某些属性,请尽可能用最快速的方法
5、混合编辑器代码在运行场景前进行多次检测
For many of these checks you can use asserts. You should also read A Story of NullPointerException Part 1 and 2.
7. Implement in-editor and/or in-game cheats 7、在编辑器或者游戏中实现作弊系统
在学习如何编写编辑器脚本后,你应该能够编写一组编辑器中的作弊工具。它可以通过菜单选项来解锁一些东西。(例如,所有的等级限制)。这真的很容易编写。
class Cheats
{
[MenuItem(“My Game/Cheats/Unlock All Levels”)]
public static void UnlockAllLevels()
{
if (Application.isPlaying)
{
// unlock code here…
} else {
Debug.LogError(“Not in play mode.”);
}
}
}
• 通常你都应该写一个作弊工具,它可以让你:
• 解锁所有等级限制、角色、道具等。
• 加一个无敌。
• 加减数值,如,时间、金钱、硬币等。
• 使自己看到玩家看不到的东西(上帝视角)。
• 其它任何可以帮助你测试你的游戏的东西都可以。
当然更实用但是也更难写的是游戏中的作弊秘籍。这些类型的作弊可以在Unity编辑器之外执行,但是你必须考虑到底需要怎么执行。