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