當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > unity3D中的C#編程入門
第一:Unity3D中的C#腳本與.net中的C#寫法的區(qū)別
1. Inherit from MonoBehaviour
繼承自MonoBehaviour
所有的行為腳本必須從MonoBehaviour繼承(直接的或間接的).在JavaScript 中這個是自動完成的,但是在C#或Boo中,必須顯示注明.如果你通過Asset -> Create -> C Sharp/Boo Script創(chuàng)建腳本,系統(tǒng)模版已經(jīng)包含了必要的定義.
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
2. Use the Awake or Start function to do initialisation.
使用Awake或Start函數(shù)初始化.
Awake和Start的不同之處在于,Awake是在加載場景時運(yùn)行,Start是在第一次調(diào)用Update或FixedUpdate函數(shù)之前被調(diào)用,Awake函數(shù)運(yùn)行在所有Start函數(shù)之前.
3. The class name must match the file name.
類名字必須匹配文件名.
JavaScript中類名被隱式的設(shè)置為腳本的文件名(不包含文件擴(kuò)展名).在C#和Boo中必須手工編寫.
4. Coroutines have a different syntax in C#.
C#中協(xié)同程序有不同的句法規(guī)則.
Coroutines必須是IEnumerator返回類型,并且yield用yield return替代.
using System.Collections;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine // C# 協(xié)同程序
IEnumerator SomeCoroutine () {
// Wait for one frame // 等一幀
yield return 0;
// Wait for two seconds // 等兩秒
yield return new WaitForSeconds (2);
}
}
5. Don't use namespaces.
不要使用命名空間
目前Unity暫不支持命名空間.或許未來版本會有.
6. Only member variables are serialized and are shown in the Inspector.
只有序列化的成員變量才能顯示在檢視面板
私有和保護(hù)變量只能在專家模式中顯示.屬性不被序列化或顯示在檢視面板.
7. Avoid using the constructor.
避免使用構(gòu)造函數(shù)
Unity3D C#腳本初始化不要放到構(gòu)造函數(shù)中,而是放到Start()方法中。
不要在構(gòu)造函數(shù)中初始化任何變量.要用Awake或Start函數(shù)來實(shí)現(xiàn).即便是在編輯模式,Unity仍會自動調(diào)用構(gòu)造函數(shù).這通常是在一個腳本編譯之后,因?yàn)樾枰{(diào)用腳本的構(gòu)造函數(shù)來取回腳本的默認(rèn)值.我們無法預(yù)計(jì)何時調(diào)用構(gòu)造函數(shù),它或許會被預(yù)置體或未激活的游戲?qū)ο笏{(diào)用.
單一模式使用構(gòu)造函數(shù)可能會導(dǎo)致嚴(yán)重后果,會帶來類似隨機(jī)的空參數(shù)異常.
因此,如果你想實(shí)現(xiàn)單一模式不要用構(gòu)造函數(shù),要用Awake函數(shù).事實(shí)上,你沒必要在繼承自MonoBehaviour的類的構(gòu)造函數(shù)中寫任何代碼. Unity3D C#腳本 get/set寫法屬性不被識別,直接public字段就能當(dāng)屬性用,private或者不寫修飾符就是私有字段。
8 .腳本中文問題:代碼中有中文的話會有亂碼問題。到資源管理器中打開項(xiàng)目的Assets文件夾(或點(diǎn)右鍵Show In Explorer),用unity3d目錄下的Editor\Data\Tools\UniSciTE下的UniSciTE.exe打開cs文件,F(xiàn)ile→Encoding改為UTF-8 with BOM,敲個空格造成修改,然后保存即可(可以修改cs文件打開方式更簡單)。好一開始就修改編碼,否則會很麻煩。
完整的代碼:
第二:這里基本講解一下當(dāng)打開一個腳本自帶的兩個函數(shù)Start、和Update的用法和意思
1.Start
對于這個函數(shù)我想不用多講,大家從字面意思就能理解,程序開始執(zhí)行時調(diào)用的函數(shù)。上面提到Unity3D中初始化不能放在構(gòu)造函數(shù)中要放到Start函數(shù)中。從某種意義上講可以理解為Unity3D把傳統(tǒng)的構(gòu)造函數(shù)用這里的Start來替換了(這里完全屬于個人理解如果不理解不正確希望大神指出)。所以我們把Start理解為構(gòu)造函數(shù)自然就容易理解為什么初始化要放到Start中了。這個函數(shù)主要用于對一些游戲資源的初始化用的。我相信這個函數(shù)大家容易理解,這里都不多講了。 重點(diǎn)看下面一個。
2.Update
這個函數(shù)可以說是一個核心函數(shù)。這里先問一下?您知道什么是幀的概念嗎?如果處理過視頻、弄過ps、flash之類的做動態(tài)的視頻或者動畫的朋友可能對這個幀比較了解。我這里簡單描述一下幀的概念。大家先回想一下很久以前的那種電影是怎么做的?
沒錯就是你看到的這樣一張一張連接而成的,然后快速瀏覽每一張就形成了動畫。我們現(xiàn)在看到的視頻、Gif等等一些都是類這種電影的膠片一張一個圖像一個圖像拼接的,然后每秒播放不低于多少張就會形成動畫。講了這么多那什么是幀呢?幀就可以形象的理解為這電影膠卷的每一個圖片。
我這里引用一下百度百科
幀——就是影像動畫中小單位的單幅影像畫面,相當(dāng)于電影膠片上的每一格鏡頭。 一幀就是一副靜止的畫面,連續(xù)的幀就形成動畫,如電視圖象等。
你這時就會問講這么多廢話,Update到底是怎么回事還沒說呢?先別忙,如果您對幀這個概念不熟悉那么你對這個函數(shù)的理解就會還停留在.net中的事件驅(qū)動的那個機(jī)制。從字面理解Update就是刷新、更新的意思,那它刷新什么更新什么呢?我們用的Unity3d程序可以看作就是一個電影,當(dāng)你一運(yùn)行它,他就開始一幀一幀開始放映,每播放一幀就會調(diào)用一下這個Update函數(shù)。還有另一個函數(shù)fixupdate 是固定時間反復(fù)刷新,固定時間可以在Edit-> Project Settings ->Time進(jìn)行設(shè)置。
Debug.Log()函數(shù)可以在程序中增加打印,在Console面板可以看打印輸出,方便程序定位。