【Unity】保持项目规整有序的7条Tips(个人翻译)

以下内容笔者个人翻译自:http://www.theknightsofunity.com/

曾经有人提问,“程序员如何编写出超过一万行的代码”。事实是,当软件越来越大时,维护起来也会越来越困难。因此,面临的问题是,假如你无法维持你的项目规整而有序,那么你将步履蹒跚。进而,你将发现自己浪费了大量的时间在这个混乱的项目上而难以前进。Unity项目亦是如此。以下,是我个人认为能够帮助你保持项目规整的最为重要的几点提示。

文件夹结构

每当我们谈到组织架构时,我们无可避免的会提及到项目文件夹结构。Unity在这方面给我们提供了非常大的自由度,但也正因为如此自由,也会让文件夹常常变得混乱。以下是我个人使用的目录结构:
● 3rd-Party
● Animations
● Audio
○ Music
○ SFX
● Materials
● Models
● Plugins
● Prefabs
● Resources
● Textures
● Sandbox
● Scenes
○ Levels
○ Other
● Scripts
○ Editor
● Shaders

  1. 不要在根目录下存储任何资源文件,尽可能的使用子目录。
  2. 除非确实有需要,不要在根目录中创建任何额外的文件夹。
  3. 命名一致,一旦你决定文件夹使用驼峰命名法,资源使用小写字母命名法,请遵循这个规则。
  4. 不要尝试将那些有特定依赖的资源移动到通用目录。例如:如果某些材质由某特定的模型所创建,不要将它们移动到通用材质目录中去。否则日后你将补知道它们来自于哪里。【笔者确实也会范类似错误,惯性的认为把所有材质放在同一个文件夹方便管理,实际上会造成更大的混乱。如果材质或贴图等文件已经和当前模型关联在同一目录下,尽量不要移动它们。
  5. 使用3rd-Party目录来储存那些来自于Asset Store的资源,通常它们有完善的文件结构,不需要再次规整。
  6. 使用Sandbox目录来储存所有实验性的或任何尚未确定的内容。当处理这些内容的时候,便不用关心是否适当规整了。尝试任何你想做的,直到移除或者最终确认需要在项目中使用它们。多人协作时,建立你的个人沙盒文件夹:Sandbox/JohnyC。
场景层级结构

除项目结构外,也要考虑场景的层级结构。在此之前,我将提供一个参考模板,你可以根据需要自行调整:
● Management
● GUI
● Cameras
● Lights
● World
○ Terrain
○ Props
● _Dynamic

以下有一些你应当遵守的规则:

  1. 所有空对象应当让其位置归于0,0,0点,保持默认旋转方向和大小。
  2. 当你在运行时创建对象,确保将其放置于_Dynamic中,不要污染了根层级结构,否则你会发现很难去处理它。
  3. 对于那些只作为脚本容器的空对象,可以使用“@”作为前缀命名。例如:@Cheats
    笔者认为这一部分实际上相对灵活,且每个人都有自己习惯的层级结构和命名习惯,不必刻意保持一致,不过还是蛮有参考价值的,比如动态对象创建时存放的合理性。
使用预制件进行所有操作

尽管Unity的预制件并不算完美,但它仍然是预设场景层级结构的最好方式。通常来说,尽可能让场景里的物体都成为预制件。你应该能够通过添加这些预制件到一个新场景中而轻易的创建一个新关卡。

使用预制件的原因是因为,当一个预制件产生变化时,其对应的所有的实例都会产生变化。假如有100个关卡,希望都添加一个摄像机效果?没有问题!只要你的摄像机是一个预制件,将效果添加到这个预制件上就行了!

值得注意的是,你不应当让一个预制件中包含另外的预制件。使用连接来替代 — 定义一个需要该预制件的字段,并且确保当实例创建时候,为该字段赋值。考虑在合理的情况下,在Awake() 或 OnEable()函数中去关联需要使用的预制件的实例。

学习如何使用版本管理系统(VCS)

也许你已经了解过例如GIT, Subversion或其他版本管理工具。但实际上,“了解”仅仅是学习过程中的冰山一角。对于你所选择使用的版本管理工具,你应该着重学习那些非常重要但使用频率并不高的特性。为什么呢?最主要的原因是因为版本管理系统远你比想象中的要强大,可惜的是,众多使用者仅仅把它当作一个备份和同步的解决方案。举个例子,你是否知道?GIT允许你缓存(statsh)你的修改内容,这样你就可以在不提交任何内容到你的主干情况下,恢复这部分修改内容。
这里读起来可能有点绕,简单来说git stash命令的作用就是将要当前还不想提交的但是已经被修改的内容保存在内存中(例如临时发现某个bug,但是当前开发内容还没结束)。之后可以在任意分支中再恢复这部分存储过的修改内容。

程序员们往往倾向于注释掉某一段代码块,以备在日后使用。不要这样做!假如你正在使用版本管理工具,学习如何快速浏览之前的版本内容,当你对它们熟悉了以后,你的代码将看上去更舒适,因为没有了那些不必要的注释代码块。

在此,为Git用户提供一个非常棒的Tips资源网站:http://gitready.com/

学习如何编写编辑器脚本

在扩展性方面,Unity是一个很棒的游戏引擎。学习如何编写编辑器脚本并运用这部分的知识。你不需要为你的脚本创建多么好看的GUI,像菜单项一样制作一些简单而实用的内容即可。以下是我过去所创建的一编辑器脚本的示例:
● Google Sheets .csv download – 我在谷歌云盘上保存了一个翻译电子表格。它能自动下载最新版本的.csv文件,所以我从不需要手动去处理它。
● Randomize the position, rotation and size of trees – 我有很多的树,我希望我的树更像一片森林而非一张网格。
● Create distribution – 构建指定的对象,打包并复制它们到正确的位置。
● String replace in the sources – 我有若干个包含了应用版本信息的文件。

你可以通过官方文档来学习如何创建编辑器脚本:官方文档

学习如何防备性编程

你可能从未听说过防备性编程?维基百科是这样定义的:
Defensive programming — 防错性编程是一种防御性或保护性设计,它的目的是确保在许多不可预见的情况下,软件仍可以正常持续的运行。防御性编程技术的使用旨在某些软件被滥用的时候。

通常当你编写MonoBehaviours脚本时,你应该确保如下内容:

● 设置好所需要的所有引用。
● 设置好所需要的所有组件。
● 假如你使用单例,确保它们存在。
● 假如你需要找到某个对象活希望找到某些东西,请尽快的找到它们。
● 在你运行这个场景之前,混入编辑器代码(ExecuteInEditMode and #if UNITY_EDITOR),尽可能地多做检查。

你可以使用assets语法来检查这些问题,更多了解可以参见A Story of NullPointerException Part 1 与 Part 2。

实行编辑器/或者游戏内作弊

当你学会了如何编写编辑器脚本之后,你应该尝试编写一组编辑器内作弊工具。它可以作为菜单栏一样,帮助开发者在开发测试过程中解锁一些内容(例如解锁所有关卡)。它也非常容易创建:

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编辑器以外的地方执行,但你必须认真考虑如何执行它们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值