2023-05-31|閱讀時間 ‧ 約 5 分鐘

Unity C# | 子彈射擊與命中的思路

一、前言

  這篇文章將會講述子彈射擊與命中的思路,不包含實際程式設計。

二、思路

  僅撰寫思路的原因,主要有兩個方面,第一個是撰寫思路的文章更容易傳載到其他平台,並且因為不包含實作,能更快速的介紹設計思路;第二個是撰寫思路的文章應用更廣,2D或3D遊戲均適用,只要有射擊的要素就能參考。

1. 撰寫便捷
  本文主要有兩種類型的讀者,第一種讀者是遊戲設計的門外漢,對於遊戲設計好奇,想知道該遊戲會怎麼設計;第二種讀者是遊戲設計精熟,相較於看影片模仿,更希望自行研究或快速閱讀參考。
  對於遊戲設計入門或好奇者,本文建議尋找專業的 Youtube 影片,跟隨影片步驟進行遊戲程式撰寫,會比閱讀文章更高效且明確,也不用因此擔心自己是否做錯,是更加高效的學習方式。

2. 應用更廣
  無論是2D遊戲或3D遊戲,子彈設計都需要這些要素,射擊子彈並非單純的把子彈射出即可,還要包含初始化、初速度、命中角度,除此之外還需要準備兩種製作好的素材,因此能藉由思路學習射擊的要素。
  本文結合第三人稱射擊遊戲官方素材包與Youtube教學為雛型,結合作者自行購買的子彈特效素材包中的子彈程式,撰寫成思路作為紀錄,並分享給任何對射擊遊戲有興趣的人閱讀。

三、子彈射擊

  本文章將會從準備物件到子彈三個階段進行介紹,準備的物件包含子彈、特效、位置;子彈三階段包含發射、飛行、命中,本文章不包含事後計算與音效。

1. 準備子彈物件
  第一個要準備的東西,是子彈的物件,此物件為一個預製物(Preferb),其包含子彈的碰撞體、剛體、自身攜帶的特效,依據子彈是否要拋物線,決定是否啟用引擎自帶重力。
  若子彈物件有可能命中玩家,請在遊戲中的玩家與預製物中設定標籤,並在專案設定(Project Setting)中讓此兩個標籤不會相互碰撞,這樣可以防止子彈在發射的當下就命中玩家。

2. 準備命中特效
  當子彈命中物體時,會需要使用標籤(Tag)或組件(Component)或介面(Interface)來判斷命中的對象是否為目標物件(敵人、背景、玩家),並觸發對應的音效與特效。
  當子彈命中後,要觸發特效,如果此特效為爆發式或有明確方向,其爆發噴射方向建議為Y軸正向,也就是在預製物視角中,爆發方向要朝正上方進行粒子特效的播放。

3. 準備射擊位置
  如果發射子彈的主體是玩家,那就要決定在玩家的哪個位置發射,將其遠離玩家一小段距離,讓其發射子彈時不會直接命中玩家,並且依據遊戲需求決定玩家移動與轉向是否會改變射擊位置。
  目前我在撰寫第三人稱射擊遊戲時,有遇到的一個狀況為因為子彈是往鏡頭的正前方發射,所以在非瞄準的情況下,玩家射擊會命中玩家,因此要用程式去控制射擊位置,或讓子彈不會命中玩家。

4. 子彈發射
  當我們按下發射按鍵後,會在射擊位置生成一個子彈,此子彈的方向與預製物中的方向相同,因此要設定此子彈的正前方為發射方向的正前方,並讓子彈自己往正前方前進。
  如果遊戲中玩家與敵人都會發射子彈,使用物件池進行物件生成與控管是更好的程式撰寫方式,除了節省資源以外,還可以讓廢棄資料減少。

5. 子彈飛行
  當子彈被射擊出去以後,此時會噴射粒子特效。如果遊戲需要讓子彈在飛行的過程中有所變化,可以讓子彈的維持預設的剛體模式,能運用給予範圍內的物件推力營造輕物件飛行的飄逸感。

6. 子彈命中
  當子彈命中的時候,會需要計算傷害與觸發回饋,通常粒子特效都都有方向性,因此要確定命中的面,並讓粒子特效的爆發方向為命中面的正前方,這樣能讓子彈命中的回饋更確定。
  關於傷害計算,可以參考我之前撰寫的一篇文章,在最後有附相關的教學影片可以觀看,裡面有使用介面(Interface)進行傷害系統的撰寫。

五、後記

  這篇文章寫起來其實蠻花時間,不過也相當有成就感就是了,子彈射擊與命中是最近撰寫遊戲的內容,所以想了想就撰寫成文章了。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.