用unity製作簡單的太空遊戲(2)-簡單炮臺

遊資網發表於2019-07-10
用unity製作簡單的太空遊戲(2)-簡單炮臺

多鉚蒸剛,炮塔至大!

億萬星辰,億萬炮塔!

多鉚蒸剛,炮塔至上!

億萬炮塔,億萬榮光!

(PS:我沒有咕咕咕,就是比較慘,一口氣出了半個月的差,人瘦了,也黑了,心塞塞……趕緊寫個文章壓壓驚……)

這一篇我們來講武器相關,本篇篇幅比較長,所以拆成兩篇文章發,本文主要講基本實現,下文講講常見的武器和效果。下一篇:用unity製作簡單的太空遊戲(3)-飛船的常見武器和功能

(PPS:工程連結在文末,上一篇也是,那些文章都沒看完的就留言要程式碼的麻煩動動滑鼠....)

作為太空遊戲,沒有炮塔怎麼能行,趕緊掏出商店搜尋資源,由於沒有好看的free炮塔,暫且先下個最小體積的湊合用著,2M,就它了:

用unity製作簡單的太空遊戲(2)-簡單炮臺

然後我們來搭建這樣一個簡單場景:

用unity製作簡單的太空遊戲(2)-簡單炮臺


炮塔的旋轉

對於炮塔的控制,我們要實現水平方向炮塔本身的旋轉和垂直方向炮管的俯仰,這裡要注意的一點是,這個炮塔資源有坑,軸向是錯亂的,需要我們自己來修復,最終要保證Z軸為正方向。修復的方式可以是gameobject巢狀或者修改模型檔案,理論上修復模型檔案才是正確的,但這裡偷個懶,直接套gameobject調軸向,保證炮塔的水平和垂直旋轉是正確的就行,在圖中,我們要控制Swivel節點作為水平方向的整體旋轉,控制Barrel節點作為垂直方向的俯仰控制,都是根據原有模型以巢狀gameobject來處理,而模型原本的槍管的軸向則是Z軸朝上。具體可以看文末的工程。

用unity製作簡單的太空遊戲(2)-簡單炮臺

然後編寫旋轉控制的程式碼:這裡有個取巧並且效率比較高的方式,就是直接LookRotation目標,然後通過設定localEulerAngles剔除多餘軸向的旋轉,再用Quaternion.RotateTowards進行插值做旋轉速度的控制,注意這裡是控制角速度而非線速度。

用unity製作簡單的太空遊戲(2)-簡單炮臺

再根據滑鼠位置傳入目標位置,這裡注意,沒有檢測到碰撞的時候hit.point是不會變化的,所以要再手動給個位置,這裡直接使用相機遠裁面的長度:

用unity製作簡單的太空遊戲(2)-簡單炮臺

用unity製作簡單的太空遊戲(2)-簡單炮臺

可以看到旋轉已經滿足需求了,這樣就實現了最簡單的炮塔控制。後續還可以對旋轉的插值方式進行更改以實現不同效果的轉速變化等。

一般有個常見的需求是炮塔的旋轉角度約束,比如只能對正前方90°範圍內旋轉等等:

用unity製作簡單的太空遊戲(2)-簡單炮臺

用unity製作簡單的太空遊戲(2)-簡單炮臺

炮塔的UI

關於UI,因為從設計上就分為了目標位置和炮口位置,所以需要分別顯示,這也符合現實情況,通過在炮口位置發射射線檢測即可,也需要注意空碰撞。

用unity製作簡單的太空遊戲(2)-簡單炮臺

我畫了個UI,分別表示滑鼠指向和炮口實際指向,並通過Vector3.Angle取到二者之間的夾角,這樣就有了簡單的瞄準系統。

用unity製作簡單的太空遊戲(2)-簡單炮臺

此處有個常見的需求是在目標指向和真實指向中用虛線連線,這條虛線用處比較多,比如表示炮塔尚未旋轉就位,在快速轉動視角的時候更好顯示等等,具體效果如圖:

用unity製作簡單的太空遊戲(2)-簡單炮臺

虛線的實現很簡單,一個ImageType為Tiled的Image,根據位置設定圖片寬度和角度,這裡有個優化的小點,直接設定Tiled並不正確,還需要在圖片的WarpMode設定為Repleat,unity會自動優化網格面的拉伸:

用unity製作簡單的太空遊戲(2)-簡單炮臺

沒有設定Repleat的Image網格就沒有優化

兩點的位置已經知道了,那麼我們來複習下初中數學題:

用unity製作簡單的太空遊戲(2)-簡單炮臺

1、已知直角三角形ab兩邊邊長,求斜邊c的長度(233分)

用unity製作簡單的太空遊戲(2)-簡單炮臺

2、已知直角三角形三邊長度,求A的角度(666分)

用unity製作簡單的太空遊戲(2)-簡單炮臺

簡單的炮彈

有炮不射怎麼行,掏出PS,是時候展示出我拙劣的PS功力了,畫個方框:

用unity製作簡單的太空遊戲(2)-簡單炮臺

丟進unity拼個子彈,記得給子彈上掛個音效,勾上play On Awake:

用unity製作簡單的太空遊戲(2)-簡單炮臺

然後我們先不管程式碼結構,老夫寫程式碼就是一把搓,擼出功能為先。直接例項化子彈。

用unity製作簡單的太空遊戲(2)-簡單炮臺

子彈具有飛行速度和生命週期,超出週期後銷燬(這裡先簡單實現,後續會改為物件池),開火這裡,有個細節,根據炮口數量進行順序切換。

用unity製作簡單的太空遊戲(2)-簡單炮臺

(PS:大量生成必須要通過物件池管理,不然就坐等記憶體爆炸,物件池的核心在於物件的建立,回收和銷燬的策略,具體的實現網上一搜一大把,unity官網近期BUG了,這裡貼另一個大佬的實現:UGF中的物件池,UGF是個非常適合閱讀學習的unity框架,作者目前在北京暢遊,大家有空多看看,什麼叫工整,什麼叫嚴謹……)

用unity製作簡單的太空遊戲(2)-簡單炮臺

這樣,一個簡單的炮塔就實現了。當然,目前醜陋的炮塔和貧窮的特效顯然是無法令人滿意的,之後將進行特效的補充,豐富武器型別。

(未完待續)

本篇實現功能在工程目錄的~/_Project/Example/Sci/TurretCtrl/SimpleTurretCtrl/路徑下。

工程地址:https://github.com/evesgf/SpaceGame

前文:用unity製作簡單的太空遊戲(1):簡單飛船控制


作者:楊定鵬
專欄地址:https://zhuanlan.zhihu.com/p/72355543

相關文章