如何在Unity中開(kāi)發(fā)一個(gè)類FEZ的游戲(三)
By Greg Matsura
(譯者 @Kohlrabic )
原文地址:
http://gregandaduck.blogspot.com/2014/12/how-to-make-game-like-fez-in-unity-part_14.html#more
前一篇:

★前言

在教程的最后一個(gè)章節(jié)中,我們將會(huì)完成我們的類FEZ游戲的搭建?,F(xiàn)在我們已經(jīng)完成了基本的關(guān)卡和角色部分。今天我們將會(huì)完成控制3D旋轉(zhuǎn)功能的實(shí)現(xiàn)。
FEZ的旋轉(zhuǎn)切換效果是通過(guò)從不同的方向來(lái)觀察我們的關(guān)卡來(lái)實(shí)現(xiàn)的。旋轉(zhuǎn)將會(huì)以90°來(lái)依次來(lái)觀察我們的關(guān)卡,即前、后、左、右。
在3D場(chǎng)景下,我們有寬度、高度和深度需要考慮。當(dāng)游戲進(jìn)行時(shí),我們的3D場(chǎng)景將會(huì)被分解為4個(gè)2D場(chǎng)景供玩家游玩。本質(zhì)上場(chǎng)景的深度被忽略了,在屏幕上顯示的平面僅保留了X和Y軸坐標(biāo)。因?yàn)楹雎粤肆硪粋€(gè)作為深度的坐標(biāo),當(dāng)玩家起跳或旋轉(zhuǎn)時(shí),將會(huì)有可能錯(cuò)過(guò)平臺(tái)而落下。這取決于構(gòu)成平臺(tái)的磚塊的深度坐標(biāo)的不同,看起來(lái)在同一個(gè)平面上的磚塊實(shí)際上來(lái)自不同的深度。所以盡管看起來(lái)玩家可以走跳到一個(gè)平臺(tái)上,在實(shí)際3D場(chǎng)景中這個(gè)位置是沒(méi)有可以立足的方塊的,最終還是會(huì)錯(cuò)過(guò)這個(gè)平臺(tái)而墜落。為了防止這種情況的發(fā)生,我們將會(huì)創(chuàng)建隱形的立方體invisicubes作為玩家的落腳點(diǎn)。這將會(huì)使玩家看起來(lái)好像真的在對(duì)應(yīng)的平臺(tái)上面行動(dòng)。

★旋轉(zhuǎn)功能基本原理
我們需要完成的腳本基本功能如下:
當(dāng)玩家沒(méi)有起跳的時(shí)候,檢查我們是否在一個(gè)隱形的平臺(tái)之上,如果是的話,將玩家移動(dòng)到距離最近的實(shí)體平臺(tái)之上。這里我們將判斷距離的基準(zhǔn)設(shè)為距離攝像機(jī)的距離。當(dāng)我們改變了玩家的深度屬性的時(shí)候,需要更新隱形立方體的位置與之對(duì)應(yīng)。
提示:如果我們?cè)试S玩家站在隱形平臺(tái)上進(jìn)行旋轉(zhuǎn)操作,這將會(huì)不利于我們的管理,并且會(huì)出現(xiàn)更多的麻煩。這就是為什么我們需要將玩家移動(dòng)到正確的實(shí)體平臺(tái)的原因。
★實(shí)現(xiàn)旋轉(zhuǎn)功能
在FEZ中,核心玩法是通過(guò)旋轉(zhuǎn)來(lái)探索世界,解決不同的謎題。通過(guò)正交攝像機(jī)我們每次只能看到3D世界的一個(gè)平面。這意味著去除了景深,所有的物體在屏幕上的顯示仿佛都在一個(gè)平面之上。我們只會(huì)在旋轉(zhuǎn)操作時(shí)感受到這是一個(gè)3D的場(chǎng)景,剩下的時(shí)間中感覺(jué)就像是在游玩一個(gè)2D游戲一樣。
我們從制作一個(gè)隱形的立方體開(kāi)始。我們將會(huì)大量地復(fù)用它。首先,在你的場(chǎng)景里創(chuàng)建一個(gè)新的立方體,將它取名為Invisicube?,F(xiàn)在我們要做的就是去除(或者關(guān)閉)立方體的MeshRenderer組件,將這個(gè)立方體拖拽到Assets窗口創(chuàng)建為預(yù)制體。

