最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【從零開始的Unity魔法學(xué)堂】委托

2023-07-29 22:54 作者:百塵而已  | 我要投稿

# Unity魔法學(xué)堂

## 準(zhǔn)備

### 準(zhǔn)備工作

+ Unity Hub

+ Unity Editer

+ IDE(集成開發(fā)環(huán)境)

? + VScode

? + VS



### 基本架構(gòu)

+ 場(chǎng)景(Scene)

+ 游戲?qū)ο螅℅ameObject)

+ 組件(Component)



### Unity界面

+ 場(chǎng)景窗口

? + 快捷鍵QWERTY切換工具

? + WASDQE自由移動(dòng)

+ Hierarchy(層級(jí)窗口)

? + 查看所有游戲?qū)ο?/p>

+ Inspector(檢視面板)

? + 查看更改選中物體的信息

? + AddComponent可掛載Unity預(yù)制組件或自己寫的腳本

? + 直接將腳本拖拽也可掛載

+ Game游戲窗口

? + 查看游戲?qū)嶋H運(yùn)行畫面

? + 游戲運(yùn)行中性能參數(shù)也可在Game窗口監(jiān)視

+ Project項(xiàng)目窗口

? + Unity項(xiàng)目工程文件夾

+ Console控制臺(tái)窗口

? + 雙擊信息可快速跳轉(zhuǎn)到代碼對(duì)應(yīng)位置


### 基本工作流程

+ 建立工程,導(dǎo)入資源

+ 搭建場(chǎng)景并配置游戲?qū)ο?/p>

+ 編寫代碼,控制臺(tái)查錯(cuò)

+ 配置項(xiàng)目信息,打包導(dǎo)出


### Hello Word!

+ Unity支持語言-有且僅有C#

+ 配置編輯器

? + 頂部Edit-Preference

+ Preference界面-偏好設(shè)置頁面

+ 生命周期函數(shù)

? + Start()

? ? + 開始前調(diào)用

? + Update()

? ? + 持續(xù)刷新

***

代碼

?```C#

print("Hello Word!"); ? //發(fā)送到控制臺(tái)窗口,但不會(huì)在游戲中體現(xiàn)

?```

## C#初級(jí)

### 變量與常量

#### 常見類型

|類型|描述|范圍|默認(rèn)值|

|:----:|:----:|:----:|:----:|

|bool |布爾值| True 或 False ?|False|

|byte |8位無符號(hào)整數(shù) ?|0到255 ?|0|

|char |16位Unicode字符|U+0000 到 U+ffff|'\0'|

|decimal| 128 位精確的十進(jìn)制值,28-29 有效位數(shù) |$\frac{-7.9\times 10^{28} - 7.9\times 10^{28}}{10^{0-28}}$|0.0M|

|double| ?64 位雙精度浮點(diǎn)型 ?|$(+/-)5.0 \times 10^{-324} - (+/-)1.7 \times 10^{308}$| ?0.0D|

|float| 32 位單精度浮點(diǎn)型 ?|-3.4 x 1038 到 + 3.4 x 1038 |0.0F|

|int ?|32 位有符號(hào)整數(shù)類型 ?|-2,147,483,648 到 2,147,483,647 |0|

|long |64 位有符號(hào)整數(shù)類型 ?|-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |0L|

|sbyte ?|8 位有符號(hào)整數(shù)類型 |-128 到 127 |0|

|short ?|16 位有符號(hào)整數(shù)類型 ?|-32,768 到 32,767 |0|

|uint| ?32 位無符號(hào)整數(shù)類型 |0 到 4,294,967,295 ?|0|

|ulong ?|64 位無符號(hào)整數(shù)類型 ?|0 到 18,446,744,073,709,551,615 |0|

|ushort |16 位無符號(hào)整數(shù)類型 ?|0 到 65,535| ?0|


+ 整數(shù)

? + sbyte

? + short

? + int

? + long

? + byte

? + ushort

? + uint

? + ulong

+ 小數(shù)

? + float

? + double

+ 文字

? + char

+ 邏輯

? + bool


#### 變量命名

#### 變量聲明

