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