Unity3D 可以作为学习资料的 编程规范(转)
以FooBar这个单词为例,我们简单概括:
-
变量小写字母起头: bool fooBar = false;
-
函数大写字母起头: void FooBar ();
-
函数参数加以 “_” + 小写字母起头: void MyFunction ( int _fooBar );
-
public, private, protected, internal 写最前面
-
static, const, virtual, override 放中间, 多个混合顺序随意
-
Serialize 和 NonSerialize 的属性分段定义
-
内嵌Class,Enum的定义放最上方,接着是static变量,接着是Serialize变量,接着是NonSerialize变量,接着是static函数,最后是其他函数.
变量定义
Unity3D中变量的定义和Inspector显示以及Serialize挂钩(具体参考Member Data和Inspector, Serialize的关系)。所以在定义中我们不采用匈牙利命名规则(m_, s_, g_),而是直接以变量名的小写字母起头进行定义。
以FooBar为例,定义如下:
public bool fooBar = false;
或者
public bool foobar = false;
有时候我们会做出带get,set函数的属性定义,并带有serialize字段,这种情况下我们建议定义方法如下:
[SerializeField] protected int fooBar_ = 10;
public int fooBar {
get { return fooBar_; }
set {
if ( fooBar_ != value ) {
fooBar_ = value;
Debug.Log("fooBar changed");
}
}
}
虽然没有强调为变量赋默认值,但是给变量赋于初始值是一个好习惯。有些变量如 List<T> 在没有默认初始化定义的情况下,会出现null reference错误,如:
private List<int> fooBarList; // 第一次使用的时候如果没有new List与它会出现null reference的错误
private List<int> fooBarList = new List<int>();
函数定义
函数定义统一以大写字母起头,如一个名为FooBar的函数,定义为:
public void FooBar () {
...
}
函数中的参数,以”_” + 小写字母起头参数定义。如参数名 “Do Update” 将定义为:
public void FooBar ( bool _doUpdate ) {
....
}
这样做可以避免掉参数和成员变量重名的问题,也方便代码阅读,明确哪些是外部参数
修饰符定义
修饰符分两批
-
存取修饰符: public, protected, private, internal
-
其他修饰符: static, const, virtual, override, readonly … 等
存取修饰符在定义是放在最前面,其他修饰符在存取修饰符之后。如:
public static int fooBar = 0;
protected void FooBar () { ... }
括号{}的书写位置
我们对{,}的书写定义没有强制要求,根据个人编程习惯来书写,有的人习惯写:
if ( ... ) {
...
}
而也有喜欢书写:
if ( ... )
{
...
}
这都是可行的。
空格符的书写
定义函数时,以下几种书写习惯都是可行的:
void MyFunction ( int _a, int _b, int _c ) { ... }
void MyFunction(int _a, int _b, int _c) { ... }
定义变量时,必须在”=“两边各空出一格以上
int foobar = 0;
Serialize 和 Non-Serialize 数据定义请分开
有些人习惯按照public, private来书写数据段。在Unity3D中,由于Serialize和Inspector显示关联紧密,书写的时候请按照Serialize, Non-Serialize来做第一层划分,之后可以根据个人喜好选择public, protected等情况的划分。如:
///////////////////////////////////////////////////////////////////////////////
// serialize
///////////////////////////////////////////////////////////////////////////////
public int foobar01 = 0;
public float foobar02 = 0.0f;
[SerializeField] protected int foobar03 = 1;
///////////////////////////////////////////////////////////////////////////////
// non-serialized
///////////////////////////////////////////////////////////////////////////////
private int myFoobar01 = 0;
[System.NonSerialized] public float myFoobar02 = 0.0f;
定义顺序
定义顺序并没有做强制要求,这里给出一个推荐的定义顺序:
public class MyFooBar {
// ---------------------------
// nested classes, enums
// ---------------------------
// classes
[System.Serializable]
class Data {
int id = -1;
string name = "";
}
// enums
enum Type {
Human = 0,
Dragon,
Slime
}
// delegates
public delegate void EventHandler ();
public delegate void StateUpdate ();
// ---------------------------
// variables
// ---------------------------
// static variables
public static MyFooBar instance = null;
static intialized = false;
// serialized
public Data data = new Data();
public float hp = 100.0f;
public float mp = 50.0f;
// non-serialized
float curSpeed = 0.0f;
float curHp = 0.0f;
float curMp = 0.0f;
// ---------------------------
// functions
// ---------------------------
// static functions
public static void Init () { ... }
// other functions
public void Attack () { ... }
void CalcDamage () { ... }
}