---
# System prepended metadata

title: Unity遊戲開發_2D俯視射擊遊戲 學習日誌

---

# Unity遊戲開發_2D俯視射擊遊戲 學習日誌

![GunShoot-Unity遊戲開發-學習歷程.001](https://hackmd.io/_uploads/SkwXs8it6.jpg)

[toc]

---

### v0.0.2 - 模擬手電筒和光線系統
給想發射光線的物件加上 Light2D組件，
在組件內可以調整光線的強度、光線的角度、和顏色等等。
擋住光線的物件可以加上 Shadow Castor 2D組件，讓光線在打到物件時，不會穿透過去。

<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F778738137216713%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.1 - 新增射擊功能、優化視覺效果
 
在這次項目，我要著重在遊戲的特效跟打擊感方面， 
所以我學了滿多關於粒子系統的功能， 
我用粒子系統製作出子彈發射和打到牆上的特效， 
再用攝像機晃動增加打擊感， 最後加上槍聲音效。
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F253949270477457%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.2 - 移動影響射擊範圍 、 新增換彈功能
**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F253949270477457%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.3 - 敵人AI模式(狀態機)、優化敵人顯示判定

關於敵人顯示，我是想像是在光線射到敵人時，敵人會顯示，反之則不。
但Unity並沒有提供這種程式，所以只能自己做。
這是我個想法，我使用Unity的一個概念--Ray(射線)。
當角色進人了敵人的警戒範圍時，敵人向角色方向發射Ray，
Ray是會穿透其他物件的，但我們可以得到Ray打到了哪些物件，
且它們按照先後順序排列，我們查看Ray碰到的第一個物件，
如果是角色的話，代表兩人之間沒有任何阻擋，敵人可以顯示。

---
這次是我第一次做敵人AI狀態機， 
我把敵人設為四個狀態—停止、 追擊、 攻擊、 返回。 
在每一個狀態間的切換和實際運用需要很強大的邏輯， 
你必須要對你的項目有很大的了解， 
至於敵人的追擊，只是簡單地跟隨角色玩家的位置移動， 
如果中間有牆壁， 敵人就會撞牆卡在那邊， 
開學後，我針對敵人的追擊做了一些調整。 
在Unity3D中， 官方有針對敵人馴鹿做一個組件， 
可以讓製作者很方便的調整敵人的AI尋路， 
但是在Unity2D方面， 引擎沒有這個尋路組件， 
所以我後來在github上找了一個叫 “NavMeshPlus-master” 開源模組。 
讓製作者在2D也可以享受到3D的尋路組件， 
讓敵人的AI強大了不少， 至少會自動避開障礙物了。

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F265434302710578%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.4 - 新增死亡系統、遊戲結束系統

在這次項目我打算想增加一點遊戲中的特效， 
讓玩家更有沉浸感。所以我使用粒子效果器製作了流血特效，
它的原理其實就是幾個紅色的圓形往指定的方向飄，移動速度隨時間減少而已，
但畢竟是好久沒有碰荔枝效果製作器了， 要重回之前製作的效果還是需要一段時間習慣一下。
當玩家死亡時， 利用漸入漸出讓畫面漸漸變成白色的， 
再慢慢變成黑色的， 更好帶入「遊戲結束」的感覺。

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F117563788010189%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.5 - 新增手榴彈、技能系統(未完成)
想做出手榴彈的效果很簡單， 
但要增加手榴彈的打擊感和給人的效果才是需要設計過的， 
我的想法是這樣： 
手榴彈在發射出去時需要有個音效， 
延遲爆炸後需要爆炸音效， 
且需要使用粒子效果 編輯器製作爆炸特效(一個內煙霧跟一個外煙霧)。 
之前製作血液時已經熟悉了粒子效果編輯器， 
只需要把爆炸形狀改成圓形， 且調整散射速度和顏色， 
內煙霧可以有橙色和灰色增加層次感。
此外， 手榴彈只是三個角色技能中的其中一個， 
我後續計劃製作護盾跟偵查彈， 豐富遊戲。

 

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F3094579220850384%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.6 - 新增 武器背包系統、 偵查彈、 護盾
接下來是製作偵查彈跟護盾， 
護盾在製作上我希望是玩家投出一枚彈，
在1秒後，他會變成護盾， 可以抵擋一切敵人的攻擊， 
一樣要增加打擊感， 讓護盾被子彈擊中時會發射一個擊中特效和音效，
製作完後發現效果蠻不錯的。
偵查彈在投出後過1秒，後會開始偵查， 
我製作一個小範圍帶很長的光線，讓他繞著圓周轉， 
模擬出影片中偵查的樣子， 
在範圍內的敵人生成一個虛擬黃色分身在他們當時的位置，
當然還要加上偵查音效增加臨場感。

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F273096648532389%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.6.A - 新增 狙擊槍、 目標追蹤

製作完步槍後，下一把武器我想做狙擊槍。
相比步槍，狙擊槍我給它設定的特色是視野遠、範圍大、傷害高。
在製作中，我突然想到我在遊戲中有設定玩家的可視範圍(手電筒)，
但它是一個扇形，我想增加可視範圍的話又不能直接放大，
因為扇形大小是由三個點控制的，且方向不同，
後來我發現這三個點是線性的，
我解了二元一次方程式後得到了這三個點和視角大小的關係式，
再用程式去控制就好了。
**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F1306650720236239%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.7 - 商店系統 、 遊戲主體架構完成
在遊戲發想初期，
我就打算讓遊戲有一個中途商店功能。
讓遊戲有沉浸感也是這次項目的課題，
所以我在想要怎麼設計商店。
最後我打算讓商店有閃屏操作台的感覺。
想讓操作台的背景可以無限向下動像是理髮廊的旋轉燈一樣，
需要使用組件 ”Raw Image” 再加上程式的編寫就可以實現了。
**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F280369171153054%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.7.E - 手機也能玩 、新增 回血系統 、 互動物件 : 門

回血系統是遊戲中唯一的治療手段，也是唯一的道具。
這大概是製作中最簡單的系統了，程式部份只要讓生命值增加就好，
重點是回血的特效，這是我對回血特效的想像「綠色的、很多個加號一口氣往上飄」，
當然是很輕鬆就做出來了。

---
門在遊戲中主要是隔絕敵人和玩家的視角，
讓兩方做準備，等開門時決勝負，
在上次製作商店系統時就有做互動系統，
玩家靠近時畫面上彈出按鈕，按下就可開門(門開的動畫也是用DoTween做的)，
門可以被子彈摧毀。

---

在前10個小時中，
我主要是預設使用電腦的操作方法製作，
像是用鍵盤移動角色、用滑鼠的滑動去讓槍口瞄準，
到手機上後就沒有這些器具了，移動和點擊方面可以製作虛擬搖桿，
但在這次的項目中還多了一項需求 ---- 槍口旋轉，槍口可以360度旋轉，
如果再次使用虛擬搖桿會讓玩家覺得靈敏度太大 很難操控，
所以我打算讓玩家滑動手機螢幕本身，
這是我第一次做這個功能，經過我思考後，我的思路是：
在手指按下時開始記錄，期間持續記錄每幀手指移動的距離，
時刻回傳給角色程式腳本讓它旋轉，直到手指離開，後來製作證明我的思路是可行的。

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=314&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F2551259635023531%2F&show_text=false&width=560&t=0" width="560" height="314" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.8.A - 新增任務系統

任務系統主要分成三個部份
- 第一、Controller，主系統腳本掌控兩個部份：
	. 任務清單 ，記錄要處理的任務，由第二部份提供
	. 任務生成，依照任務的類型(主 \ 副)生成UI物件，UI物件由第三部份控制

- 第二、Data，我為了這次項目製作了任務資料製作編輯器(圖一)，可以讓我把每個任務資料用文字的方式方便編輯成一個一個的檔案，而不是用程式的方式編輯(圖二)

- 第三、Model，UI物件上也有一套獨立的任務腳本，
  如果說主系統是生成和派發任務，那任務腳本就是處理單獨自己任務的執行度。
  在任務腳本中，它要先依照任務的類型生成畫面上的指示物，
  讓玩家知道自己要如何完成任務。
  在任務的完成判斷上，假如是「消滅XX個敵人」這種任務，
  因為要計數，所以我在每個Tag是敵人的物件上放一個任務計數器腳本，
  當敵人被玩家消滅時，腳本會馬上向任務腳本發送消息，讓它更新任務的狀態。
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F229253536658834%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.8.B - 新增 衝鋒槍

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F260892020085319%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v0.9 -   新增 初始場景(可選角色、 查看角色資料)

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F300584442486747%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v1.0 - 地圖擴大、 隨機敵人

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F2231234833932247%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>

### v1.1 - 結算動畫

**音量注意**
<iframe src="https://www.facebook.com/plugins/video.php?height=363&href=https%3A%2F%2Fwww.facebook.com%2F100080394639466%2Fvideos%2F6933729336647775%2F&show_text=false&width=560&t=0" width="560" height="363" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" allowFullScreen="true"></iframe>
