Unity 3D C# 腳本基礎(chǔ)

2022-05-25 15:39 更新

在 Unity 3D 中編程首選 C# 作為編程腳本語(yǔ)言。

變量

  1. 變量定義。

任何一個(gè)腳本中都缺不了變量,C# 腳本也不例外。

變量主要用于存儲(chǔ)數(shù)據(jù),在 Unity 3D 的腳本中,每個(gè)變量必須擁有唯一的名稱,腳本在識(shí)讀變量時(shí)采用的是字符串匹配方式,所以對(duì)變量名稱大小寫(xiě)敏感。

一旦 Unity 3D 腳本掛到某個(gè) Unity 3D 對(duì)象上,在 Unity 3D 的屬性面板中就會(huì)顯示出該腳本中的各個(gè)公共變量。開(kāi)發(fā)人員也可以在屬性面板中對(duì)公共變量的值進(jìn)行設(shè)置,設(shè)置后的值將會(huì)影響腳本的運(yùn)行,相當(dāng)于在腳本中對(duì)該變量進(jìn)行了賦值。

在 Unity 3D 中,定義 C# 變量的格式如下:

  1. 數(shù)據(jù)類(lèi)型 變量名稱
  2. int age;

  1. 變量賦值。

可以通過(guò)對(duì)變量賦值來(lái)對(duì)其初始化,賦值時(shí)使用賦值運(yùn)算符“=”。

賦值的格式有兩種,一種是

  1. int age;
  2. age=5;

另一種是以字面形式初始化,形式如下:

  1. int age=5;

  1. 變量的數(shù)據(jù)類(lèi)型。

變量有 6 種數(shù)據(jù)類(lèi)型。

  • 整數(shù)類(lèi)型

整數(shù)類(lèi)型的變量取整數(shù)數(shù)值。C# 將整數(shù)分為 8 種類(lèi)型,如下表所示。使用時(shí),根據(jù)數(shù)值的可能大小,選擇范圍最小的類(lèi)型,一般常用的類(lèi)型為 short、int 和 long 3 種。例如:

  1. byte classSize=23;
  2. ushort student=2344;
選項(xiàng) 描述 取值范圍
sbyte 有符號(hào) 8 位整數(shù) -128 ?127
byte 無(wú)符號(hào) 8 位整數(shù) 0 ?255
short 有符號(hào) 16 位整數(shù) -32768?32767
ushort 無(wú)符號(hào) 16 位整數(shù) 0?65535
int 有符號(hào) 32 位整數(shù) -2147489648?2147483647
uint 無(wú)符號(hào) 32 位整數(shù) 0?42994967295
long 有符號(hào) 64 位整數(shù) -2?3 ?2?3
ulong 無(wú)符號(hào) 64 位整數(shù) 0 ?2??

  • 浮點(diǎn)類(lèi)型

浮點(diǎn)類(lèi)型變量主要用于處理含有小數(shù)的數(shù)值數(shù)據(jù)。根據(jù)小數(shù)位數(shù)不同,C# 提供了單精度浮點(diǎn)類(lèi)型 float 和雙精度浮點(diǎn)類(lèi)型 double,例如:

  1. float angles=36.5f;
  2. double rate=0.253D;

C# 的浮點(diǎn)類(lèi)型如下表所示。

選項(xiàng) 描述 取值范圍
float 32位單精度浮點(diǎn)類(lèi)型 -212??212?
double 64位單精度浮點(diǎn)類(lèi)型 -21?2??21?2?

  • 布爾類(lèi)型

布爾(bool)類(lèi)型表示真或假,布爾類(lèi)型變量的值只能是 truefalse,不能將其他的值賦給布爾類(lèi)型。例如:

  1. bool b=true;

在定義全局變量時(shí),若沒(méi)有特殊要求,不用對(duì)整數(shù)類(lèi)型、浮點(diǎn)類(lèi)型和布爾類(lèi)型的變量進(jìn)行初始化,整數(shù)類(lèi)型和浮點(diǎn)類(lèi)型的變量默認(rèn)初始化為 0,布爾類(lèi)型的變量默認(rèn)初始化為 false。

  • 字符類(lèi)型

為保存單個(gè)字符,C# 支持字符(char)類(lèi)型,字符類(lèi)型的字面量是用單引號(hào)括起來(lái)的。一些特殊字符要用反斜線\后跟一個(gè)字符表示,稱為轉(zhuǎn)義字符,如下表所示。

轉(zhuǎn)義字符 描述
\' 單引號(hào)
\" 雙引號(hào)
\\ 反斜線
\0
\a 報(bào)警
\b 退格
\f 換頁(yè)
\n 換行
\r 回車(chē)
\t 水平制表符
\v 垂直制表符

  • 引用類(lèi)型

