2016年12月15日 星期四

Day 16: 敵人重生、移除

把昨天做的敵人拉到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。



並把排行榜和按鈕遊戲開始的觸控指示畫完。



待續。

沒有留言 :

張貼留言