Unity3D 可以作为学习资料的 编程规范(转)

以FooBar这个单词为例,我们简单概括:

  1. 变量小写字母起头: bool fooBar = false;
  2. 函数大写字母起头: void FooBar ();
  3. 函数参数加以 “_” + 小写字母起头: void MyFunction ( int _fooBar );
  4. public, private, protected, internal 写最前面
  5. static, const, virtual, override 放中间, 多个混合顺序随意
  6. Serialize 和 NonSerialize 的属性分段定义
  7. 内嵌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 () { ... }
}
posted @ 2012-03-21 11:48  渡蓝  阅读(1046)  评论(0编辑  收藏  举报