unity3D中的C#編程入門
時(shi)間(jian):2018-09-28 來源(yuan):未知
第(di)一:Unity3D中的(de)C#腳本與.net中的(de)C#寫(xie)法的(de)區別
1. Inherit from MonoBehaviour
繼承自(zi)MonoBehaviour
所有(you)的(de)行為腳本(ben)必(bi)須從(cong)MonoBehaviour繼承(直接的(de)或(huo)間接的(de)).在(zai)JavaScript 中(zhong)這個是自動完成的(de),但(dan)是在(zai)C#或(huo)Boo中(zhong),必(bi)須顯(xian)示(shi)注(zhu)明.如果你(ni)通過Asset -> Create -> C Sharp/Boo Script創(chuang)建(jian)腳本(ben),系統模版已經包含了必(bi)要(yao)的(de)定義.
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
2. Use the Awake or Start function to do initialisation.
使用(yong)Awake或(huo)Start函數初始(shi)化.
Awake和Start的不同之處在(zai)于,Awake是在(zai)加載場景時運(yun)行(xing),Start是在(zai)第一(yi)次調用Update或FixedUpdate函數之前被調用,Awake函數運(yun)行(xing)在(zai)所有Start函數之前.
3. The class name must match the file name.
類名字(zi)必須(xu)匹配文(wen)件名.
JavaScript中類名被隱(yin)式的設(she)置為腳本的文件(jian)名(不包含文件(jian)擴展名).在C#和(he)Boo中必須手工編寫.
4. Coroutines have a different syntax in C#.
C#中協同程序(xu)有(you)不同的句(ju)法規則.
Coroutines必須是IEnumerator返回類(lei)型,并且yield用yield return替代.
using System.Collections;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine // C# 協同程(cheng)序
IEnumerator SomeCoroutine () {
// Wait for one frame // 等一幀(zhen)
yield return 0;
// Wait for two seconds // 等兩秒
yield return new WaitForSeconds (2);
}
}
5. Don't use namespaces.
不要使(shi)用命名空間

目(mu)前Unity暫(zan)不支持(chi)命名空間.或許(xu)未來版本會(hui)有(you).
6. Only member variables are serialized and are shown in the Inspector.
只有序列(lie)化的成員變量才能顯示在(zai)檢(jian)視(shi)面板
私有和(he)保護變量只能(neng)在(zai)專家模(mo)式中顯示(shi).屬性不被序列化或顯示(shi)在(zai)檢視面板.
7. Avoid using the constructor.
避(bi)免使用構(gou)造(zao)函數
Unity3D C#腳本(ben)初始化不要放到構造函數中(zhong)(zhong),而(er)是放到Start()方法中(zhong)(zhong)。

不(bu)要(yao)在構(gou)造(zao)(zao)函(han)數(shu)中初(chu)始化任何變(bian)量(liang).要(yao)用(yong)(yong)Awake或(huo)(huo)Start函(han)數(shu)來實現.即便(bian)是在編輯模式,Unity仍會自動調(diao)(diao)用(yong)(yong)構(gou)造(zao)(zao)函(han)數(shu).這(zhe)通常是在一個腳本編譯之(zhi)后,因為需要(yao)調(diao)(diao)用(yong)(yong)腳本的(de)構(gou)造(zao)(zao)函(han)數(shu)來取回(hui)腳本的(de)默認(ren)值(zhi).我們無法預(yu)計何時調(diao)(diao)用(yong)(yong)構(gou)造(zao)(zao)函(han)數(shu),它或(huo)(huo)許會被(bei)預(yu)置(zhi)體或(huo)(huo)未(wei)激活(huo)的(de)游(you)戲(xi)對象所調(diao)(diao)用(yong)(yong).
單一模式使用構造函數(shu)可能會(hui)導致嚴重(zhong)后果,會(hui)帶來類似隨(sui)機的空參(can)數(shu)異(yi)常(chang).
因此,如果你想實現單(dan)一模式不要用(yong)構造函(han)數(shu),要用(yong)Awake函(han)數(shu).事實上(shang),你沒(mei)必要在繼(ji)承自MonoBehaviour的類的構造函(han)數(shu)中寫任何代碼. Unity3D C#腳本 get/set寫法屬性(xing)不被識別,直(zhi)接public字段(duan)就(jiu)能(neng)當屬性(xing)用(yong),private或者不寫修(xiu)飾(shi)符就(jiu)是私有(you)字段(duan)。


