1. 程式人生 > >在Unity3D中開發射擊遊戲的一些思路(2)

在Unity3D中開發射擊遊戲的一些思路(2)

我們在製作FPS遊戲中,經常遇到的一個情況是:穿模。穿模是一個亙古不變的難題,可以說至今沒有一個很不錯的解決方式,但是現在有以下幾種解決方式是比較受歡迎的。

1.使用子攝像機單獨渲染手臂,這也是我們會主要討論的方法

2.在貼近牆時,播放垂下槍的動畫使槍與身體平行,這樣模型就不會穿牆,一般配合第一種方法使用效果更佳,這種方法是目前看來最為完美的一種解決方法,然而,這種方法需要美術人員的動畫設計以及美工人員的多次調參,工程量較大,這種方案在製作成本較低的獨立遊戲時並不是首選方案。

首先我們搭建一個簡單的示例場景,使用一個細長的方塊代替槍位置,模擬了一個穿牆效果:


這時新增一個子攝像機,並掛載到主攝像機下,將Clear Flags改為Depth only並將Depth提高10:


可以看到,方塊的渲染已經完整了,只不過陰影光照等會出現問題,在使命召喚,戰地等FPS大作中,角色靠近牆槍的陰影會變黑或者變亮,就是因為錯位穿透導致的光照計算錯誤。因此部分遊戲就引入了在貼近牆時播放槍下垂的辦法,可以通過Physics.SphereCast這個方法來判斷槍前方是否有牆壁並切換動畫的播放:

https://docs.unity3d.com/ScriptReference/Physics.SphereCast.html

通過發射一個從槍托到槍口方向的SphereCast,判斷槍口是否有撞到牆,注意在執行判斷的同時,要確保場景中槍械,玩家身體與其他物體分別處於不同層,這樣才可以避免出現射線與槍本身或第一人稱角色控制器本身碰撞出現鬼畜的情況,同時也會避免出現在近戰時射線碰撞到敵人身上自動收槍然後“禮貌”的被敵人打死的尷尬情況。