如果要寫float類型數(shù)字,需在后面加f

? ?

? ? float a=0.1f;


### 二進(jìn)制與類型

+ 機(jī)器碼

+ Unicode

+ 不能向bool直接賦值0或1,必須使用true和false

+ 類型轉(zhuǎn)換



### 運(yùn)算符

?+ 算術(shù)運(yùn)算符

?+ 關(guān)系運(yùn)算符

?+ 邏輯運(yùn)算符

?+ 賦值運(yùn)算符

?+ 位運(yùn)算符

? ?+ 每一位進(jìn)行運(yùn)算

? ?+ &

? ?+ |

? ?+ ^

? ? ?+ 異或

? ?+ ~

? ? ?+ 取反

? ?+ <<

? ? ?+ 左移

? ?+ \>>

? ? ?+ 右移



### 控制流

+ 執(zhí)行語句的順序

+ 順序

+ 分支

+ 循環(huán)


### 方法

+ 函數(shù)

+ 重載


### 數(shù)組

#### 多維數(shù)組和交錯(cuò)數(shù)組

```C#

//規(guī)則數(shù)組(類似矩陣,每一行列數(shù)相同)

//一維數(shù)組

char[] allMagics = new char[9]={...};

char[] allMagics = new char[9];

//二維數(shù)組

int[,] squareCrystal = new int[2,3];

//三維數(shù)組

int[,,] cubeCrystal = new int[2,3,4];


//交錯(cuò)數(shù)組(每一行的列數(shù)不同)

float[][] crossCrystal = new float[3][]; ?//定義時(shí)可只填入第一個(gè)維度


crossCrystal[0] = new float[4];

crossCrystal[1] = new float[6];

crossCrystal[2] = new float[8];

```

#### 字符串

```C#

string name = "SB";

int age = 12;

//字符串的拼接

print(name+age+"歲") ? ?//int自動(dòng)轉(zhuǎn)化為字符串

```

**字符串支持空雙引號(hào)"",但char不支持空單引號(hào)''**


### 枚舉

+ enum枚舉是一種特殊的基本類型

+ 可使用枚舉來創(chuàng)建枚舉類型

+ 因?yàn)橄薅丝砂闹担杜e類型可以防止無效輸入

+ 枚舉的成員直接使用英文名稱來定義

+ 成員本質(zhì)上也是數(shù)字

? + 隱含的值從0開始

+ 枚舉默認(rèn)值為第一個(gè)名字

```C#

修飾詞(public、protected)enum 枚舉類型名:整數(shù)類型

{

? ? 成員1,

? ? 成員2,

? ? ...

}



enum Gender

{

? Male;

? Famale;

? Other;

}

Gender gender=Gender.Female;

```


### 結(jié)構(gòu)體

struct

+ 結(jié)構(gòu)體中不僅可以放變量,還可以放函數(shù)

```C#

struct Apprentice

{

? public string name;

? public Gender gender;

? public int age;

? public string[] allMagic;

}


Apprentice newbody;

```


+ 權(quán)限修飾符

? + public

? ? + 公開

? + private(默認(rèn))

? ? + 僅在當(dāng)前結(jié)構(gòu)中可訪問

? + protected

? ? + 受保護(hù)的


### 總結(jié)


## C#高級(jí)

### 封裝

#### 類

+ 面向?qū)ο蟮乃枷?/p>

```C#

class Kami

{

public string name;


//構(gòu)造函數(shù)可重載

public Kami(string name)

{

? this.name = name; ? //為實(shí)例賦值

? print("神明"+name+"誕生了!");

}

public Kami(int tribute)

{

? print("收獲了"+tribute+"貢品");

}


//方法和靜態(tài)方法

public void RequestWish()

{

? print("許愿");

}

public static void RealizeWish()

{

? print("神明幫你實(shí)現(xiàn)了愿望");

}

}


Kami new_kami = new Kami("Anki");

new_kami.RequestWish(); ? //普通方法,需要通過實(shí)體實(shí)現(xiàn)

Kami.RealizeWish(); ? ? ? //靜態(tài)方法,歸屬于Kami類無需創(chuàng)建變量,直接使用

```

