天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

解構(gòu)Unity的腳本物件模型

Unity 是一個以 Mono 為基礎(chǔ)的游戲開發(fā)環(huán)境,能同時支持三種腳本語言,包括 C#、Javascript 和 Boo (類似 Python)。由于 Unity 的開發(fā)工具暫時只有 Mac 的版本 (2010年2月25日更新: 現(xiàn)時已有Windows版本,而且有免費授權(quán)版,另外因為Unity iPhone版的出現(xiàn)使Unity的使用者大增),所以暫時未能測試。但是它有很詳細的文檔,看上來很易用,所以就從文字上學習它的 Script 使用方式。跟據(jù)一些 Tutorial參考手冊,我用 Graphviz 畫了一個 (我認為) 最核心的 UML 類圖:

從這個類圖我們可以理解它的結(jié)構(gòu),及如何把一些常用功能映射至這系統(tǒng)里,以下分節(jié)討論。

GameObject 和 Component

Unity 的執(zhí)行環(huán)境里,會有一個場境 (Scene)。這個場境包含一個 GameObject 對象的層階 (Hierarchy)。這個 GameObject 類只是一個容器,本身沒有其他功能。使用者需要為 GameObject 加入各種 Component 對象來定義它的行為,而不是透過繼承 (inherit) GameObject 來加入 行為。一個對象可擁有多個 Component 對象,但有一些 Component 類別只可以在一個 GameObject 中有一個 實例 (instance)。

MonoBehavior

我最感興趣的,是使用者如何自行定義行為來做出不同的 Gameplay。在 Unity 中,程式員編寫的 Script,其實也是 Component 的一種,所有的 Script 都會繼承自 MonoBehavior 類別。以下是一個簡單例子:

var speed = 5.0;function Update () {    var x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;    var z = Input.GetAxis("Vertical") * Time.deltaTime * speed;    transform.Translate(x, 0, z);}

把這個 Script 加進一個 GameObject 的話 (成為該 GameObject 的一個 Component),Runtime 會在每幀呼叫 Update(),玩家就可以用上下左右鍵控制那個 GameObject 在水平方向移動。。

Transform

每個能在三維空間里的 GameObject 都會有 Transform Component (未有詳細看是否有一些 GameObject 可以省郤 Transform,例如一個用來定義一個游戲任務的 GameObject)。Transform 包括平移、旋轉(zhuǎn)及縮放。之前的例子已用了 Transform Component,不過它其實是 Object 類別的一個簡寫,這簡寫其實等同:

GetComponent(Transform).Translate(x, 0, z)

Component 的連結(jié)

在 Script Tutorial 里的例子是寫一個 Follow 的行為,擁有這個 Component 的 GameObject 會自動追蹤 (面對著) 一個目標對象:

var target : Transform;function Update () {    transform.LookAt(target);}

這個 Script 暴露了一個 target 變量 (應當作成員變量吧),使用者可以把其他對象的變 assign 至這個變量。這 assignment 有兩種方法實現(xiàn),其一是利用 Unity 的 GUI 工具把一個 Component 實例的變量 (如Transform) drag-and-drop 至這個 Component 實例的 target 變量,而另一個方法是寫代碼:

var newTarget = GameObject.Find("Cube").transform;GetComponent(Follow).target = newTarget;

用代碼就可以這樣動態(tài)改變這些 Component 之間的聯(lián)結(jié)方式。或者另一個說法是,GUI 工具是可以設(shè)定起始的聯(lián)結(jié),而 Script 可以在執(zhí)行期改變這些聯(lián)結(jié)。

渲染

一個可被渲染的 GameObject 需要有以幾個 Components,以 Mesh 為例:

  1. MeshFilter: 用來找出現(xiàn)時的 Mesh 對象
  2. MeshRenderer: 用來渲染 Mesh 的 Component,會參考一個 Material 對象

