通過做unity3d的demo,我發現了一些小問題,並且解決了不少,遇到的問題我沒有及時記錄下來,以后我會通過隨筆的方式記錄下我的成長經歷,在這里先緬懷下我逝去的時光。T.T..
However,從今天開始做的第一件事,就是把我做的demo的功能更新的實現方法放在這里,供大家日后參考,以提供小小的解決方案。
先放一張游戲圖,做的是一個人,在地圖上行走,今天要講到的是,關於如何實現空氣牆的討論。

眾所周知,一般來說,地圖是有限制大小的,我們不需要玩家跑到一些限制地點,例如地圖的極限邊緣,這樣就失去了可控性,而且容易觸發各種意外。所以最好的方式是限制玩家的行動范圍,這就出現了游戲中著名的空氣牆,明明3D游戲中,可以看得到眼前的景象,卻被一堵空氣牆擋住了去路。這不是不讓你去,而是你過去了,就麻煩了,所以,稱得上是良心的作品,一般范圍會放的很寬,因為考慮的更多了嘛,而一些趕工的作品呢,為了避免遇見突發情況,就喜歡將玩家盡可能關在“空氣牆里”,這樣更容易寫程序。題外話說多了,我們來講一講原理吧。其實空氣牆是基於collider的碰撞器,碰撞器檢測到我們的角色與空氣牆接觸了,那么就限制我們的角色坐標,不讓他越過雷池了,而大多數的空氣牆使用什么方法來避免玩家越過呢?
有些人突然會想到,用類似於地圖平面,我們能站在平面上,無法穿過去,就是因為地圖帶有collider屬性,如果我們再弄一塊 “平面”,豎起來放,加上collider,不就做成了空氣牆了嗎?這樣做是可行的,然而平面---也即是plane是基於mesh 的碰撞檢測,是基於mesh頂點的,比較耗費運算資源,而且碰撞壁沒有厚度,物體穿過碰撞壁的風險較高。而比較正規的做法應該是用box collider拼接,有利於運算效率和減少誤判。相關的例子,可以參考一些官方的demo和一些已經成熟了的游戲demo。
來,那個angry-bots我來給大家截個圖,大家就知道了,在那個官方游戲demo里,程序猿是如何實現空氣牆的。


大家看到了,在environment下的 collider 里面有好多的capsule 和cube 都是用來拼接出復雜的空氣牆系統的,而打開其中的一個cube,我們看到了,在左圖中是一個牆面,然而我們無法離牆太近,因為牆面是設有空氣牆的,我們在右圖中打開mesh,看到了貼圖的前面的確豎着黑壓壓一個長方體塊兒。
下面我就演示如何在自己的地圖上添加空氣牆吧。
首先第一步,添加一個 plane,這個plane要放大到足夠覆蓋到地圖的一條邊才行。

這里需要注意一點了,你看到我的plane的mesh 是已經旋轉過的了,剛開始添加的plane是平躺着的,所以需要你調整rotation 屬性,來使得 你的plane “豎起來”,像一堵牆一樣。接着你要關閉plane的mesh render,這樣在游戲運行的時候,這個plane 的綠色mesh線就會消失,變得透明。對了,還有一點尤其是注意的,你調整rotation往往在90度,和270度的時候,都可以讓它豎起來變成一堵牆,但是呢?哪一個角度才行呢?答案是-要根據transform的正方向來看。你看我圖中的正方向是朝着地圖內側的,這樣看似乎不太明顯,看下圖有個對比的,你就明白了。

通過找不同大家是否發現了什么呢?對,就是那個對着地圖水平面的軸,要朝向地圖內側!為什么?因為當角色 從地圖內側走來的時候,如果plane mesh 的朝向不是朝着角色的,那么這個mesh 是不被渲染的,而且 collider 也不會有作用,這是direct3d那一套的默認選擇,當然如果你足夠牛,修改他的shader的話,實現90度和270,都可以實現碰撞的效果也是可以的~
好了,本人水平有限,就不再討論其他的空氣牆做法了,其實用腳本寫地圖碰撞檢測也挺快的,但是,在一張復雜的地圖上,這樣就顯得有些乏力了,所以,大家練好用小物體填充的方式,做空氣牆,對做游戲是非常實用有效的。現在已經和大家討論了正確使用空氣牆的做法了,一起進步吧~~~