#### 值與引用

+ 內(nèi)存可分為堆和棧兩塊區(qū)域

? + 堆:大而慢

? ? + ?值類型數(shù)據(jù)在棧上

? + 棧:小而快

? ? + 引用類型數(shù)據(jù)在棧上存放一個(gè)堆地址,數(shù)據(jù)在堆上

+ 值類型

? + 數(shù)字

? + 文字

? + 邏輯

? + 枚舉

? + 結(jié)構(gòu)體

+ 引用類型

? + 數(shù)組

? + 字符串

? + 類

+ 實(shí)際上Unity中所有變量都聲明在類中,存在堆里,只有局部變量會(huì)在棧上開辟空間


### 繼承

#### 繼承

+ 面向?qū)ο笕筇卣髦?/p>

+ 被繼承者稱為父類或基類

+ 繼承者稱為子類或派生類

+ 子類繼承后可添加自己的成員

+ 一父多子


```C#

//父類

class Apprentice

{

? public string name;

? public Gender gender;

? public int age;

}

//子類

class MagicApperentice:Apperentice ?//繼承學(xué)徒類,并可繼續(xù)附加成員

{

? public void TellName()

? {

? ? print(name); ? ?//子類只能繼承public的屬性和方法,如果是private則不會(huì)被繼承,protected可以被繼承,不能被外部調(diào)用

? }

}

class BlacksmithApperentice:Apperentice

{

?

}

class MusicianApperentice:Apperentice

{

?

}

```

#### MonoBehaviour

+ Unity的腳本都派生自該類,這些腳本可掛載在GameObject組件上

+ 被掛載的組件自動(dòng)實(shí)例化

+ 除了Start、Update外,MonoBehaviour還提供了很多別的生命周期以及便捷的成員變量和方法

+ print()屬于MonoBehaviour的方法,是對(duì)Debug.Log()方法的封裝


### 多態(tài)

+ 面向?qū)ο笕筇卣髦?/p>

+ 當(dāng)使用某個(gè)功能時(shí),根據(jù)情況,功能會(huì)有不同的表現(xiàn)形態(tài)

? + 通過方法重載,在類內(nèi)提供名稱統(tǒng)一但表現(xiàn)不同的方法

? + 通過方法重寫,為不同子類提供名稱統(tǒng)一而表現(xiàn)不同的方法

+ 多態(tài)是一種思想,不是語法

+ 動(dòng)態(tài)多態(tài)

? + 也叫子類型多態(tài)、包含多態(tài)

? + 父類通過定義虛方法為子類規(guī)定一種功能,子類可以放進(jìn)父類型的變量中,直接通過父類型變量訪問這個(gè)虛方法,此時(shí)不同子類在這個(gè)虛方法上表現(xiàn)出了多態(tài)

? + 面向?qū)ο缶幊趟f的多態(tài)通常指這種多態(tài)

```C#

//父類

class Apprentice

{

? public string name;

? public Gender gender;

? public int age;

? public virtual void TellName() ? //虛方法,方便子類進(jìn)行重寫,必須對(duì)子類公開(public或protected)

? {

? ? ?print(name);

? }

}

//子類

class MagicApperentice:Apperentice ?//繼承學(xué)徒類,并可繼續(xù)附加成員

{

? public override void TellName() ? //重寫父類虛方法,方法頭與父類保持一致,如果不重寫,則直接繼承

? {

? ? print(name+"魔法學(xué)徒"); ? ?

? ? base.TellName(); ? ?//調(diào)用父類的虛方法

? }

}

class BlacksmithApperentice:Apperentice

{

?

}

class MusicianApperentice:Apperentice

{

?

}


//父類變量的數(shù)組可以指向子類變量

Apprentice[] many = new Apprentice[3];


//構(gòu)造方法后可以使用{成員變量1=值,成員變量2=值}的形式進(jìn)行對(duì)象初始化

many[0]=new MagicApperentice(){name = "marlin"};

many[1]=new BlacksmithApperentice(){name = "Yaki"};

many[2]=new MusicianApperentice(){name = "Anna"};


```

### 抽象與接口

#### abstract抽象

+ 在class前加關(guān)鍵詞abstract

? + 作為一個(gè)抽象的概念,不應(yīng)具有實(shí)體,因此抽象類只能被繼承,自身無法實(shí)例化

? + 抽象類的子類依然可以是抽象類

+ 在方法前面加關(guān)鍵詞abstract,抽象方法

+ 抽象方法只能定義在抽象類中

? + 與虛方法類似,抽象方法不能私有

? + 一定會(huì)被重寫,所以在父類中無需實(shí)現(xiàn)

? + 除非同為抽象類,否則子類必須重寫所有抽象方法

? + 抽象方法規(guī)定了子類必須實(shí)現(xiàn)的功能

```C#

//定義抽象類

abstract class Animal

{

? //定義抽象方法

? public abstract void Run();

}

```

#### interface接口

+ 指一個(gè)功能模塊提供給使用者的媒介

+ 類通過類似繼承的方式加入接口,這個(gè)過程叫實(shí)現(xiàn)接口

+ 接口通過抽象方法規(guī)定了類中必須存在的公開方法,相當(dāng)于規(guī)定了類提供給調(diào)用者的接口


```C#

interface IMagic

{

? //接口里面創(chuàng)造共同具有的抽象方法,權(quán)限修飾符和abstract可省略

? //public abstract void Invoke();

? void Invoke();

}


class Dragon:IMagic,IFly,IRun ? ? //類通過繼承的格式接收接口,繼承的接口不限數(shù)量,添加別的接口以及父類使用逗號(hào)隔開

{

? public void Invoke(){}; ? ? //接口中的方法必須是public,不用寫override

}


class Magician:Human,IMagic

{}


Class Elf:IMagic

{}


//當(dāng)一組類擁有相同的接口,就能使用相同的數(shù)組來管理具備相同特征的實(shí)例

IMagic[] magicCreatures = new IMagic[3];

magicCreatures[0] = new Dragon();

magicCreatures[1] = new Magician();

magicCreatures[2] = new Elf();


```


### 屬性與異常

#### 屬性

+ 對(duì)類中成員的一層包裝,也叫類的命名成員

+ 屬性通過訪問器get、set來讀寫包裝內(nèi)的數(shù)據(jù)

+ get和set內(nèi)除了return語句外,還能添加其他語句,因此可以用于數(shù)據(jù)二次處理、關(guān)聯(lián)其他邏輯等

+ 如果省略get或set,可實(shí)現(xiàn)只讀或只寫

```C#

//設(shè)置類的屬性

int target;

public int targetinfo

{

? get

? {

? ? return target;

? }


? set

? {

? ? target = value;

? }

}


targetinfo = 100; ? //將傳入set的value中


```

#### 異常

+ 一些復(fù)合基本語法,但是運(yùn)行過程中會(huì)出現(xiàn)的錯(cuò)誤

+ 當(dāng)問題發(fā)生時(shí),程序就會(huì)拋出異常,若不處理,就會(huì)導(dǎo)致一系列問題

+ 用戶可以使用throw關(guān)鍵字+異常實(shí)例來主動(dòng)拋出異常,也可通過繼承來自定義異常類型


|異常符號(hào)|異常內(nèi)容|

|:----:|:----:|

|SystemException | ?其他用戶可處理的異常的基本類 |

|ArgumentException ? |方法的參數(shù)是非法的 |

|ArgumentNullException ?| 一個(gè)空參數(shù)傳遞給方法,該方法不能接受該參數(shù) |

|ArgumentOutOfRangeException ?| 參數(shù)值超出范圍 |

|ArithmeticException ? |出現(xiàn)算術(shù)上溢或者下溢 |

|ArrayTypeMismatchException ? |試圖在數(shù)組中存儲(chǔ)錯(cuò)誤類型的對(duì)象 |

|BadImageFormatException ?| 圖形的格式錯(cuò)誤 |

|DivideByZeroException | ?除零異常 |

|DllNotFoundException ?| 找不到引用的DLL |

|FormatException ?| 參數(shù)格式錯(cuò)誤 |

|IndexOutOfRangeException ?| 數(shù)組索引超出范圍 |

|InvalidCastException ?|使用無效的類 |

|InvalidOperationException ?| 方法的調(diào)用時(shí)間錯(cuò)誤 |

|MethodAccessException ?| 試圖訪問思友或者受保護(hù)的方法 |

|MissingMemberException ?| 訪問一個(gè)無效版本的DLL |

|NotFiniteNumberException ?| 對(duì)象不是一個(gè)有效的成員 |

|NotSupportedException ?| 調(diào)用的方法在類中沒有實(shí)現(xiàn) |

|NullReferenceException ? |試圖使用一個(gè)未分配的引用 |

|OutOfMemoryException ?| 內(nèi)存空間不夠 |

|PlatformNotSupportedException | ?平臺(tái)不支持某個(gè)特定屬性時(shí)拋出該錯(cuò)誤 |

|StackOverflowException ? |堆棧溢出|

|SystemException ?| 運(yùn)行時(shí)產(chǎn)生的所有錯(cuò)誤的基類。|

|IndexOutOfRangeException ?| 當(dāng)一個(gè)數(shù)組的下標(biāo)超出范圍時(shí)運(yùn)行時(shí)引發(fā)。|

|NullReferenceException ?| 當(dāng)一個(gè)空對(duì)象被引用時(shí)運(yùn)行時(shí)引發(fā)。|

|InvalidOperationException ?| 當(dāng)對(duì)方法的調(diào)用對(duì)對(duì)象的當(dāng)前狀態(tài)無效時(shí),由某些方法引發(fā)。|

|ArgumentException ?| 所有參數(shù)異常的基類。|

|ArgumentNullException ? |在參數(shù)為空(不允許)的情況下,由方法引發(fā)。|

|ArgumentOutOfRangeException ? |當(dāng)參數(shù)不在一個(gè)給定范圍之內(nèi)時(shí),由方法引發(fā)。|

|InteropException ?| 目標(biāo)在或發(fā)生在CLR外面環(huán)境中的異常的基類。|

|ComException ?| 包含COM類的HRESULT信息的異常。|

|SEHException ?| 封裝Win32結(jié)構(gòu)異常處理信息的異常。|

|SqlException ?| 封裝了SQL操作異常。|



#### 異常處理

+ 異常捕獲:try-catch-finally

+ try中為可能拋出異常的代碼,之后可跟多個(gè)catch塊,每個(gè)catch塊后可跟異常類型,并在花括號(hào)中處理異常

+ 如果catch后沒有說明異常類型,則捕獲所有類型異常

+ 無論是否捕獲異常,finally都會(huì)執(zhí)行,但finally可省略

```C#

try

{

? print(allMagics[1]);

}

catch(System.IndexOutOfRangeException)

{

? //如果try中語句引起此類型異常,則執(zhí)行此處代碼

? //如果省略小括號(hào),則發(fā)生任何類型異常,都會(huì)執(zhí)行此catch中內(nèi)容

}

...

finally

{

? //無論是否捕獲異常,finally都會(huì)執(zhí)行

}

```


### 運(yùn)算符重載與索引器

#### 運(yùn)算符重載

+ 可以對(duì)C#內(nèi)置的部分運(yùn)算符進(jìn)行重新定義

+ 可重載運(yùn)算符

? + 算術(shù)運(yùn)算符

? + 條件運(yùn)算符

+ 參數(shù)和返回類型符合運(yùn)算符自身要求

+ 參數(shù)有兩個(gè)且不同的類時(shí),參數(shù)左右順序決定使用時(shí)對(duì)象的左右順序

+ 部分運(yùn)算符要求成對(duì)重載

? + \>和<

? + == 和 !=

?

```C#

class Apprentice

{

? public static Apprentice operator +(Apprentice a,Apprentice b); ?

? //運(yùn)算符重載函數(shù)的參數(shù)與運(yùn)算符操作數(shù)數(shù)量相同

? //返回類型不能是void


}

```

#### 封裝的作用

+ 將高頻使用的功能單獨(dú)提取出來,可以重復(fù)使用以提高效率

+ 單獨(dú)提取部分作為獨(dú)立模塊,內(nèi)部邏輯和外部分離,若修改獨(dú)立模塊內(nèi)部邏輯,不會(huì)影響其他模塊

+ 若更換關(guān)聯(lián)模塊,只要滿足同樣的對(duì)接方式,即可直接替換

+ 規(guī)定系統(tǒng)中各模塊的對(duì)接方式,是接口存在的意義


#### 索引器

+ 允許一個(gè)對(duì)象可以像數(shù)組一樣使用下標(biāo)來訪問,適合具有成組特性的類

+ 與屬性類似,通過get、set訪問器來定義索引方式

+ 方括號(hào)中的參數(shù)即為訪問時(shí)的下標(biāo),可以定義為各種類型

+ 利用索引器和類中的數(shù)組,可以組合出功能更高級(jí)的數(shù)據(jù)結(jié)構(gòu)

+ 對(duì)于數(shù)組,包含著length等相關(guān)成員可供訪問

```C#

class MagicSet

{

? public int this[int index]

? {

? ?// get 訪問器

? ?get

? ?{

? ? ? // 返回 index 指定的值

? ?}


? ?// set 訪問器

? ?set

? ?{

? ? ? // 設(shè)置 index 指定的值

? ?}

}

}

```

#### 舉例

運(yùn)算符重載

```C#

public class Main:MonoBehaviour

{

? Apprentice apprentice = new Apprentice();

? Provision p1=new Provision(10),p2=new Provision(50);


? void Start()

? {

? ? Apprentice newApprentice = apprentice + (p1 + p2);

? ? print(newApprentice.hp+" ?"+newApprentice.mp);

? }


? void Update()

? {

? ?

? }

}



class Apprentice ? ?//學(xué)徒

{

? public int hp,mp

}

class Provision ? ? //補(bǔ)給包

{

? public int hp,mp;

? public Provision(){};

? public Provision(int number){bp=mp=number;}

? public static Provision operator +(Provision a,Provision b)

? {

? ? return new Provision(){hp=a.hp+b.hp,mp=a.mp+b.mp};

? }


? public static Apprentice operator + (Apprentice a,Provision b)

? {

? ? return new Apprentice(){hp=a.hp+b.hp,mp=a.mp+b.mp};

? }

}

```

索引器的使用

```C#

public class Main:MonoBehaviour

{

? MagicSet magicset=new MagicSet(1);


? void Start()

? {

? ? magicset[0]="Truth";

? ? print(magicset[1]); ?

? }


? void Update()

? {

? ?

? }

}


class MagicSet

{

? string[] magics; ? ? ? ? ?//數(shù)組

? public MagicSet(int length) ? //構(gòu)造函數(shù)

? {

? ? magics = new string[length]; ? ?//為數(shù)組開辟空間

? }

? //定義索引器

? public string this[int index]

? {

? ? get

? ? {

? ? ? if(index>magics.Length-1||index<0)

? ? ? {

? ? ? ? return "Index out of range";

? ? ? }

? ? ? return magics[index];

? ? }

? ? set

? ? {

? ? ? magics[index]=value;

? ? }

? }

}



```


### 泛型與集合

#### 泛型

+ 一種延遲編寫類型的規(guī)范

? + 先擬定一個(gè)類型,在調(diào)用時(shí)再填入具體類型

? + 可以看作將類型作為一種可變參數(shù),進(jìn)一步提高代碼的復(fù)用性

+ 泛型除了作用在方法,還能作用于類、接口等

? + 作用于類時(shí),在類名后加尖括號(hào)<>,在其中為泛型起名即可

? ? + class GClass<T>{...}

? + 一次可定義多個(gè)泛型,在尖括號(hào)中用逗號(hào)隔開

? ? + <T1,T2>

```C#

public T GenericMethod<T>(T t);


//為各種數(shù)組添加元素的方法

Type[] AddElement<Type>(ref Type[] array,Type newElement) ? ? //ref類似于取地址,變量以引用的方式進(jìn)入函數(shù)修改值等效于修改外部變量

{

? Type[] newArray=new Type[array.Length+1];

? for(int i=0;i<array.Length;i++)

? {

? ? newArray[i]=array[i];

? }

? newArray[newArray.Length-1]=newElement;

? return newArray;

}

```

#### ref和out

+ 用來修改參數(shù)方法的兩個(gè)關(guān)鍵詞

+ 若將一個(gè)參數(shù)定義為ref和out,調(diào)用時(shí)必須填入可賦值的變量,且要加上對(duì)應(yīng)的ref或out詞綴

+ 修改方法內(nèi)的ref或out變量,將會(huì)直接改變調(diào)用者外部填入的變量

+ 區(qū)別在于

? + ref可以不修改,作為普通參數(shù)使用

? + out必須修改,且在修改后才能在方法內(nèi)使用

+ 可以通過定義多個(gè)ref或out參數(shù),來實(shí)現(xiàn)一個(gè)方法帶出多個(gè)返回值


#### List類

+ List <T>是強(qiáng)類型對(duì)象的集合,可以通過索引對(duì)其進(jìn)行訪問,并具有用于排序,搜索和修改列表的方法

+ 它是System.Collection.Generic命名空間下的ArrayList的泛型版本。


List的屬性和方法

|屬性| ?用法|

|:----:|:----:|

|Items| 獲取或設(shè)置指定索引處的元素|

|Count| 返回List <T>中存在的元素總數(shù)|


|方法| ?用法|

|:----:|:----:|

|Add| 在List <T>的末尾添加元素。|

|AddRange| ?將指定集合的元素添加到List <T>的末尾。|

|BinarySearch| ?搜索元素并返回該元素的索引。|

|Clear ?|從List <T>中刪除所有元素。|

|Contains| ?檢查指定元素在List <T>中是否存在。|

|Find |根據(jù)指定的謂詞函數(shù)查找第一個(gè)元素。|

|Foreach| 遍歷 List <T>。|

|Insert| ?在List <T>中的指定索引處插入元素。|

|InsertRange| 在指定的索引處插入另一個(gè)集合的元素。|

|Remove |刪除指定元素的第一次出現(xiàn)。|

|RemoveAt| ?刪除指定索引處的元素。|

|RemoveRange| 刪除所有與提供的謂詞功能匹配的元素。|

|Sort |對(duì)所有元素進(jìn)行排序。|

|TrimExcess| ?將容量設(shè)置為實(shí)際的元素?cái)?shù)。|

|TrueForAll |確定List <T>中的每個(gè)元素是否與指定謂詞定義的條件匹配。|

```C#

List<string> magics = new List<string>(); ? ? ? //不必確定空間大小

magics.Add(); ? //添加元素等

```


#### Dictionary字典

+ Dictionary < TKey,TValue > 是一個(gè)泛型集合,它以不特定的順序存儲(chǔ)鍵值對(duì)。

+ 屬于System.Collection.Generic命名空間。

+ 實(shí)現(xiàn) IDictionary <TKey,TValue>接口。

+ 鍵必須是唯一的,不能為null。

+ 值可以為null或重復(fù)。

+ 可以通過在索引器中傳遞相關(guān)鍵來訪問值,例如 myDictionary[key]

+ 元素存儲(chǔ)為 KeyValuePair <TKey,TValue> 對(duì)象。


|方法| ?用法|

|:----:|:----:|

|Comparer| ?獲取用于確定字典中的鍵是否相等的 IEqualityComparer|

|Count |獲取包含在 Dictionary中的鍵/值對(duì)的數(shù)目|

|Item| 獲取或設(shè)置與指定的鍵相關(guān)聯(lián)的值|

|Keys |獲取包含 Dictionary中的鍵的集合|

|Values |獲取包含 Dictionary中的值的集合|

|Add | ?將指定的鍵和值添加到字典中|

|Clear |從 Dictionary中移除所有的鍵和值|

|ContainsKey |確定 Dictionary是否包含指定的鍵 |

|ContainsValue |確定 Dictionary是否包含特定值 |

|GetEnumerator | ?返回循環(huán)訪問 Dictionary的枚舉數(shù) |

|GetType ?|獲取當(dāng)前實(shí)例的 Type (從 Object 繼承)|

|Remove | 從 Dictionary中移除所指定的鍵的值 |

|ToString |返回表示當(dāng)前 Object的 String (從 Object 繼承)|

|TryGetValue | ?獲取與指定的鍵相關(guān)聯(lián)的值 |


```C#

IDictionary<int, string> numberNames = new Dictionary<int, string>();

numberNames.Add(1,"One"); //使用Add()方法添加鍵/值

```

#### 泛型集合

+ 微軟在.Net架構(gòu)中,封裝好的、支持泛型的各種數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)

+ 這些結(jié)構(gòu)以類的形式提供支持,并且可以動(dòng)態(tài)擴(kuò)展大小,其中包含一系列數(shù)據(jù)處理相關(guān)的方法

+ 常用的有

? + List<T>

? + Dictionary<TKey,TValue>

? + Stack<T>

? + Queue<T>

+ 此外還有非泛型集合

? + 非泛型集合中字典叫做Hashtable哈希表


### 委托

#### 事件驅(qū)動(dòng)

+ 一種程序設(shè)計(jì)思路,可以很好的解除各個(gè)模塊間的強(qiáng)關(guān)聯(lián),將各種用戶操作、游戲事件進(jìn)行抽象提取,集中管理起來

+ 作為事件的發(fā)布方,在合適的時(shí)機(jī)發(fā)布事件即可,無需關(guān)心誰訂閱了事件

+ 作為事件訂閱方,在事件被發(fā)布時(shí)執(zhí)行相關(guān)操作即可,無需關(guān)心是誰發(fā)布了事件

+ 以跨平臺(tái)游戲?yàn)槔螒蚝诵膶又恍璞O(jiān)聽操作事件,無需考慮觸發(fā)設(shè)備是屏幕、鍵盤還是手柄


#### delegate委托

+ 使用關(guān)鍵詞delegate聲明委托

+ 委托聲明決定了該委托可以綁定什么格式的方法

+ 使用委托聲明來創(chuàng)建委托變量,之后可以通過實(shí)例化來綁定方法

+ 委托變量本質(zhì)上存儲(chǔ)著一個(gè)方法的引用,類似于C++中函數(shù)指針

```C#

public class Main:MonoBehaviour

{

? public delegate void Event(string s); ? //定義委托

? Event weather,notice;


? void Start()

? {

? ? //發(fā)布委托

? ? weather("晴");

? ? notice("考試");

? ? //訂閱委托

? ? weather = new Event(GoToLibrary);//同weather += GoToLibrary;

? ? //如果為=,則只能綁定一個(gè)方法,如果要添加委托,則使用+=

? ? weather += Business;

? ? //解綁委托

? ? weather -= Business;


? ? weather += (s)=>{print("今天"+s+"去玩");}; ? ?//匿名函數(shù)

? }


? void Update()

? {

? ?

? }


? void GoToLibrary(string s)

? {

? ? print("今天"+s+"去圖書館");

? }

? void Business(string s)

? {

? ? print("今天"+s+"去工作");

? }

}

```

#### 匿名方法

+ 沒有名稱只有主體的方法,專用于委托

+ 簡化格式也稱為Lambda表達(dá)式

? + delegate (string s){···}

? + (s)=>{···}

+ 頭部只有一個(gè)參數(shù)或主體只有一行非return語句時(shí),對(duì)用括號(hào)可以省略

? + s=>print("")


### 總結(jié)

【從零開始的Unity魔法學(xué)堂】委托的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
阜平县| 南陵县| 黄冈市| 顺义区| 东光县| 平武县| 拜城县| 黄龙县| 三都| 武陟县| 大渡口区| 舒兰市| 饶平县| 聂拉木县| 元阳县| 牟定县| 常熟市| 中阳县| 丹棱县| 得荣县| 张北县| 申扎县| 凤山县| 筠连县| 阿瓦提县| 普兰店市| 阳东县| 都江堰市| 封开县| 新干县| 兴国县| 西青区| 盘山县| 故城县| 定西市| 信宜市| 汨罗市| 安庆市| 九龙城区| 九江县| 门源|