日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Unity3D脚本语言的类型系统

發布時間:2023/12/10 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D脚本语言的类型系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#的類型系統

C#是靜態,安全,大多數時候顯示的語言,而且所有類型都派生自Object類,同時Unity都是以MonoBehavior這個類作為基礎的。

值類型與引用類型

引用類型

引用類型總是從托管堆分配,而C#要求所有對象都是用new關鍵詞來創建。

簡單介紹一下new操作符所做的事情:

  • 計算所需內存空間,new操作符會計算其所有基類中定義的所有實例字段所需字節數。同時為了方便Mono運行時管理對象,還有一些額外信息需要托管堆為其分配空間,如類型對象指針和同步索引塊。
  • 在托管堆上分配其所要的內存空間,分配的所有字節設為0
  • 初始化對象的類型對象指針和同步索引塊
  • 調用類型的實例構造器,同時編譯器會自動調用當前類型的基類構造器
  • 最后返回一個新建對象的引用,這就是說新建的變量是一個引用而不是對象本身
  • 綜上,引用類型可以概括為以下四點:

  • 存儲引用類型對象的內存空間從托管堆上分配
  • 每一個對象都有額外的成員為Mono運行時提供操作該對象的信息
  • 對象中的其他字段的字節總是0
  • 并沒有一個關鍵詞能刪除對象,所以當沒有空間可用時會觸發垃圾回收
  • 值類型

    如果所有類型都是引用類型,那么會消耗巨大的內存分配。因此,值類型實例都是分配在線程棧上的,并且不受垃圾回收(GC)影響

    此外,值類型不能派生出其他類型,而且是隱式密封的。這就導致無須提供額外信息,也就不需要再托管堆上為其分配空間

    并非所有值類型都分配在線程棧上,比如數組中的元素,引用類型中的值類型字段,迭代器中的局部變量。

    引用類型總是分配在托管堆上,而值類型并不總是在線程棧上。

    綜上,對于值類型可以概括為:

  • 不派生出其他類型,也不需要從其他類型派生
  • 值類型不可變,指的是他沒有提供會更改其字段的成員
  • 值類型都派生自System.ValueTybe
  • 值類型有已裝箱和未裝箱兩種表示方式。裝箱指的是將值類型轉換為引用類型,很多情況需要獲取和操作對值類型實例的引用,這便需要裝箱機制
  • 具體類型分類

    引用類型:

    ? 采用 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脚本语言的类型系统的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。