保持Unity项目条理性的七个方法
发表于2018-05-24
如果一个项目的代码过多,软件过大,这样就会面临维护的问题,所以这时候让自己的项目变的有条理就非常有必要了,甚至是自己将后来要做的每一个Unity都需要做到条理清晰,下面就和大家介绍七个可以让自己的项目变得有条理性的方法,希望能帮到大家。
一、目录结构(Directory Structure)
我们不能够在不提到项目目录结构的情况下谈论组织结构。Unity让你可以自由的创建自己想要的目录结构,也正是因为这样,它可能让项目很混乱。下面是我个人使用的目录结构:
3rd-Party(第三方资源)
Animations
Audio
- Music
- SFX
Materials
Models
Plugins
Prefabs
Resources
Textures
Sandbox
Scenes
- Levels
- Other
Scripts
- Editor
Shaders
不要在根目录存储任何资源文件,尽可能使用子目录。除非需要,否则不要在根目录中创建一些额外目录。(意思是不要在根目录创建一些无用目录)
命名一致性。如果你决定使用“骆驼拼写法(骆驼拼写法的意思是依靠单词的大小写拼写复合词:例如:PlayStation\GameManager)”编写目录名和小写字母编写资源,请一直遵守这个规则。
不要尝试将有链接性的特定资源文件移动到常规目录或者通用目录。例如有些Materials是从模型生成的,不要将它们移动到通用目录或者其他Materials目录中,因为你下一次就不知道这些材质来自哪里了。
使用从资源商店下载的第三方资源,不要随便改变其原本的结构。
使用Sandbox(沙盒)目录来测试你不完全确定的东西。当做测试的同时,你最先需要关心的是一个合适的组织结构。这样不论你最后想删除它还是把它组织到你的项目中都可以。当你与其他人一起工作时,请创建你个人的SandBox子目录,例如:Sandbox/JohnyC。
二、场景层次结构(Scene hierarchy structure)
在项目层次结构之后也有场景层次结构。像上面的一样,我将提供一个模板,你可以根据你自己的需要进行调整。
Management
GUI
Cameras
Lights
World
- Terrain
- Props
_Dynamic
你应该遵循几个规则:
所有空对象应位于(0,0,0,)坐标点,默认旋转和缩放。
当你运行中实例化对象时,请确保将其放在_Dynamic中,不要污染层次结构的根目录,否则将难以浏览Scene hierarchy下的文件(文件太多)。
对于仅用于挂载脚本的空对象,请使用“@”作为前缀。例如@Cheats
三、使用预制体进行所有操作(Use prefabs for everything)
Unity中的Prefabs并不完美,但是你会发现,它们是共享预配置信息的最好方法。一般来说,我们可以把你想放到场景中的所有东西都做成预制体。你可以仅仅通过创建预制体来从一个空场景中创建新的关卡。
我们应该使用预制体的原因是当预制体有更改时,所有预制体的实例对象也会做相应改动。如果有一百个关卡都需要给相机添加一个相同的效果呢?没问题,如果你的相机是预制体,只需要将效果添加到预制的相机上就行。
不过要注意,你不能在另一个预制体上使用预制体。可以使用代码字段链接解决此种预制体实例预制体的情况,并且确保在父预制体实例的时候才运行该代码字段。可以考虑在Awake()或者OnEnable()中自动检测执行实例预制体对象。
四、学习如何使用版本控制系统(VCS)(Learn how to use version control system (VCS) )
你可以已经知道GIT、Sbuversion或者其他版本控制工具。可能实际上也只是知道,而并不是很熟悉。其实我们应该了解我们所使用的的VCS的可能不经常使用的另一些重要功能。为什么呢?因为VCS系统比我们想象的要强大的多,而大部分人只是用来备份和同步解决方案。例如,你是否知道GIT是可以允许你隐藏你做的更改,以便你快速处理而不需要向主分支提交任何内容。
程序员倾向于注释掉代码块,以便于稍后来使用。不过不建议这样做。如果你使用VCS,你可以学习如何快速查看先前的版本文件。当你熟练操作VCS后,你会少很多注视到的无用代码块,让你的代码看起来更简洁好看。
下面的链接是一个GIT用户的版本代码查看的使用演示:http://gitready.com/
五、学习编写编辑器脚本(工具脚本,编辑器扩展脚本等)(Learn to write editor scripts)
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(资源文件的字符串替换)——我有几个文件,其中包含该工具的不同的程序版本。
你可以从官方文档中学习如何编写编辑器脚本。
六、学习防御性编程(Learn to program defensively)
防御性编程是防御式设计的一种形式,旨在确保在不可预见的情况下维持软件可发展性的功能。防御性编程技术特别是在软件被滥用时应用更为广泛。
通常,当你写MonoBehaviours时,你应该确保以下几点:
- 所有需要用到的参考是设置的
- 所有必须的组件是存在的
- 如果你使用单例,确保它们是存在的
- 如果你搜索对象或者想要找到某些属性,请尽可能用最快速的方法
- 混合编辑器代码在运行场景前进行多次检测
For many of these checks you can use asserts. You should also read A Story of NullPointerException Part 1 and 2.
七、在编辑器或者游戏中实现作弊系统(Implement in-editor and/or in-game cheats)
在学习如何编写编辑器脚本后,你应该能够编写一组编辑器中的作弊工具。它可以通过菜单选项来解锁一些东西。(例如,所有的等级限制)。这真的很容易编写。
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编辑器之外执行,但是你必须考虑到底需要怎么执行。
来自:http://blog.theknightsofunity.com/7-ways-keep-unity-project-organized/