用unity製作簡單的太空遊戲(2)-簡單炮臺
多鉚蒸剛,炮塔至大!
億萬星辰,億萬炮塔!
多鉚蒸剛,炮塔至上!
億萬炮塔,億萬榮光!
(PS:我沒有咕咕咕,就是比較慘,一口氣出了半個月的差,人瘦了,也黑了,心塞塞……趕緊寫個文章壓壓驚……)
這一篇我們來講武器相關,本篇篇幅比較長,所以拆成兩篇文章發,本文主要講基本實現,下文講講常見的武器和效果。下一篇:用unity製作簡單的太空遊戲(3)-飛船的常見武器和功能
(PPS:工程連結在文末,上一篇也是,那些文章都沒看完的就留言要程式碼的麻煩動動滑鼠....)
作為太空遊戲,沒有炮塔怎麼能行,趕緊掏出商店搜尋資源,由於沒有好看的free炮塔,暫且先下個最小體積的湊合用著,2M,就它了:
然後我們來搭建這樣一個簡單場景:
炮塔的旋轉
對於炮塔的控制,我們要實現水平方向炮塔本身的旋轉和垂直方向炮管的俯仰,這裡要注意的一點是,這個炮塔資源有坑,軸向是錯亂的,需要我們自己來修復,最終要保證Z軸為正方向。修復的方式可以是gameobject巢狀或者修改模型檔案,理論上修復模型檔案才是正確的,但這裡偷個懶,直接套gameobject調軸向,保證炮塔的水平和垂直旋轉是正確的就行,在圖中,我們要控制Swivel節點作為水平方向的整體旋轉,控制Barrel節點作為垂直方向的俯仰控制,都是根據原有模型以巢狀gameobject來處理,而模型原本的槍管的軸向則是Z軸朝上。具體可以看文末的工程。
然後編寫旋轉控制的程式碼:這裡有個取巧並且效率比較高的方式,就是直接LookRotation目標,然後通過設定localEulerAngles剔除多餘軸向的旋轉,再用Quaternion.RotateTowards進行插值做旋轉速度的控制,注意這裡是控制角速度而非線速度。
再根據滑鼠位置傳入目標位置,這裡注意,沒有檢測到碰撞的時候hit.point是不會變化的,所以要再手動給個位置,這裡直接使用相機遠裁面的長度:
可以看到旋轉已經滿足需求了,這樣就實現了最簡單的炮塔控制。後續還可以對旋轉的插值方式進行更改以實現不同效果的轉速變化等。
一般有個常見的需求是炮塔的旋轉角度約束,比如只能對正前方90°範圍內旋轉等等:
炮塔的UI
關於UI,因為從設計上就分為了目標位置和炮口位置,所以需要分別顯示,這也符合現實情況,通過在炮口位置發射射線檢測即可,也需要注意空碰撞。
我畫了個UI,分別表示滑鼠指向和炮口實際指向,並通過Vector3.Angle取到二者之間的夾角,這樣就有了簡單的瞄準系統。
此處有個常見的需求是在目標指向和真實指向中用虛線連線,這條虛線用處比較多,比如表示炮塔尚未旋轉就位,在快速轉動視角的時候更好顯示等等,具體效果如圖:
虛線的實現很簡單,一個ImageType為Tiled的Image,根據位置設定圖片寬度和角度,這裡有個優化的小點,直接設定Tiled並不正確,還需要在圖片的WarpMode設定為Repleat,unity會自動優化網格面的拉伸:
沒有設定Repleat的Image網格就沒有優化
兩點的位置已經知道了,那麼我們來複習下初中數學題:
1、已知直角三角形ab兩邊邊長,求斜邊c的長度(233分)
2、已知直角三角形三邊長度,求A的角度(666分)
簡單的炮彈
有炮不射怎麼行,掏出PS,是時候展示出我拙劣的PS功力了,畫個方框:
丟進unity拼個子彈,記得給子彈上掛個音效,勾上play On Awake:
然後我們先不管程式碼結構,老夫寫程式碼就是一把搓,擼出功能為先。直接例項化子彈。
子彈具有飛行速度和生命週期,超出週期後銷燬(這裡先簡單實現,後續會改為物件池),開火這裡,有個細節,根據炮口數量進行順序切換。
(PS:大量生成必須要通過物件池管理,不然就坐等記憶體爆炸,物件池的核心在於物件的建立,回收和銷燬的策略,具體的實現網上一搜一大把,unity官網近期BUG了,這裡貼另一個大佬的實現:UGF中的物件池,UGF是個非常適合閱讀學習的unity框架,作者目前在北京暢遊,大家有空多看看,什麼叫工整,什麼叫嚴謹……)
這樣,一個簡單的炮塔就實現了。當然,目前醜陋的炮塔和貧窮的特效顯然是無法令人滿意的,之後將進行特效的補充,豐富武器型別。
(未完待續)
本篇實現功能在工程目錄的~/_Project/Example/Sci/TurretCtrl/SimpleTurretCtrl/路徑下。
工程地址:https://github.com/evesgf/SpaceGame
前文:用unity製作簡單的太空遊戲(1):簡單飛船控制
作者:楊定鵬
專欄地址:https://zhuanlan.zhihu.com/p/72355543
相關文章
- 用 Laravel 簡單製作 SitemapLaravel
- 簡單的製作frameworkFramework
- 用 threejs 製作一款簡單的賽車遊戲JS遊戲
- Flash製作簡單塔防遊戲(一)遊戲
- 簡單的網頁製作網頁
- ROM簡單製作教程
- HTML簡單網頁製作HTML網頁
- Angularjs製作簡單的路由功能簡單程式碼例項AngularJS路由
- unity 委託事件簡單應用Unity事件
- 製作簡單的個人網頁教程網頁
- Golang簡單製作一個池Golang
- Unity 2D遊戲製作Unity遊戲
- Debian安裝包的簡單製作
- python手機版做小遊戲程式碼大全-python簡單小遊戲程式碼 怎麼用Python製作簡單小遊戲...Python遊戲
- jQuery外掛製作簡單介紹jQuery
- CSS樣式案例(2)-製作一個簡單的登入介面CSS
- 使用pyqt5製作簡單計分桌面應用QT
- IOS開發 製作簡單的計算器iOS
- 利用js製作簡單的動態日曆JS
- Unity實現簡單的物件池Unity物件
- 簡簡單單的Vue2(簡單語法,生命週期,元件)Vue元件
- 用jsmooth + inno生成exe並製作簡單安裝包JS
- libssh2的簡單應用
- python 精靈模組非常簡單的讓小朋友製作遊戲和動畫Python遊戲動畫
- 使用Python製作一個簡單的刷微博器Python
- Java的簡單理解(2)Java
- C#-用Winform製作一個簡單的密碼管理工具C#ORM密碼
- 如何製作H5頁面?分享簡單實用H5頁面製作教程H5
- Unity 2D遊戲開發快速入門第1章建立一個簡單的2D遊戲Unity遊戲開發
- Python製作太空射擊小遊戲!Python遊戲
- NFT 製作生成簡單入門——批量道具藏品生成
- 用 JavaScript 實現簡單拼圖遊戲JavaScript遊戲
- 用Python做遊戲有多簡單?Python遊戲
- 求助:簡單遊戲DCI應用設計遊戲
- 怎麼自己製作地圖,簡單的地圖繪製軟體地圖
- 使用Unity製作遊戲AIUnity遊戲AI
- websoket的簡單應用Web
- npm的簡單應用NPM