提示:位置并不重要,但是Box Collider是必須的。去除(或者關(guān)閉)立方體的Mesh Renderer組件。
現(xiàn)在我們將會(huì)創(chuàng)建一個(gè)新的腳本來(lái)實(shí)現(xiàn)功能。這個(gè)腳本有一些長(zhǎng),但是我會(huì)對(duì)要點(diǎn)做出解釋。創(chuàng)建一個(gè)新的腳本命名為FEZManager。
代碼如下:
當(dāng)我們開(kāi)始游戲,這個(gè)腳本將會(huì)通過(guò)player的位置來(lái)決定在哪一個(gè)深度用隱形的立方體來(lái)創(chuàng)建平臺(tái)。我們?cè)谀_本的末尾添加了關(guān)于player朝向的枚舉。我們通過(guò)這種方式來(lái)追蹤player實(shí)時(shí)的朝向。當(dāng)player的朝向在X軸時(shí),決定深度就是Z軸;當(dāng)player的朝向在Z軸時(shí),決定深度的就是X軸。每當(dāng)玩家按下鍵盤方向鍵的右或者左箭頭時(shí),我們將會(huì)向著相應(yīng)的方向旋轉(zhuǎn)player 90°。因?yàn)槲覀兊臄z像機(jī)是player的子物體,它也會(huì)自動(dòng)地跟著旋轉(zhuǎn),我們的player將會(huì)始終面對(duì)攝像機(jī),這非常的便利。
在下面對(duì)控制器腳本做出更新,我們將會(huì)從判斷Player是否起跳的功能開(kāi)始,這將成為我們判定當(dāng)前是否能夠安全地改變Player的深度。如果我們站在一個(gè)隱形的平臺(tái)上面,我們能夠知道玩家至少有兩個(gè)方向的坐標(biāo)是和構(gòu)成實(shí)際平臺(tái)的某一個(gè)方塊相同的。例如,如果Player面朝的方向是前方(Z軸),那么在玩家X軸方向上至少會(huì)有一個(gè)實(shí)體方塊。Y軸坐標(biāo)也應(yīng)該和這個(gè)方塊一致,但是因?yàn)镃haracter Controller的size可能有些許的誤差。Z軸坐標(biāo)是唯一的差異,相對(duì)于玩家,它有可能是正,也可能是負(fù)。
通讀相關(guān)的代碼將會(huì)讓我們更加清楚發(fā)生了什么。接下來(lái),我們將要給FezMove腳本做出一些改變,為它添加旋轉(zhuǎn)的功能。我們將會(huì)實(shí)時(shí)檢測(cè)玩家的朝向和移動(dòng)方向,來(lái)決定我們世界的旋轉(zhuǎn)方向。
下面就是修改后的腳本:
要使用這個(gè)腳本,首先創(chuàng)建一個(gè)空物體,用于掛載這個(gè)腳本。如圖所示,你需要將相應(yīng)的Game Object填入腳本的選項(xiàng)中。

★平臺(tái)和建筑物(Platforms & Buildings)
關(guān)卡的具體設(shè)計(jì)完全取決于你自己,但是,這里有一些關(guān)鍵點(diǎn)你或許需要提前了解一下?;蛟S可以幫助你更加輕松地完成關(guān)卡的搭建。


從中心的支柱為基礎(chǔ),圍繞著它開(kāi)始搭建我們的關(guān)卡,不要忘記使用我們之前教程中的自動(dòng)對(duì)齊腳本(AutoSnap)來(lái)幫助提升你的效率。


以上就是此篇教程的全部?jī)?nèi)容了,感謝你的閱讀!