今天據(jù)說水哥買了 Valve Index 設(shè)備,既然這個設(shè)備這么貴,不開發(fā)點有(zhi)趣(zhang)游戲就感覺對不起這個設(shè)備。本文將來開始著手開發(fā)一個可玩性不大,觀賞性極強的保齡球打磚塊游戲。這僅僅只是一個入門級的游戲,代碼量和制作步驟都超級少,適合入門 在開始之前,請參閱水哥提供的環(huán)境搭建以及部分必備知識博客
在閱讀本文之前,我期望你有部分 Unity3D 開發(fā)的知識,本文不會提及多少 Unity3D 入門的知識,如果有看不懂的地方,還請自行翻 Unity3D 入門知識 此游戲的玩法就是用雙手拿起保齡球,將一堵墻砸掉,將磚塊推下地板。效果視頻如下 寫代碼就和搬磚一樣,一開始咱先使用 Unity OpenVR 虛擬現(xiàn)實入門二:一個最簡單的虛擬現(xiàn)實游戲/程序 的方法搭建出來一個放在 SteamVR SDK 里面的 Sample 的內(nèi)容,開始進行砌墻 以上墻里面的各個磚塊記得加上剛體(Rigidbody)同時設(shè)置質(zhì)量為 0.2 不然咱可打不掉磚塊 接下來咱來創(chuàng)建保齡球子彈,按照約定創(chuàng)建 Prefabs 文件夾,在里面創(chuàng)建一個叫 Bullet 的圓球 如上圖,同樣給此子彈加上剛體,設(shè)置比較大的質(zhì)量。如上圖給了質(zhì)量是 10 這樣才好將磚塊打到地板下。請不要將地板加上剛體哦,默認(rèn)的剛體是加上重力的,剛進入調(diào)試發(fā)現(xiàn)地板掉了,這可不是在做恐怖游戲哈 下面咱來寫一點代碼,用來在扣扳機的時候,創(chuàng)建保齡球子彈 如何在 SteamVR 游戲中,獲取當(dāng)前扳機的狀態(tài)?其實按照 Unity3D OpenVR SteamVR Input Action 動作 博客的建議,咱是不開發(fā)獲取當(dāng)前扳機狀態(tài)的代碼。咱需要開發(fā)的是定義某個動作,如 InteracetUI 這個動作,獲取此動作的值來決定邏輯。這樣做的好處是方便用戶進行配置,以及支持其他不同的交互設(shè)備。如某個設(shè)備沒有扳機,但是此設(shè)備有另一個按鈕,這個按鈕也可以實現(xiàn)此效果,那么就可以讓用戶綁定新的按鍵 咱現(xiàn)在還在 VR 應(yīng)用或游戲開發(fā)的蠻荒時代,很多交互都在摸索階段,為了更好適配未來的新硬件和交互,通過定義動作名而不是綁定具體的硬件設(shè)備上的做法的適配性更強 咱來創(chuàng)建一個叫 ShootWithRotation 的 C# 腳本文件,按照國際慣例,放在 Scripts 文件夾里面
咱添加一個字段,按照 Unity3D OpenVR SteamVR Input Action 動作 博客的內(nèi)容,咱需要一個 bool 值獲取當(dāng)前的扳機是否按下。在 SteamVR 里面,布爾使用
獲取扳機是否按下的代碼如下
通過 state 即可獲取當(dāng)前的扳機是否按下,以上代碼的 Shoot 方法就是實際的射擊代碼,這部分代碼咱在下文才寫?;氐?Shooting 字段的定義。因為我主業(yè)是 WPF 開發(fā),按照我的編碼習(xí)慣,字段是不會公開的,而且使用下劃線開頭,但這和 Unity3D 這邊的編碼規(guī)范沖突,于是我就將字段當(dāng)成屬性好了,第一個字符大寫 咱上面代碼定義的 Shooting 字段,想要獲取交互的本身就需要在 Unity3D 里面進行綁定交互,此綁定交互的方法可參閱 Unity OpenVR 虛擬現(xiàn)實入門六:通過搖桿控制玩家移動 這一篇的內(nèi)容。大概的做法就是先將腳本附加到某個游戲?qū)ο罄锩?。如咱將這個腳本附加到 Player 對象上面,接下來點擊 Shooting 的下拉,選擇交互 咱選擇 InteracetUI 這個動作,默認(rèn)在 SteamVR 里面就是扣扳機這個交互,當(dāng)然,用戶也可以自己設(shè)置到其他按鍵里面 此時我推薦大家如果之前沒有做過 SteamVR 的交互,那請嘗試在 VisualStudio 里面附加 Unity3D 調(diào)試,在 Update 方法里面獲取 Shooting 字段的值了解這部分的交互 如上圖,此時咱將 Shooting 字段和 InteracetUI 這個動作綁定 上圖里面的 Bullet 字段以及 Shoot Speed 字段等,咱將進行定義,代碼如下
以上代碼的 Bullet 就是保齡球子彈的模版,用來創(chuàng)建保齡球子彈,而 ShootSpeed 是射擊頻率。在 VR 應(yīng)用中,如果在 Update 里面不通過判斷頻率,就進行創(chuàng)建子彈,那么將會因為超級高的刷新而讓子彈創(chuàng)建速度超級快。本文這里的代碼判斷頻率只是用了直觀快速的方法 通過下面代碼可以用來限制發(fā)送子彈的速度
下面就是 Shoot 代碼的編寫了,我編寫了幾個版本,經(jīng)過了水哥的測試,也就是本文如下沒有注釋掉代碼的版本的交互是最好的(雖然可玩性也特別渣)因此咱下面將來寫這個版本的邏輯 通過 GameObject.Instantiate 方法創(chuàng)建子彈,接著將子彈放在旁邊即可
因為咱的 Player 和地板沒有添加傳送的功能,因此在設(shè)置 Player 在原點時,剛好將子彈放在 (0,0.25,0.1) 的地方即可。為什么 y 是 0.25 是因為剛好球大小就是 0.5 而坐標(biāo)中點是球心,通過球的一半即可剛好放在地板上。而 z 方向設(shè)置 0.1 是可以讓球剛好在前面 此時在 Unity 綁定 Bullet 字段到咱上文設(shè)置的 Prefbabs 里面的 Bullet 即可,跑起來,通過剛體的邏輯,可以使用雙手拿起球,開始玩起來 接下來是一個被干掉的交互方式,此交互方式是扣扳機進行射擊,射擊方向就是前方 實現(xiàn)方式是在創(chuàng)建子彈時,將子彈的旋轉(zhuǎn)設(shè)置和當(dāng)前 HMD (頭戴式顯示器 Head-mounted display)的方向相同,然后設(shè)置速度方向為物體前方,代碼如下
以下是 ShootWithRotation 的全部代碼
當(dāng)前后續(xù)水哥還開發(fā)出通過抓握的交互方式,這個交互方式看起來更好玩。實現(xiàn)方法是給子彈加上一個叫 Interactable 的腳本,這個腳本是帶在 SteamVR SDK 里面的。添加這個腳本時需要給定他的 activateActionSetOnAttach 字段 再給子彈添加一個 Throwable 腳本,讓這個球可以被扔掉 當(dāng)前的游戲就可以抓起來球然后扔出去 這個游戲開發(fā)難度不高,只是有很多知識需要了解,而且有點費德熙。我在調(diào)試了幾個小時,看著屏幕上工具人水哥測試的畫面,特別想吐 系列博客請看
|
|