在 Unity 3D 中編程首選 C# 作為編程腳本語言。
變量
任何一個腳本中都缺不了變量,C# 腳本也不例外。
變量主要用于存儲數(shù)據(jù),在 Unity 3D 的腳本中,每個變量必須擁有唯一的名稱,腳本在識讀變量時采用的是字符串匹配方式,所以對變量名稱大小寫敏感。
一旦 Unity 3D 腳本掛到某個 Unity 3D 對象上,在 Unity 3D 的屬性面板中就會顯示出該腳本中的各個公共變量。開發(fā)人員也可以在屬性面板中對公共變量的值進行設(shè)置,設(shè)置后的值將會影響腳本的運行,相當于在腳本中對該變量進行了賦值。
在 Unity 3D 中,定義 C# 變量的格式如下:
數(shù)據(jù)類型 變量名稱
int age;
可以通過對變量賦值來對其初始化,賦值時使用賦值運算符“=”。
賦值的格式有兩種,一種是
int age;
age=5;
另一種是以字面形式初始化,形式如下:
int age=5;
變量有 6 種數(shù)據(jù)類型。
整數(shù)類型的變量取整數(shù)數(shù)值。C# 將整數(shù)分為 8 種類型,如下表所示。使用時,根據(jù)數(shù)值的可能大小,選擇范圍最小的類型,一般常用的類型為 short、int 和 long 3 種。例如:
byte classSize=23;
ushort student=2344;
選項 | 描述 | 取值范圍 |
---|---|---|
sbyte |
有符號 8 位整數(shù) | -128 ?127 |
byte |
無符號 8 位整數(shù) | 0 ?255 |
short |
有符號 16 位整數(shù) | -32768?32767 |
ushort |
無符號 16 位整數(shù) | 0?65535 |
int |
有符號 32 位整數(shù) | -2147489648?2147483647 |
uint |
無符號 32 位整數(shù) | 0?42994967295 |
long |
有符號 64 位整數(shù) | -2?3 ?2?3 |
ulong |
無符號 64 位整數(shù) | 0 ?2?? |
浮點類型變量主要用于處理含有小數(shù)的數(shù)值數(shù)據(jù)。根據(jù)小數(shù)位數(shù)不同,C# 提供了單精度浮點類型 float
和雙精度浮點類型 double
,例如:
float angles=36.5f;
double rate=0.253D;
C# 的浮點類型如下表所示。
選項 | 描述 | 取值范圍 |
---|---|---|
float |
32位單精度浮點類型 | -212??212? |
double |
64位單精度浮點類型 | -21?2??21?2? |
布爾(bool)類型表示真或假,布爾類型變量的值只能是 true
或 false
,不能將其他的值賦給布爾類型。例如:
bool b=true;
在定義全局變量時,若沒有特殊要求,不用對整數(shù)類型、浮點類型和布爾類型的變量進行初始化,整數(shù)類型和浮點類型的變量默認初始化為 0
,布爾類型的變量默認初始化為 false
。
為保存單個字符,C# 支持字符(char)類型,字符類型的字面量是用單引號括起來的。一些特殊字符要用反斜線\
后跟一個字符表示,稱為轉(zhuǎn)義字符,如下表所示。
轉(zhuǎn)義字符 | 描述 |
---|---|
\' |
單引號 |
\" |
雙引號 |
\\ |
反斜線 |
\0 |
空 |
\a |
報警 |
\b |
退格 |
\f |
換頁 |
\n |
換行 |
\r |
回車 |
\t |
水平制表符 |
\v |
垂直制表符 |
引用類型是構(gòu)建 C# 應(yīng)用程序的主要數(shù)據(jù)類型,C# 的所有引用類型均派生自 System.Object
。
引用類型可以派生出新的類型,也可以包含空(null
)值。引用類型變量的賦值只復(fù)制對象的引用,而不復(fù)制對象本身。
枚舉類型
枚舉類型為定義一組可以賦給變量的命名整數(shù)常量提供了一種有效的方法。
編寫日期相關(guān)的應(yīng)用程序時,經(jīng)常需要使用年、月、日、星期等數(shù)據(jù)??梢詫⑦@些數(shù)據(jù)組織成多個不同名稱的枚舉類型。
使用枚舉類型可以增強程序的可讀性,在 C# 中使用關(guān)鍵字 enum
類聲明枚舉類型的變量,格式如下:
enum枚舉名稱
{
常量1=值1;
常量2=值2;
...
常量n=值n
}
變量的聲明
聲明變量就是指定變量的名稱和類型,未經(jīng)聲明的變量不能在程序中使用。
在 C# 中,聲明一個變量由一個類型和跟在后面的一個或多個變量名組成,多個變量之間用逗號分開,聲明變量以分號結(jié)束。例如:
int age=30;
float rate=20f;
string name="Tom";
在 C# 的變量聲明之前還可以添加訪問修飾符:
private
(默認修飾符),只能在本類中訪問。protected
,只能在類或派生類中訪問。internal
,只能在本項目中訪問。
如果想讓腳本中定義的變量在 Unity 3D 中的 Inspector
面板上顯示,必須用 public
修飾。
在聲明變量時,要注意變量名的命名規(guī)則: 變量名必須以字母開頭; 變量名只能由字母、數(shù)字和下畫線組成,而不能包含空格、標點符號、運算符等其他符號; 變量名不能與 C# 中的關(guān)鍵字名稱相同; 變量名不能與 C# 中的庫函數(shù)名稱相同。
表達式和運算符
表達式是由運算符和操作數(shù)組成的。
運算符設(shè)置對操作數(shù)進行什么樣的運算,例如,加、減、乘、除都是運算符。
操作數(shù)是計算機指令的組成部分,它指出了指令執(zhí)行的操作所需要的數(shù)據(jù)來源。
操作數(shù)包括文本、常量、變量和表達式等。例如:
int i=256;
i=256/2+125;
int j=2;
j=j*j-2;
運算符用于執(zhí)行表達式運算,會針對一個以上操作數(shù)進行運算。例如 2+3,操作數(shù)是 2 和 3,而運算符是+
。
運算符的種類很多,包括算術(shù)運算符、簡單賦值運算符、關(guān)系運算符、位邏輯運算符、位移運算符以及特殊算術(shù)運算符等,與 JavaScript 類似,在此不再贅述。
語句
當表達式中有多個運算符時,需要考慮運算符的執(zhí)行順序,也就是運算符的優(yōu)先級。
例如,要對一本書的信息進行記錄,書名為《程序設(shè)計語言》,價格為 36.5 元,書的編號為 243434。在代碼中定義 3 個變量 bookName
、Price
、bookID
分別用來保存書名、價格以及編號,并分別對這3個變量進行賦值和輸出,代碼如下:
class Program
{
static void Main(string[]args){
string bookName="程序設(shè)計語言";
Console.WriteLine("書名"+bookName);
float Price=36.5f;
Console.WriteLine("價格"+Price);
string bookID="243434";
Console.WriteLine("編號"+bookID);
}
}
在該實例中,首先定義變量,為其賦值,然后輸出變量的值,程序是自上而下地一行一行順序執(zhí)行。
在日常生活中,并非所有的事情都能按部就班地進行,程序也一樣。為了實現(xiàn)一定的目標,經(jīng)常需要改變程序語句執(zhí)行的順序。
在程序中,有時需要在滿足某種條件時再執(zhí)行某一語句。為了達到目標而進行選擇的語句就是選擇分支語句。
if
語句。
一個 if
語句后可跟一個可選的 else
語句,else
語句在布爾表達式為假時執(zhí)行。C# 中 if…else
語句的語法如下:
if(布爾表達式){
如果布爾表達式為真執(zhí)行的語句
}else{
如果布爾表達式為假執(zhí)行的語句
}
如果布爾表達式為 true
,則執(zhí)行 if
塊內(nèi)的代碼;如果布爾表達式為 false
,則執(zhí)行 else
塊內(nèi)的代碼。
一個 if
語句后可跟一個可選的 else
if…else
語句,這種形式可用于測試多種條件。C# 中 if…else
語句的語法如下:
if(布爾表達式1)
{當布爾表達式1為真時執(zhí)行的語句}
else if(布爾表達式2)
{當布爾表達式2為真時執(zhí)行的語句}
else if(布爾表達式3)
{當布爾表達式3為真時執(zhí)行的語句}
else
{當上面的條件都不為真時執(zhí)行的語句}
switch
語句。
當程序做條件判斷時,可以用 if…else
語句,但是當條件很多時,如果還用 if…else
語句是很麻煩的。為了解決這個問題,C# 設(shè)置了分支語句 switch
。其語法格式如下:
switch(值)
{
case值1:語句1;
break;
case值2:語句2;
break;
····
case值n:語句n;
break;
}
當 switch
后面的值取某一值時,就執(zhí)行相應(yīng) case
后面的語句。例如,當值是值 1 時,執(zhí)行語句 1;當值是值 2 時,執(zhí)行語句 2……當值是 n 時,執(zhí)行語句 n。
do…while
循環(huán)。
do…while
循環(huán)是在循環(huán)的尾部檢查條件。
do…while
循環(huán)與 while
循環(huán)類似,但是 do…while
循環(huán)至少會確保一次循環(huán)。
C# 中的 do…while
循環(huán)語法如下:
do{
語句
}while(條件);
條件表達式出現(xiàn)在循環(huán)的尾部,所以循環(huán)中的語句會在條件被測試之前至少執(zhí)行一次。如果條件為真,控制流會轉(zhuǎn)回上面的
do
,重新執(zhí)行循環(huán)中的語句。這個過程會不斷重復(fù),直到給定條件變?yōu)榧贋橹埂?/p>
while
循環(huán)。
在 C# 中 while
循環(huán)是常用的一種循環(huán)語句,while
循環(huán)的特點是直到條件為假時才跳出循環(huán)。C# 中的 while
循環(huán)的語法如下:
while(條件)
{語句}
在這里,語句可以是一個語句,也可以是幾個語句組成的代碼塊。條件可以是任意的表達式,當為任意非零值時都為真。當條件為真時執(zhí)行循環(huán);當條件為假時,程序流將繼續(xù)執(zhí)行緊接著循環(huán)的下一條語句。
while
循環(huán)的關(guān)鍵點是循環(huán)可能一次都不會執(zhí)行。當條件測試的結(jié)果為假時,會跳過循環(huán)主體,直接執(zhí)行 while
循環(huán)的下一條語句。
for
循環(huán)。
for
循環(huán)適合指定循環(huán)次數(shù)的應(yīng)用,在使用時,需初始化一個作為計數(shù)器的變量值。例如:
for(int i=1;i<=10;i++){
Console.WriteLine("{0}, i");
}
上面的 for
語句聲明了計數(shù)器變量后,使用分號分開,接著給出條件判斷的表達式 i2=10
,再使用分號分開,最后給出對計算器變量的操作 i++
。如果把 i++
放在循環(huán)體內(nèi)也是可以的。
函數(shù)
在 Unity 3D 中,C# 腳本需要預(yù)先載入類庫,代碼示例如下:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript:MonoBehaviour{
}
其中,NewBehaviourScript
是腳本的名稱,它必須和腳本文件的名稱一致(如果不同,腳本無法在物體上被執(zhí)行)。
所有游戲執(zhí)行語句都包含在這個繼承自 MonoBehaviour
類的自創(chuàng)腳本中。
Unity 3D 腳本中的常用函數(shù)如下:
Update()
正常更新,創(chuàng)建 JavaScript 腳本時默認添加這個方法,每一幀都會由系統(tǒng)調(diào)用一次該方法。
LateUpdate()
推遲更新,此方法在 Update()
方法執(zhí)行完后調(diào)用,每一幀都調(diào)用一次。
FixedUpdate()
置于這個函數(shù)中的代碼每隔一定時間執(zhí)行一次。
Awake()
腳本喚醒,用于腳本的初始化,在腳本生命周期中執(zhí)行一次。
Start()
在 Update()
之前、Awake()
之后執(zhí)行。Start()
函數(shù)和 Awake()
函數(shù)的不同點在于 Start()
函數(shù)僅在腳本啟用時執(zhí)行。
OnDestroy()
當前腳本銷毀時調(diào)用。
OnGUI()
繪制游戲界面的函數(shù),因為每一幀要執(zhí)行多次,所以一些時間相關(guān)的函數(shù)要盡量避免直接在該函數(shù)內(nèi)部使用。
OnCollisionEnter()
當一個游戲?qū)ο笈c另外的游戲?qū)ο笈鲎矔r執(zhí)行這個函數(shù)。
OnMouseDown()
當鼠標在一個載有 GUI
元素(GUI Element)或碰撞器(Collider)的游戲?qū)ο笊习聪聲r執(zhí)行該函數(shù)。
OnMouseOver()
當鼠標在一個載有 GUI
元素或碰撞器的游戲?qū)ο笊辖?jīng)過時執(zhí)行該函數(shù)。
OnMouseEnter()
鼠標進入物體范圍時執(zhí)行該函數(shù)。和 OnMouseOver()
不同,OnMouseEnter()
函數(shù)只執(zhí)行一次。
OnMouseExit()
鼠標離開物體范圍時執(zhí)行該函數(shù)。
OnMouseUp()
當鼠標釋放時執(zhí)行該函數(shù)。
OnMouseDrag()
按住鼠標拖動對象時執(zhí)行該函數(shù)。
更多建議: