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

# 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é)