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