8 .腳(jiao)本中文(wen)(wen)問(wen)題:代碼中有中文(wen)(wen)的話會(hui)有亂(luan)碼問(wen)題。到資源管(guan)理器(qi)中打開(kai)項目(mu)的Assets文(wen)(wen)件(jian)(jian)夾(或(huo)點右鍵Show In Explorer),用unity3d目(mu)錄下(xia)的Editor\Data\Tools\UniSciTE下(xia)的UniSciTE.exe打開(kai)cs文(wen)(wen)件(jian)(jian),File→Encoding改(gai)(gai)為UTF-8 with BOM,敲(qiao)個空格造成修(xiu)改(gai)(gai),然(ran)后保存即可(可以(yi)修(xiu)改(gai)(gai)cs文(wen)(wen)件(jian)(jian)打開(kai)方式更簡單)。好一開(kai)始就修(xiu)改(gai)(gai)編碼,否則會(hui)很麻煩。
完整的代碼:

第二:這里基(ji)本講解一(yi)下當打開(kai)一(yi)個腳本自帶的兩(liang)個函數Start、和(he)Update的用法和(he)意思
1.Start
對于這(zhe)個(ge)函(han)(han)(han)數(shu)我(wo)(wo)(wo)想不(bu)(bu)(bu)用(yong)多講(jiang),大家從(cong)字面意思就能(neng)理(li)解(jie),程(cheng)序開始(shi)執行時調用(yong)的函(han)(han)(han)數(shu)。上面提到Unity3D中(zhong)(zhong)(zhong)初(chu)(chu)始(shi)化(hua)不(bu)(bu)(bu)能(neng)放在構(gou)造(zao)函(han)(han)(han)數(shu)中(zhong)(zhong)(zhong)要放到Start函(han)(han)(han)數(shu)中(zhong)(zhong)(zhong)。從(cong)某種意義上講(jiang)可以理(li)解(jie)為Unity3D把(ba)傳統的構(gou)造(zao)函(han)(han)(han)數(shu)用(yong)這(zhe)里的Start來替換(huan)了(le)(這(zhe)里完全屬(shu)于個(ge)人理(li)解(jie)如(ru)果不(bu)(bu)(bu)理(li)解(jie)不(bu)(bu)(bu)正確(que)希(xi)望大神指出)。所以我(wo)(wo)(wo)們把(ba)Start理(li)解(jie)為構(gou)造(zao)函(han)(han)(han)數(shu)自然(ran)就容易(yi)理(li)解(jie)為什么初(chu)(chu)始(shi)化(hua)要放到Start中(zhong)(zhong)(zhong)了(le)。這(zhe)個(ge)函(han)(han)(han)數(shu)主要用(yong)于對一些游(you)戲(xi)資源的初(chu)(chu)始(shi)化(hua)用(yong)的。我(wo)(wo)(wo)相信(xin)這(zhe)個(ge)函(han)(han)(han)數(shu)大家容易(yi)理(li)解(jie),這(zhe)里都不(bu)(bu)(bu)多講(jiang)了(le)。 重點看(kan)下面一個(ge)。
2.Update
這個函(han)數(shu)可以說(shuo)是(shi)一(yi)個核心函(han)數(shu)。這里先問(wen)一(yi)下?您知道什么是(shi)幀(zhen)的(de)(de)概念(nian)嗎?如果處理過(guo)視(shi)頻、弄(nong)過(guo)ps、flash之類的(de)(de)做(zuo)動(dong)態的(de)(de)視(shi)頻或者(zhe)動(dong)畫的(de)(de)朋友(you)可能對這個幀(zhen)比較了(le)解。我這里簡單(dan)描述一(yi)下幀(zhen)的(de)(de)概念(nian)。大家(jia)先回想一(yi)下很(hen)久以前的(de)(de)那種電影是(shi)怎么做(zuo)的(de)(de)?