引用類(lèi)型是構(gòu)建 C# 應(yīng)用程序的主要數(shù)據(jù)類(lèi)型,C# 的所有引用類(lèi)型均派生自 System.Object。

引用類(lèi)型可以派生出新的類(lèi)型,也可以包含空(null)值。引用類(lèi)型變量的賦值只復(fù)制對(duì)象的引用,而不復(fù)制對(duì)象本身。 枚舉類(lèi)型 枚舉類(lèi)型為定義一組可以賦給變量的命名整數(shù)常量提供了一種有效的方法。

編寫(xiě)日期相關(guān)的應(yīng)用程序時(shí),經(jīng)常需要使用年、月、日、星期等數(shù)據(jù)??梢詫⑦@些數(shù)據(jù)組織成多個(gè)不同名稱的枚舉類(lèi)型。

使用枚舉類(lèi)型可以增強(qiáng)程序的可讀性,在 C# 中使用關(guān)鍵字 enum 類(lèi)聲明枚舉類(lèi)型的變量,格式如下:

  1. enum枚舉名稱
  2. {
  3. 常量1=值1;
  4. 常量2=值2;
  5. ...
  6. 常量n=值n
  7. }

變量的聲明

聲明變量就是指定變量的名稱和類(lèi)型,未經(jīng)聲明的變量不能在程序中使用。

C# 中,聲明一個(gè)變量由一個(gè)類(lèi)型和跟在后面的一個(gè)或多個(gè)變量名組成,多個(gè)變量之間用逗號(hào)分開(kāi),聲明變量以分號(hào)結(jié)束。例如:

  1. int age=30;
  2. float rate=20f;
  3. string name="Tom";

C# 的變量聲明之前還可以添加訪問(wèn)修飾符:

  • private(默認(rèn)修飾符),只能在本類(lèi)中訪問(wèn)。

  • protected,只能在類(lèi)或派生類(lèi)中訪問(wèn)。

  • internal,只能在本項(xiàng)目中訪問(wèn)。

如果想讓腳本中定義的變量在 Unity 3D 中的 Inspector 面板上顯示,必須用 public 修飾。

在聲明變量時(shí),要注意變量名的命名規(guī)則: 變量名必須以字母開(kāi)頭; 變量名只能由字母、數(shù)字和下畫(huà)線組成,而不能包含空格、標(biāo)點(diǎn)符號(hào)、運(yùn)算符等其他符號(hào); 變量名不能與 C# 中的關(guān)鍵字名稱相同; 變量名不能與 C# 中的庫(kù)函數(shù)名稱相同。

表達(dá)式和運(yùn)算符

  1. 表達(dá)式。

表達(dá)式是由運(yùn)算符和操作數(shù)組成的。

運(yùn)算符設(shè)置對(duì)操作數(shù)進(jìn)行什么樣的運(yùn)算,例如,加、減、乘、除都是運(yùn)算符。

操作數(shù)是計(jì)算機(jī)指令的組成部分,它指出了指令執(zhí)行的操作所需要的數(shù)據(jù)來(lái)源。

操作數(shù)包括文本、常量、變量和表達(dá)式等。例如:

  1. int i=256;
  2. i=256/2+125;
  3. int j=2;
  4. j=j*j-2;

  1. 運(yùn)算符。

運(yùn)算符用于執(zhí)行表達(dá)式運(yùn)算,會(huì)針對(duì)一個(gè)以上操作數(shù)進(jìn)行運(yùn)算。例如 2+3,操作數(shù)是 2 和 3,而運(yùn)算符是+

運(yùn)算符的種類(lèi)很多,包括算術(shù)運(yùn)算符、簡(jiǎn)單賦值運(yùn)算符、關(guān)系運(yùn)算符、位邏輯運(yùn)算符、位移運(yùn)算符以及特殊算術(shù)運(yùn)算符等,與 JavaScript 類(lèi)似,在此不再贅述。

語(yǔ)句

  1. 順序執(zhí)行語(yǔ)句。

當(dāng)表達(dá)式中有多個(gè)運(yùn)算符時(shí),需要考慮運(yùn)算符的執(zhí)行順序,也就是運(yùn)算符的優(yōu)先級(jí)。

例如,要對(duì)一本書(shū)的信息進(jìn)行記錄,書(shū)名為《程序設(shè)計(jì)語(yǔ)言》,價(jià)格為 36.5 元,書(shū)的編號(hào)為 243434。在代碼中定義 3 個(gè)變量 bookName、Price、bookID 分別用來(lái)保存書(shū)名、價(jià)格以及編號(hào),并分別對(duì)這3個(gè)變量進(jìn)行賦值和輸出,代碼如下:

  1. class Program
  2. {
  3. static void Main(string[]args){
  4. string bookName="程序設(shè)計(jì)語(yǔ)言";
  5. Console.WriteLine("書(shū)名"+bookName);
  6. float Price=36.5f;
  7. Console.WriteLine("價(jià)格"+Price);
  8. string bookID="243434";
  9. Console.WriteLine("編號(hào)"+bookID);
  10. }
  11. }

