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

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

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

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

GameObject 和 Component

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

MonoBehavior

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

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);}

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

Transform

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

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

Component 的連結(jié)

在 Script Tutorial 里的例子是寫一個(gè) Follow 的行為,擁有這個(gè) Component 的 GameObject 會(huì)自動(dòng)追蹤 (面對(duì)著) 一個(gè)目標(biāo)對(duì)象:

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

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

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

用代碼就可以這樣動(dòng)態(tài)改變這些 Component 之間的聯(lián)結(jié)方式?;蛘吡硪粋€(gè)說(shuō)法是,GUI 工具是可以設(shè)定起始的聯(lián)結(jié),而 Script 可以在執(zhí)行期改變這些聯(lián)結(jié)。

渲染

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

  1. MeshFilter: 用來(lái)找出現(xiàn)時(shí)的 Mesh 對(duì)象
  2. MeshRenderer: 用來(lái)渲染 Mesh 的 Component,會(huì)參考一個(gè) Material 對(duì)象

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

分析

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

結(jié)語(yǔ)

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

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

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

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

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

主站蜘蛛池模板: 无码人妻精品一区二区蜜桃在线看 | 欧美性FREE玩弄少妇 | 尤物久久99国产综合精品 | 5566av资源| 国产午夜在线观看视频播放 | 国产AV无码一二三区视频 | 日本孕妇大胆孕交 | 大桥未久与黑人中出视频 | 俄罗斯爱爱| 精品国产成人AV在线看 | 嘟嘟嘟影院免费观看视频 | 狠狠色色综合站 | 丰满人妻无码AV系列 | 国产精品久久人妻互换毛片 | 久久99视热频国只有精品 | 人妖欧美一区二区三区四区 | 被黑人做的白浆直流 | 尹人久久大香找蕉综合影院 | 亚洲 制服 欧美 中文字幕 | 强壮的公次次弄得我高潮韩国电影 | 一区二区视频在线观看高清视频在线 | 国产精品色吧国产精品 | 最近高清中文字幕无吗免费看 | 成人bt下载 | 亚洲中文字幕手机版 | 老女老肥熟国产在线视频 | 国产精自产拍久久久久久蜜 | 母乳女神春日もな | chinese学生gv video | 亚洲最大在线视频 | 国产毛多水多高潮高清 | 一区二区中文字幕在线观看 | 乌克兰14一18处交见血 | 国产AV亚洲一区精午夜麻豆 | 69精品人妻一区二区三区蜜桃 | 九九久久国产精品免费热6 九九久久国产精品大片 | 久久精品热只有精品 | 在线视频 国产 日韩 欧美 | 女性爽爽影院免费观看 | 日本老妇一级特黄aa大片 | 国产AV精品一区二区三区漫画 |