(本篇文章網誌版:http://shineright.blogspot.tw/2016/12/day-16.html)
把昨天做的敵人拉到Project欄成為Prefab後,就可以來做敵人的重生與移除了。
先前說過,我要做的敵人重生系統和裝備重生不太一樣。裝備重生是在一定範圍(X軸)內重生,並固定在5~10後重生下一個裝備。而現在要做的敵人重生系統是由11個重生點構成,每個重生點每秒有一定機率生出敵人,且敵人出生的位置固定。
先在Scene裡建立的重生點。
新建一個名為EnemySpawnPoint.cs的C# Script。
public class EnemySpawnPoint : MonoBehaviour
{
public float spawnRatePerSec; //每秒重生機率
public GameObject[] enemyPrefabs; //重生的敵人種類
void Start()
{
//每秒呼叫一次SpawnEnemy
InvokeRepeating ("SpawnEnemy", 1f, 1f);
}
void SpawnEnemy()
{
//一定機率重生隨機一個敵人
if (Random.value < spawnRatePerSec) {
Instantiate (enemyPrefabs [Random.Range (0, enemyPrefabs.Length)], transform.position, Quaternion.identity);
}
}
}
Start()
函數內的InvokeRepeating()
。InvokeRepeating()
和Invoke()
很像,只是InvokeRepeating
可以讓程式重複呼叫一個函數。第一個參數是要呼叫的函數名,第二個參數首次呼叫該函數的延遲時間,第三個參數則是每次呼叫之間的間隔時間。這裡我讓程式每秒呼叫一次SpawnEnemy()
。
SpawnEnemy
函數的if
判斷式決定是否重生新的敵人。Random.value
會隨機回傳[0, 1]之間的數,所以如果spawnRatePerSec
是0.1,該if
判斷式就有0.1的機率成立。
回到Unity Editor的Scene視窗,把Enemy Spawn Point (Script) Component加上所有重生點Game Object。並把敵人的Prefab拉至Enemy Prefabs欄位中(Left 1,2,3重生點指定為 Right Side敵人,Right 1,2,3應定為Left Side敵人,而Top 1,2,3,4,5指定為縱向敵人)。
最後,把每個重生點的Spawn Rate Per Sec設定好就完成了!(我把它設為0.05,不然會一次重生超多敵人)
進入Play Mode測試一次,似乎一切完美……但跑久了便會發現,生成的敵人就算離開了螢幕,還是會待在Scene上,永遠不會消失。
根據先前所寫的程式,有子彈的Destroy After Seconds (Script) Component或掉落裝備碰觸到邊界的Destroy Game Object On Trigger (Script) Component兩種方式。在這裡,我覺得後者比較合適,因為敵人只會直線前進,並且移動速度皆不相同。若使用Destroy After Seconds,每個敵人都要慢慢測試它們離開螢幕的時間以設定數值。
先為所有敵人、敵人子彈的Prefab都加上Rigidbody 2D和Box Collider 2D的Component,並把Rigidbody 2D的Is Kinematic欄打勾,使物理作用力對它們無效。此外,Box Collider 2D的Is Trigger也要打勾。
更新完Prefab後,到Hierarchy中點我在Day 7建立的「Boundary Collider」Game Object,為已經有一個Box Collider的它再建立兩個新的Box Collider Component,一樣把Is Trigger欄打勾,並用Edit Collider按鈕分別把兩個Collider的範圍拉到螢幕左方與螢幕右方,阻擋所有敵人可達範圍。
我把Collider拉離螢幕遠一點,以免敵人一重生就碰到Boundary Collider而慘遭移除。
進入Play Mode測試,敵人的重生與移除都完成了!
設計完App的Icon。
並把排行榜和按鈕遊戲開始的觸控指示畫完。
待續。