在該實(shí)例中,首先定義變量,為其賦值,然后輸出變量的值,程序是自上而下地一行一行順序執(zhí)行。

  1. 選擇分支語(yǔ)句。

在日常生活中,并非所有的事情都能按部就班地進(jìn)行,程序也一樣。為了實(shí)現(xiàn)一定的目標(biāo),經(jīng)常需要改變程序語(yǔ)句執(zhí)行的順序。

在程序中,有時(shí)需要在滿足某種條件時(shí)再執(zhí)行某一語(yǔ)句。為了達(dá)到目標(biāo)而進(jìn)行選擇的語(yǔ)句就是選擇分支語(yǔ)句。

  • if語(yǔ)句。

一個(gè) if 語(yǔ)句后可跟一個(gè)可選的 else 語(yǔ)句,else 語(yǔ)句在布爾表達(dá)式為假時(shí)執(zhí)行。C#if…else 語(yǔ)句的語(yǔ)法如下:

  1. if(布爾表達(dá)式){
  2. 如果布爾表達(dá)式為真執(zhí)行的語(yǔ)句
  3. }else{
  4. 如果布爾表達(dá)式為假執(zhí)行的語(yǔ)句
  5. }

如果布爾表達(dá)式為 true,則執(zhí)行 if 塊內(nèi)的代碼;如果布爾表達(dá)式為 false,則執(zhí)行 else 塊內(nèi)的代碼。

一個(gè) if 語(yǔ)句后可跟一個(gè)可選的 else if…else 語(yǔ)句,這種形式可用于測(cè)試多種條件。C#if…else 語(yǔ)句的語(yǔ)法如下:

  1. if(布爾表達(dá)式1)
  2. {當(dāng)布爾表達(dá)式1為真時(shí)執(zhí)行的語(yǔ)句}
  3. else if(布爾表達(dá)式2)
  4. {當(dāng)布爾表達(dá)式2為真時(shí)執(zhí)行的語(yǔ)句}
  5. else if(布爾表達(dá)式3)
  6. {當(dāng)布爾表達(dá)式3為真時(shí)執(zhí)行的語(yǔ)句}
  7. else
  8. {當(dāng)上面的條件都不為真時(shí)執(zhí)行的語(yǔ)句}

  • switch語(yǔ)句。

當(dāng)程序做條件判斷時(shí),可以用 if…else 語(yǔ)句,但是當(dāng)條件很多時(shí),如果還用 if…else 語(yǔ)句是很麻煩的。為了解決這個(gè)問(wèn)題,C# 設(shè)置了分支語(yǔ)句 switch。其語(yǔ)法格式如下:

  1. switch(值)
  2. {
  3. case1:語(yǔ)句1;
  4. break;
  5. case2:語(yǔ)句2;
  6. break;
  7. ····
  8. casen:語(yǔ)句n;
  9. break;
  10. }

當(dāng) switch 后面的值取某一值時(shí),就執(zhí)行相應(yīng) case 后面的語(yǔ)句。例如,當(dāng)值是值 1 時(shí),執(zhí)行語(yǔ)句 1;當(dāng)值是值 2 時(shí),執(zhí)行語(yǔ)句 2……當(dāng)值是 n 時(shí),執(zhí)行語(yǔ)句 n。

  1. 循環(huán)語(yǔ)句。

  • do…while 循環(huán)。

do…while 循環(huán)是在循環(huán)的尾部檢查條件。 do…while 循環(huán)與 while 循環(huán)類(lèi)似,但是 do…while 循環(huán)至少會(huì)確保一次循環(huán)。

C# 中的 do…while 循環(huán)語(yǔ)法如下:

  1. do{
  2. 語(yǔ)句
  3. }while(條件);

條件表達(dá)式出現(xiàn)在循環(huán)的尾部,所以循環(huán)中的語(yǔ)句會(huì)在條件被測(cè)試之前至少執(zhí)行一次。如果條件為真,控制流會(huì)轉(zhuǎn)回上面的 do,重新執(zhí)行循環(huán)中的語(yǔ)句。這個(gè)過(guò)程會(huì)不斷重復(fù),直到給定條件變?yōu)榧贋橹埂?/p>

  • while 循環(huán)。

C#while 循環(huán)是常用的一種循環(huán)語(yǔ)句,while 循環(huán)的特點(diǎn)是直到條件為假時(shí)才跳出循環(huán)。C# 中的 while 循環(huán)的語(yǔ)法如下:

  1. while(條件)
  2. {語(yǔ)句}

