组织你的unity MonoBehaviours脚本


MonoBehaviours,是unity项目中最基础的脚本,它往往比较杂乱,因为它有一些隐式调用函数和可以通过inspector面板来获得和设置的公有域。对于一个新手unity开发者,MonoBehaviours的这些特点变得很杂乱,很难跟踪代码并理解它的含义。为了解决这个问题,在这篇文章中,我通过一个含有注释的例子来介绍一些关于我对MonoBehaviours结构的一些约定。
组织你的unity MonoBehaviours脚本_第1张图片 
1. 在文件顶部写上你的
MonoBehaviours脚本的核心描述。这将帮助人们通过你的代码理解这个脚本的职责。
2.如果你在类中使用了GetComponent ,可以使用RequireComponent属性来显式地依赖。当你附加脚本到一个对象上时,inspector面板会自动添加相应要求的组件,并且当你要移除这个要求的组件时,会提示警告,从而避免脚本错误。然而,要注意的是,当你先给对象附加了脚本,它是不会自动添加所要求的组件的。
3. 把常量和静态变量放在文件的最顶端        为任何引用该文件的动画参数使用常量,确保当你的参数名改变时,代码中的参数值仅仅需要在一个地方更改。
4. 把你要暴露给Inspector面板的域都写在一个叫做“Unity Inspector Fields”的区域中(使用public修饰或者使用[SerializeField]属性)。这样做明确了哪些域是能够被编辑器配置的,并能保持你的文件有组织性。
5. 给你的inspector域都使用Tooltip 注释。由于在inspector面板显示长度的限制,长的注释往往被截断。一个简单的提示信息可以很好地解决名字歧义的问题,使得你的脚本更容易被重用。
6. 把你的私有域聚集在inspector域后面。如果你不再使用很多私有域,那么就重新组织你的类以区分各个的职责,或者根据不同的任务使用空白行分隔你的域。
7. 我喜欢放置属性在域的后面,并在方法的前面,因为它们语法和方法类似,但是用法和域类似。这完全是个人的偏好。
8. 任何贯穿unity程序整个生命周期的方法(比如:Start, Awake, Update, OnDestroy等等),事件方法,其他隐式地(或者自动地)被你的代码所调用的方法可以使用[UsedImplicitly]属性。这个属性,虽然包含在了UnityEngine.dll中,它是用于禁用ReSharper的代码检测功能(ReSharper会检测代码,当方法没有被引用时,会给出警告建议)。这个属性帮助第一次接触你的代码的人更容易地阅读你的代码,特别是那些通过Inspector面板来引用的事件。
9. 使用
Awake 函数连接到其他依赖的引用,(比如:调用GetComponentGetComponentInChildren, FindObject等等)。在Start 函数中编写实际的启动逻辑。这样能够确保任何脚本的Start函数都已经连接了他们的引用。

10. 
在上面的示例代码中没有使用到的,但是是好的准则:如果一个域没必要公有,但是你又想通过inspector面板控制它,那么使用[SerializeField] 属性来暴露这个域到编辑器中。这将确保你的公有接口尽可能地少,反过来确保其他脚本不能混淆你的状态和破坏你的脚本。


最初看起来这些内容很庞大,但是我发现坚持这些做法确实能够使得其他开发人员更容易地在现有的很大的unity代码库上继续工作。让我知道你的想法!

这篇文章的讨论线程 r/gamedev.

你可能感兴趣的:(Unity3d)