沒錯就(jiu)(jiu)(jiu)是(shi)(shi)你看(kan)到(dao)的(de)(de)(de)這(zhe)樣一(yi)張(zhang)一(yi)張(zhang)連接(jie)而成(cheng)的(de)(de)(de),然后快速瀏覽每(mei)一(yi)張(zhang)就(jiu)(jiu)(jiu)形成(cheng)了(le)動畫。我們現(xian)在(zai)看(kan)到(dao)的(de)(de)(de)視頻、Gif等等一(yi)些都是(shi)(shi)類這(zhe)種電(dian)影(ying)(ying)的(de)(de)(de)膠片一(yi)張(zhang)一(yi)個(ge)(ge)圖(tu)像一(yi)個(ge)(ge)圖(tu)像拼接(jie)的(de)(de)(de),然后每(mei)秒播放不低(di)于多少張(zhang)就(jiu)(jiu)(jiu)會形成(cheng)動畫。講了(le)這(zhe)么多那什么是(shi)(shi)幀(zhen)呢?幀(zhen)就(jiu)(jiu)(jiu)可以形象的(de)(de)(de)理解為這(zhe)電(dian)影(ying)(ying)膠卷的(de)(de)(de)每(mei)一(yi)個(ge)(ge)圖(tu)片。
我這里引(yin)用一下百(bai)度(du)百(bai)科
幀——就是影像動畫中小(xiao)單位(wei)的(de)單幅影像畫面,相(xiang)當于電影膠片上的(de)每一(yi)格鏡頭。 一(yi)幀就是一(yi)副靜止的(de)畫面,連續的(de)幀就形(xing)成動畫,如電視圖象等。
你(ni)(ni)這(zhe)時就會問講這(zhe)么(me)多(duo)廢(fei)話(hua),Update到底是(shi)怎么(me)回(hui)事還沒說呢(ni)?先別(bie)忙,如果您對幀這(zhe)個(ge)概念(nian)不熟悉那么(me)你(ni)(ni)對這(zhe)個(ge)函(han)數(shu)的理解就會還停留在(zai).net中的事件驅動(dong)的那個(ge)機制。從(cong)字面理解Update就是(shi)刷新(xin)、更(geng)新(xin)的意思,那它(ta)(ta)刷新(xin)什(shen)么(me)更(geng)新(xin)什(shen)么(me)呢(ni)?我們(men)用的Unity3d程序可以看(kan)作就是(shi)一(yi)個(ge)電影,當你(ni)(ni)一(yi)運(yun)行(xing)它(ta)(ta),他就開(kai)(kai)始一(yi)幀一(yi)幀開(kai)(kai)始放(fang)映,每(mei)播放(fang)一(yi)幀就會調用一(yi)下這(zhe)個(ge)Update函(han)數(shu)。還有(you)另一(yi)個(ge)函(han)數(shu)fixupdate 是(shi)固(gu)定(ding)時間(jian)反(fan)復刷新(xin),固(gu)定(ding)時間(jian)可以在(zai)Edit-> Project Settings ->Time進(jin)行(xing)設(she)置。
Debug.Log()函數(shu)可以(yi)在(zai)程(cheng)序(xu)中增加打印(yin),在(zai)Console面板可以(yi)看打印(yin)輸出,方便(bian)程(cheng)序(xu)定位。