在這里,語(yǔ)句可以是一個(gè)語(yǔ)句,也可以是幾個(gè)語(yǔ)句組成的代碼塊。條件可以是任意的表達(dá)式,當(dāng)為任意非零值時(shí)都為真。當(dāng)條件為真時(shí)執(zhí)行循環(huán);當(dāng)條件為假時(shí),程序流將繼續(xù)執(zhí)行緊接著循環(huán)的下一條語(yǔ)句。

while 循環(huán)的關(guān)鍵點(diǎn)是循環(huán)可能一次都不會(huì)執(zhí)行。當(dāng)條件測(cè)試的結(jié)果為假時(shí),會(huì)跳過(guò)循環(huán)主體,直接執(zhí)行 while 循環(huán)的下一條語(yǔ)句。

  • for 循環(huán)。

for 循環(huán)適合指定循環(huán)次數(shù)的應(yīng)用,在使用時(shí),需初始化一個(gè)作為計(jì)數(shù)器的變量值。例如:

  1. for(int i=1;i<=10;i++){
  2. Console.WriteLine("{0}, i");
  3. }

上面的 for 語(yǔ)句聲明了計(jì)數(shù)器變量后,使用分號(hào)分開(kāi),接著給出條件判斷的表達(dá)式 i2=10,再使用分號(hào)分開(kāi),最后給出對(duì)計(jì)算器變量的操作 i++。如果把 i++ 放在循環(huán)體內(nèi)也是可以的。

函數(shù)

在 Unity 3D 中,C# 腳本需要預(yù)先載入類(lèi)庫(kù),代碼示例如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. public class NewBehaviourScript:MonoBehaviour{
  4. }

其中,NewBehaviourScript 是腳本的名稱,它必須和腳本文件的名稱一致(如果不同,腳本無(wú)法在物體上被執(zhí)行)。

所有游戲執(zhí)行語(yǔ)句都包含在這個(gè)繼承自 MonoBehaviour 類(lèi)的自創(chuàng)腳本中。

Unity 3D 腳本中的常用函數(shù)如下:

  1. Update()

正常更新,創(chuàng)建 JavaScript 腳本時(shí)默認(rèn)添加這個(gè)方法,每一幀都會(huì)由系統(tǒng)調(diào)用一次該方法。

  1. LateUpdate()

推遲更新,此方法在 Update() 方法執(zhí)行完后調(diào)用,每一幀都調(diào)用一次。

  1. FixedUpdate()

置于這個(gè)函數(shù)中的代碼每隔一定時(shí)間執(zhí)行一次。

  1. Awake()

腳本喚醒,用于腳本的初始化,在腳本生命周期中執(zhí)行一次。

  1. Start()

Update() 之前、Awake() 之后執(zhí)行。Start() 函數(shù)和 Awake() 函數(shù)的不同點(diǎn)在于 Start() 函數(shù)僅在腳本啟用時(shí)執(zhí)行。

  1. OnDestroy()

當(dāng)前腳本銷(xiāo)毀時(shí)調(diào)用。

  1. OnGUI()

繪制游戲界面的函數(shù),因?yàn)槊恳粠獔?zhí)行多次,所以一些時(shí)間相關(guān)的函數(shù)要盡量避免直接在該函數(shù)內(nèi)部使用。

  1. OnCollisionEnter()

當(dāng)一個(gè)游戲?qū)ο笈c另外的游戲?qū)ο笈鲎矔r(shí)執(zhí)行這個(gè)函數(shù)。

  1. OnMouseDown()

當(dāng)鼠標(biāo)在一個(gè)載有 GUI 元素(GUI Element)或碰撞器(Collider)的游戲?qū)ο笊习聪聲r(shí)執(zhí)行該函數(shù)。

  1. OnMouseOver()

當(dāng)鼠標(biāo)在一個(gè)載有 GUI 元素或碰撞器的游戲?qū)ο笊辖?jīng)過(guò)時(shí)執(zhí)行該函數(shù)。

  1. OnMouseEnter()

鼠標(biāo)進(jìn)入物體范圍時(shí)執(zhí)行該函數(shù)。和 OnMouseOver() 不同,OnMouseEnter() 函數(shù)只執(zhí)行一次。

  1. OnMouseExit()

鼠標(biāo)離開(kāi)物體范圍時(shí)執(zhí)行該函數(shù)。

  1. OnMouseUp()

當(dāng)鼠標(biāo)釋放時(shí)執(zhí)行該函數(shù)。

  1. OnMouseDrag()

按住鼠標(biāo)拖動(dòng)對(duì)象時(shí)執(zhí)行該函數(shù)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)