Unity3D脚本语言的类型系统
C#的類型系統(tǒng)
C#是靜態(tài),安全,大多數(shù)時(shí)候顯示的語(yǔ)言,而且所有類型都派生自O(shè)bject類,同時(shí)Unity都是以MonoBehavior這個(gè)類作為基礎(chǔ)的。
值類型與引用類型
引用類型
引用類型總是從托管堆分配,而C#要求所有對(duì)象都是用new關(guān)鍵詞來(lái)創(chuàng)建。
簡(jiǎn)單介紹一下new操作符所做的事情:
綜上,引用類型可以概括為以下四點(diǎn):
值類型
如果所有類型都是引用類型,那么會(huì)消耗巨大的內(nèi)存分配。因此,值類型實(shí)例都是分配在線程棧上的,并且不受垃圾回收(GC)影響
此外,值類型不能派生出其他類型,而且是隱式密封的。這就導(dǎo)致無(wú)須提供額外信息,也就不需要再托管堆上為其分配空間
并非所有值類型都分配在線程棧上,比如數(shù)組中的元素,引用類型中的值類型字段,迭代器中的局部變量。
引用類型總是分配在托管堆上,而值類型并不總是在線程棧上。
綜上,對(duì)于值類型可以概括為:
具體類型分類
引用類型:
? 采用 Class,Interface,Delegate關(guān)鍵詞來(lái)聲明的自定義引用類型
? C#內(nèi)建的引用類型:Object, string(string類型是對(duì)字符串的一個(gè)引用),List類,Decoder
值類型:
? 結(jié)構(gòu):數(shù)字型結(jié)構(gòu)(System.Int32, System.Float),布爾型結(jié)構(gòu)(System.Boolean),自定義的結(jié)構(gòu)
? 枚舉: System.IO.FileAttribute等
當(dāng)我們深入了解各個(gè)類型之間的關(guān)系時(shí),所有結(jié)構(gòu)都派生自抽象類System.ValueTybe,枚舉的基類System.Enum也都派生自System.ValueTybe。事實(shí)上所有值類型都派生自這個(gè)類
Unity腳本語(yǔ)言中的引用類型
UnityEngine.Object是Unity3D中C#腳本語(yǔ)言最基本的類,所有的腳本派生自MonoBehavior類
Unity3d中腳本會(huì)按照規(guī)定流程來(lái)執(zhí)行
概括一下:
調(diào)用所有的Awake方法,再調(diào)用所有的Start方法
游戲邏輯循環(huán)
1)所有FixedUpdate方法
2)物理模擬
3)OnEnter,Exit,Stay觸發(fā)函數(shù)
4)OnEnter,Exit,Stay碰撞函數(shù)
剛體插值,主要作用于transform.position和transform.rotation
輸入事件如OnMouseDown,OnMouseUp
所有Update方法
高級(jí)動(dòng)畫,混合并應(yīng)用到變換
所有LateUpdate
渲染
對(duì)象銷毀或退出場(chǎng)景
此外,加載階段的事件執(zhí)行條件
- Awake 是在gameObject被設(shè)置為Active后立即觸發(fā)的, 且僅觸發(fā)一次, 無(wú)論是場(chǎng)景中、Instantiate、還是SetActive(true);
- OnEnable 只有在gameObject為Active且腳本enable為true時(shí)才會(huì)被觸發(fā), 如果enable為true時(shí)gameObject處于關(guān)閉狀態(tài), 則在gameObject被打開時(shí)跟在Awake后被觸發(fā);
- Start 是在第一次Update之前觸發(fā)的, 只有在gameObject為Active且腳本enable為true時(shí)才會(huì)被觸發(fā), 且僅觸發(fā)一次;
Unity腳本語(yǔ)言中的值類型
向量類型主要表示位置和方向,以及紋理坐標(biāo),網(wǎng)格切線等
既然說(shuō)到了向量就復(fù)習(xí)一下點(diǎn)乘和叉乘吧
點(diǎn)乘積: 兩向量點(diǎn)乘等于他們的模長(zhǎng)乘以向量夾角cos,可以判斷當(dāng)前物體是否朝向另一個(gè)物體,只需要計(jì)算transform.forward和(target.transform.position- transform.position)的點(diǎn)乘,大于0則面對(duì)另一個(gè)物體
叉乘:兩向量的叉乘得到的向量與這兩個(gè)向量組成的平面垂直,得到的模長(zhǎng)等于他們的模長(zhǎng)與夾角sin相乘,滿足右手法則
其他的比如Color,Ray,Touch(描述手指觸摸屏幕的狀態(tài))
裝箱和拆箱
我們有時(shí)候就是需要一個(gè)引用類型,比如我們使用ArrayList來(lái)容納Vector3結(jié)構(gòu),ArrayList類中的Add方法參數(shù)就是一個(gè)Object類型。但向量不是一個(gè)引用類型,這時(shí)候Vector3實(shí)例就必須轉(zhuǎn)換成在托管堆上分配的對(duì)象,且必須獲得對(duì)象的引用。
介紹一下裝箱的步驟:
我們可以發(fā)現(xiàn)我們只是將值類型變量復(fù)制了一份到托管堆上,我們改變?cè)贾挡粫?huì)改變箱內(nèi)的值
當(dāng)然我們讀取ArrayList中的元素便會(huì)拆箱,我們需要告訴編譯器需要拆箱成什么類型(因?yàn)樗呀?jīng)是Object類型了)。
拆箱具體過(guò)程就是獲取ArrayList中索引為0的元素包含的引用,再將其指向的對(duì)象復(fù)制到值類型的實(shí)例去,拆箱時(shí)我們要明確指定為最初的值類型。
從這些步驟我們就能看出由于裝箱拆箱、復(fù)制會(huì)影響程序的速度和內(nèi)存,而且由于頻繁的操作托管堆會(huì)增加GC次數(shù),所以日常開發(fā)中我們并不常用這類會(huì)觸發(fā)裝箱機(jī)制的類型,而是采用List這樣的泛型
總結(jié)
以上是生活随笔為你收集整理的Unity3D脚本语言的类型系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(1660):前端系列实战课程之
- 下一篇: 计算机操作系统--思维导图