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