unity3d android開發筆記之空氣牆的實現

  經過作unity3d的demo,我發現了一些小問題,而且解決了很多,遇到的問題我沒有及時記錄下來,之後我會經過隨筆的方式記錄下個人成長經歷,在這裏先緬懷下我逝去的時光。T.T..ide

  However,從今天開始作的第一件事,就是把我作的demo的功能更新的實現方法放在這裏,供你們往後參考,以提供小小的解決方案。3d

  先放一張遊戲圖,作的是一我的,在地圖上行走,今天要講到的是,關於如何實現空氣牆的討論。orm

  

   衆所周知,通常來講,地圖是有限制大小的,咱們不須要玩家跑到一些限制地點,例如地圖的極限邊緣,這樣就失去了可控性,並且容易觸發各類意外。因此最好的方式是限制玩家的行動範圍,這就出現了遊戲中著名的空氣牆,明明3D遊戲中,能夠看獲得眼前的景象,卻被一堵空氣牆擋住了去路。這不是不讓你去,而是你過去了,就麻煩了,因此,稱得上是良心的做品,通常範圍會放的很寬,由於考慮的更多了嘛,而一些趕工的做品呢,爲了不碰見突發狀況,就喜歡將玩家儘量關在「空氣牆裏」,這樣更容易寫程序。題外話說多了,咱們來說一講原理吧。其實空氣牆是基於collider的碰撞器,碰撞器檢測到咱們的角色與空氣牆接觸了,那麼就限制咱們的角色座標,不讓他越過雷池了,而大多數的空氣牆使用什麼方法來避免玩家越過呢?blog

  有些人忽然會想到,用相似於地圖平面,咱們能站在平面上,沒法穿過去,就是由於地圖帶有collider屬性,若是咱們再弄一塊 「平面」,豎起來放,加上collider,不就作成了空氣牆了嗎?這樣作是可行的,然而平面---也便是plane是基於mesh 的碰撞檢測,是基於mesh頂點的,比較耗費運算資源,並且碰撞壁沒有厚度,物體穿過碰撞壁的風險較高。而比較正規的作法應該是用box collider拼接,有利於運算效率和減小誤判。相關的例子,能夠參考一些官方的demo和一些已經成熟了的遊戲demo。遊戲

  來,那個angry-bots我來給你們截個圖,你們就知道了,在那個官方遊戲demo裏,程序猿是如何實現空氣牆的。資源

  你們看到了,在environment下的 collider 裏面有好多的capsule 和cube 都是用來拼接出複雜的空氣牆系統的,而打開其中的一個cube,咱們看到了,在左圖中是一個牆面,然而咱們沒法離牆太近,由於牆面是設有空氣牆的,咱們在右圖中打開mesh,看到了貼圖的前面的確豎着黑壓壓一個長方體塊兒。it

  下面我就演示如何在本身的地圖上添加空氣牆吧。io

  首先第一步,添加一個 plane,這個plane要放大到足夠覆蓋到地圖的一條邊才行。form

  這裏須要注意一點了,你看到個人plane的mesh 是已經旋轉過的了,剛開始添加的plane是平躺着的,因此須要你調整rotation 屬性,來使得 你的plane 「豎起來」,像一堵牆同樣。接着你要關閉plane的mesh render,這樣在遊戲運行的時候,這個plane 的綠色mesh線就會消失,變得透明。對了,還有一點尤爲是注意的,你調整rotation每每在90度,和270度的時候,均可以讓它豎起來變成一堵牆,可是呢?哪個角度才行呢?答案是-要根據transform的正方向來看。你看我圖中的正方向是朝着地圖內側的,這樣看彷佛不太明顯,看下圖有個對比的,你就明白了。效率

         

  經過找不一樣你們是否發現了什麼呢?對,就是那個對着地圖水平面的軸,要朝向地圖內側!爲何?由於當角色 從地圖內側走來的時候,若是plane mesh 的朝向不是朝着角色的,那麼這個mesh 是不被渲染的,並且 collider 也不會有做用,這是direct3d那一套的默認選擇,固然若是你足夠牛,修改他的shader的話,實現90度和270,均可以實現碰撞的效果也是能夠的~

  好了,本人水平有限,就再也不討論其餘的空氣牆作法了,其實用腳本寫地圖碰撞檢測也挺快的,可是,在一張複雜的地圖上,這樣就顯得有些乏力了,因此,你們練好用小物體填充的方式,作空氣牆,對作遊戲是很是實用有效的。如今已經和你們討論了正確使用空氣牆的作法了,一塊兒進步吧~~~

相關文章
相關標籤/搜索