要注要 Mesh 和 Material 對象并非 Component,它們是繼承自 Object 的。你可以動態(tài)改變它們。但由于它們不是 Component ,所以可以被分享,例如多個 GameObject 的 MeshRenderer 都參考到同一個 Material。一個 Component 實例只屬于一個 GameObject (所以在 UML 中我用黑色鉆石表示 Composition)。而 Light 和 Camera 則是 Component,這意未著可以簡單的設(shè)定聯(lián)結(jié)。

分析

Unity 的 Script 對象模型是以 Component 為基礎(chǔ)的。透過把 Component 實例加入 GameObject 實例來組合不同功能的對象,而 Component 實例之間可以建立聯(lián)結(jié)。這種方式不需要透過繼承 (inheritance),而是透過聚合 (aggregation)加入對象的功能和行為。使用聚合的好處是不會產(chǎn)生復雜的繼承層階,亦可以動態(tài)改變聚合的結(jié)構(gòu) (例如在執(zhí)行期加入或移除 Component)。有一些細節(jié)我暫時未清楚,例如多個 Component 在一個 GameObject 中的執(zhí)行次序如何設(shè)定;聯(lián)結(jié)會否有 cylic 的問題等等。可能要拿到軟件再試用才可以知道。

結(jié)語

Unity 的腳本系統(tǒng)給我的感覺是使用非常簡單。透過很少的代碼就能寫一些行為,甚至把行為組合到對象中。但是,通常容易的東西都會有相對的缺點,例如在效能上或是 Scalability 上。后者可能是一個很大的問題,當游戲規(guī)模擴大,Component 和聯(lián)結(jié)就會變成一個很復雜的 graph,由于連結(jié)是發(fā)生于執(zhí)行期 (而非靜態(tài)),可能要作改動會變得困難。換句話說,就是改幾十個類別容易,改它們的幾千個 實例就會很困難。軟件設(shè)計世界里當然沒有銀子彈,每個方案都適合不同的情況。我認為 Unity 的一個設(shè)計目標是容易使用,就是像 Virtools 之流,可以給沒有程式底子的人做游戲,相對來說做比較復雜的項目可能會遇到許多問題。但參考一下總可以給予對事物新的觀點,或分析另一個科案的優(yōu)越之處。

之后還有一篇關(guān)于 CryEngine 的腳本分析,但現(xiàn)時我在家里開發(fā)的 Mil 引擎主要是采用 Unity 的物件模型。

本文原來是繁體中文,在2008-02-29發(fā)表于http://miloyip.seezone.NET/?p=15,本文經(jīng)過修正。

NET技術(shù)解構(gòu)Unity的腳本物件模型,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本久久频这里精品99 | 国产麻豆剧果冻传媒免费网站 | 杨幂视频1分11未删减在线观看 | 国产偷国产偷亚州清高 | 日本熟妇乱妇熟色A片蜜桃 日本熟妇多毛XXXXX视频 | bl被教练啪到哭H玉势 | 野花日本大全免费高清完整版 | 狼群影院视频在线观看WWW | 国产黄a三级三级三级 | 妖精视频免费看 | 一二三四中文字幕在线看 | 网红主播 国产精品 开放90后 | 亚洲AV永久无码精品老司机蜜桃 | 亚洲高清在线mv | 成人无码精品一区二区在线观看 | 亚洲国产无线码在线观看 | 欧美内射深插日本少妇 | 秋霞在线看片无码免费 | 超碰99热在线精品视频 | 欧美在线看欧美视频免费 | 色婷婷综合久久久中文字幕 | 亚洲欧洲日产国码中学 | 久久草这里全是精品香蕉频线观 | 男的插曲女的下面免费APP | 男人一生要读的书 | 色即是空之甜性涩爱 | 成年人视频在线免费播放 | 国产精品爆乳尤物99精品 | 国产成人精品免费视频大全办公室 | a三级黄色片 | 在线免费公开视频 | 116美女写真午夜电影z | 99久久99久久免费精品蜜桃 | 人和拘一级毛片 | chinese东北老年tv视频 | 2018久久视频在线视频观看 | 欧美乱码伦视频免费66网 | 国产高清视频青青青在线 | 校园高h肉耽文 | 无套日出白浆在线播放 | 欧美人与动牲交A免费 |