提供了三種可供選擇的腳本編程語言:JavaScript, C# 以及 Boo。盡管它們各有各的優
勢與不足,但對我來講C#顯然會脫穎而出成為我的首選——首選,它完整支持面向對象,而
且語法與Java以及ActionScript 3 很類似,而這兩者都是我所熟悉的。不過在接觸Unity3D之
前,我一行C#的代碼都沒寫過,所以我必須從頭學起。
C#由Microsoft提出並廣泛使用於.NET framework以及Silverlight開發中。不過我們首先需
要明白的是,學習用於Unity3D的C#並不等同於學習.NET平台,事實上你並不需要了解所有
關於.NET的事情就可以使用C#為Unity3D編寫腳本程序。
盡管我平時使用各種在線文檔,但是一本實體書通常才是最好的助手,於是我決定買一
本C#好書。 O’Reilly C# Pocket Guide看起來正是我所需要的,購買一本 500 頁的C#聖經顯然是
沒有必要的,因為那些書中大部分內容都是與.NET相關的,根本無法與Unity3D兼容。
當然,僅僅依靠這一本書是不夠的,你還需要經常查閱 Unity3D scripting reference。文
檔中所有的例子都是用Javascript書寫的,但是不必擔心,一旦你熟悉C#后將它們翻譯為C#
語言將輕而易舉。
C#是一種非常典雅而強大的編程語言,它的 dot‐syntax 命名法則基於 Java,所以如果你
具有 Java 編程背景將感到非常舒服。不過區別也還是有一些的,最明顯的應該是在 C#中屬
性以及方法的名稱約定俗稱都是以大寫字母開頭的。 我估計這是繼承自Visual Basic的習慣,
我並不是這種習慣的簇擁,但是與其反抗到底還不如接受它以保證代碼的一致性。
C#的特性列表實在太長,這使得 ActionScript 實在是看起來有些相形見絀。 C#與
Actionscript 從本質上是極為相似的,我估計下一次 ActionScript 的升級中至少會實現 C#的一
些特性,因此有必要在此預先有所了解。下面是我所鍾愛的一些特性。
運算符重載
這是目前為止最酷的!它允許程序員為+‐*/這樣的運算符定義特殊的行為。它的優勢在
向量加法運算中就可以明顯體現出來,在 ActionScript 中,要計算向量之和,你需要書寫類
似下面的代碼:
?
?
var c:Vector3D = a.add(b);
這樣並不是很好,在多於兩個向量相加時代碼的易讀性會變得很差。如果在 C#中重載+
運算符,代碼將會變成下面的形式:
Vector3 c = a + b;
?
這樣是不是可讀性更好而且更為優雅呢?不用想我們就可以猜到,在 Unity3D 中所有向
量的運算符都進行了重載。如果你希望自己實現,運算符重載也非常簡單,對於上面的例子,
代碼大致是下面這個樣子的:
public static Vector3 operator + (a:Vector3, b:Vector3) {
return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
這其中有一些簡單的規則:運算符函數永遠都是靜態的(static),並且需要返回它所
定義的對象類型。不過它的參數可以是任何類型的,因此完全可以重載加法或乘法運算符使
其支持向量與浮點數或者與矩陣的運算——而這一切都要得益於 C#對運算符重載功能的支
持。
方法重載
方法重載可以允許我們定義多個同名但參數不同的方法。它不但對一般方法起作用而且
也可以應用於構造函數——如果有多種途徑來初始化一個對象,那么你可以為每一種途徑定
義一個專有的構造函數。而且方法重載同樣可以應用於運算符方法,這一點上面已經提到了。
在 Unity3D API 中一個關於運算符重載最好的例子就是’Transform.Rotate()’這個方法,它
被重載了三次以滿足不同的旋轉參數:
?
?
void Rotate (Vector3 eulerAngles, Space relativeTo)
void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo)
void Rotate (Vector3 axis, float angle, Space relativeTo)
你可以指定歐拉角,也可以指定旋轉軸以及旋轉角度。
ActionScript 可以使用默認參數來模擬方法重載,但是這樣做並不方便也不便於理解。
Getter/Setter 語法
C#聲明參數的方法非常簡明扼要,在 ActionScript 中需要兩個方法——一個’get’一
個’set’,而在 C#中的代碼則是這樣的:
public float Size { get; set; }
在這種情況下,你不需要額外做任何工作編譯器就會自動創建一個私有屬性,當然,這
?
樣的定義沒什么用處,下面列舉一個稍微復雜點的,包括一個 public 的 get 以及 private 的
set:
public float Area {
get { return size * size; };
private set { size = Mathf.Sqrt(value) };
}
想必你應該已經注意到了,盡管 C#源自 Java,在 C#中卻並不使用’function’和’var‘關鍵
詞——這樣做之所以好是因為這兩個關鍵詞完全是冗余的病情不會為代碼增加任何有價值
的信息。
對於其他特性,我推薦看看 indexers,generic types,structures 以及 enumerators,在
上面提到的 C# Pocket Book 中都有詳細介紹,許多 C#教程中也有涉及。
編輯 C#
很多編輯器都支持C#,微軟提供的Visual C# Express Edition免費而且非常好用,支持代
碼自動補完功能,但是只對應Windows平台(顯然的)。對於Max平台Mono Develop看起很
強大但是還並不是很穩定。 不幸的是Eclipse的C# plugin目前為止非常不穩定,所以我並不推
薦,但好在它目前還處於Alpha階段,我們應該再多給它一些時間。當然,不論如何,我們
最后至少還可以求助於TextMate。
最后需要提到的是Unitron——Unity3D自帶的默認編輯器。在開發者中間它並不怎么流
行,而且我看到有人抱怨他過於基本了,我並不認同這種觀點。雖然它不如FDT之於
ActionScript那樣強大,但是它非常穩定而且具備基本的代碼自動補完功能——有趣的是,自
動補完功能在默認設置下是關閉的(為啥?),要開啟該功能需要打開’Preferences’,你會
在’General’面板的底端找到這個選項,如此一來我相信Unitron還是值得一用的。
我們中很多人都是在瀏覽器環境下認識 Javascript 的,而 Javascript 也是很多人平生第一
次使用的編程語言。如果是這種情況的話,你很可能會立刻開始使用 Javascript 進行 Unity3D
的編程而不必操心要學習什么新東西,畢竟,如 Unity3D 所說,任何使用 C#可以完成的事
同樣可以使用 Javascript 完成。
但是從長遠考慮的話,C#可以提供更好的代碼管理,完整的 OOP 支持,strong typing
以及掌握一門優秀編程語言所帶來的成就感。因此,額外付出的努力是值得的,更何況,對
於一個經驗豐富的 AS3 開發者,掌握 C#只是幾個禮拜的事兒,現在就動手嘗試一下吧!
勢與不足,但對我來講C#顯然會脫穎而出成為我的首選——首選,它完整支持面向對象,而
且語法與Java以及ActionScript 3 很類似,而這兩者都是我所熟悉的。不過在接觸Unity3D之
前,我一行C#的代碼都沒寫過,所以我必須從頭學起。
C#由Microsoft提出並廣泛使用於.NET framework以及Silverlight開發中。不過我們首先需
要明白的是,學習用於Unity3D的C#並不等同於學習.NET平台,事實上你並不需要了解所有
關於.NET的事情就可以使用C#為Unity3D編寫腳本程序。
盡管我平時使用各種在線文檔,但是一本實體書通常才是最好的助手,於是我決定買一
本C#好書。 O’Reilly C# Pocket Guide看起來正是我所需要的,購買一本 500 頁的C#聖經顯然是
沒有必要的,因為那些書中大部分內容都是與.NET相關的,根本無法與Unity3D兼容。
當然,僅僅依靠這一本書是不夠的,你還需要經常查閱 Unity3D scripting reference。文
檔中所有的例子都是用Javascript書寫的,但是不必擔心,一旦你熟悉C#后將它們翻譯為C#
語言將輕而易舉。
C#是一種非常典雅而強大的編程語言,它的 dot‐syntax 命名法則基於 Java,所以如果你
具有 Java 編程背景將感到非常舒服。不過區別也還是有一些的,最明顯的應該是在 C#中屬
性以及方法的名稱約定俗稱都是以大寫字母開頭的。 我估計這是繼承自Visual Basic的習慣,
我並不是這種習慣的簇擁,但是與其反抗到底還不如接受它以保證代碼的一致性。
C#的特性列表實在太長,這使得 ActionScript 實在是看起來有些相形見絀。 C#與
Actionscript 從本質上是極為相似的,我估計下一次 ActionScript 的升級中至少會實現 C#的一
些特性,因此有必要在此預先有所了解。下面是我所鍾愛的一些特性。
運算符重載
這是目前為止最酷的!它允許程序員為+‐*/這樣的運算符定義特殊的行為。它的優勢在
向量加法運算中就可以明顯體現出來,在 ActionScript 中,要計算向量之和,你需要書寫類
似下面的代碼:
?
?
var c:Vector3D = a.add(b);
這樣並不是很好,在多於兩個向量相加時代碼的易讀性會變得很差。如果在 C#中重載+
運算符,代碼將會變成下面的形式:
Vector3 c = a + b;
?
這樣是不是可讀性更好而且更為優雅呢?不用想我們就可以猜到,在 Unity3D 中所有向
量的運算符都進行了重載。如果你希望自己實現,運算符重載也非常簡單,對於上面的例子,
代碼大致是下面這個樣子的:
public static Vector3 operator + (a:Vector3, b:Vector3) {
return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
這其中有一些簡單的規則:運算符函數永遠都是靜態的(static),並且需要返回它所
定義的對象類型。不過它的參數可以是任何類型的,因此完全可以重載加法或乘法運算符使
其支持向量與浮點數或者與矩陣的運算——而這一切都要得益於 C#對運算符重載功能的支
持。
方法重載
方法重載可以允許我們定義多個同名但參數不同的方法。它不但對一般方法起作用而且
也可以應用於構造函數——如果有多種途徑來初始化一個對象,那么你可以為每一種途徑定
義一個專有的構造函數。而且方法重載同樣可以應用於運算符方法,這一點上面已經提到了。
在 Unity3D API 中一個關於運算符重載最好的例子就是’Transform.Rotate()’這個方法,它
被重載了三次以滿足不同的旋轉參數:
?
?
void Rotate (Vector3 eulerAngles, Space relativeTo)
void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo)
void Rotate (Vector3 axis, float angle, Space relativeTo)
你可以指定歐拉角,也可以指定旋轉軸以及旋轉角度。
ActionScript 可以使用默認參數來模擬方法重載,但是這樣做並不方便也不便於理解。
Getter/Setter 語法
C#聲明參數的方法非常簡明扼要,在 ActionScript 中需要兩個方法——一個’get’一
個’set’,而在 C#中的代碼則是這樣的:
public float Size { get; set; }
在這種情況下,你不需要額外做任何工作編譯器就會自動創建一個私有屬性,當然,這
?
樣的定義沒什么用處,下面列舉一個稍微復雜點的,包括一個 public 的 get 以及 private 的
set:
public float Area {
get { return size * size; };
private set { size = Mathf.Sqrt(value) };
}
想必你應該已經注意到了,盡管 C#源自 Java,在 C#中卻並不使用’function’和’var‘關鍵
詞——這樣做之所以好是因為這兩個關鍵詞完全是冗余的病情不會為代碼增加任何有價值
的信息。
對於其他特性,我推薦看看 indexers,generic types,structures 以及 enumerators,在
上面提到的 C# Pocket Book 中都有詳細介紹,許多 C#教程中也有涉及。
編輯 C#
很多編輯器都支持C#,微軟提供的Visual C# Express Edition免費而且非常好用,支持代
碼自動補完功能,但是只對應Windows平台(顯然的)。對於Max平台Mono Develop看起很
強大但是還並不是很穩定。 不幸的是Eclipse的C# plugin目前為止非常不穩定,所以我並不推
薦,但好在它目前還處於Alpha階段,我們應該再多給它一些時間。當然,不論如何,我們
最后至少還可以求助於TextMate。
最后需要提到的是Unitron——Unity3D自帶的默認編輯器。在開發者中間它並不怎么流
行,而且我看到有人抱怨他過於基本了,我並不認同這種觀點。雖然它不如FDT之於
ActionScript那樣強大,但是它非常穩定而且具備基本的代碼自動補完功能——有趣的是,自
動補完功能在默認設置下是關閉的(為啥?),要開啟該功能需要打開’Preferences’,你會
在’General’面板的底端找到這個選項,如此一來我相信Unitron還是值得一用的。
我們中很多人都是在瀏覽器環境下認識 Javascript 的,而 Javascript 也是很多人平生第一
次使用的編程語言。如果是這種情況的話,你很可能會立刻開始使用 Javascript 進行 Unity3D
的編程而不必操心要學習什么新東西,畢竟,如 Unity3D 所說,任何使用 C#可以完成的事
同樣可以使用 Javascript 完成。
但是從長遠考慮的話,C#可以提供更好的代碼管理,完整的 OOP 支持,strong typing
以及掌握一門優秀編程語言所帶來的成就感。因此,額外付出的努力是值得的,更何況,對
於一個經驗豐富的 AS3 開發者,掌握 C#只是幾個禮拜的事兒,現在就動手嘗試一下吧!
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed