コガネブログ

平日更新を目標に Unity や C#、Visual Studio などのゲーム開発アレコレを書いていきます

【Unity 入門】全方位シューティングを作る 第8回 敵の作成と出現

目次

前回のチュートリアル

はじめに

前回は、プレイヤーが弾を発射するようにしました
今回は、敵を作成していきます

敵の配置

まず、敵をシーンに配置していきます

f:id:baba_s:20180331120642p:plain

「space-shooter/ships」フォルダ内の「10」を、Hierarchy の欄にドラッグします

f:id:baba_s:20180331123726p:plain

このままだと名前が分かりづらいため、
配置した「10」を選択して、名前を「Enemy1」に変更します
(後から敵の種類を増やすため、今回作成する敵の名前に「1」と付けています)
また、プレイヤー同様に、「Scale」の「X」と「Y」に「1.56」と入力します

これで、敵の配置が完了しました

敵のプレハブ化

次は敵をプレハブ化していきます
敵は、一定間隔で画面外からステージに出現するため、
プレハブ化して、ゲーム中にたくさん複製できるようにしておきます

f:id:baba_s:20180331123736p:plain

Hierarchy の欄の「Enemy1」オブジェクトを
「Prefabs」フォルダにドラッグします

f:id:baba_s:20180331123743p:plain

これで、敵のプレハブが作成できました

f:id:baba_s:20180331123752p:plain

シーンに存在する「Enemy1」オブジェクトは不要になるため、
Hierarchy で「Enemy1」オブジェクトを選択して、Delete キーを押して削除します

これで、敵のプレハブ化が完了しました

敵を制御するスクリプトの作成

次は、敵の移動を行うスクリプトを作成していきます

f:id:baba_s:20180331122658p:plain

「Player」スクリプトを作成した時と同様の手順で、
「Enemy」スクリプトを作成します

そして、作成した「Enemy」スクリプトをコードエディタで開き、
下記のコードを記述します

using UnityEngine;

// 敵の出現位置の種類
public enum RESPAWN_TYPE
{
    UP, // 上
    RIGHT, // 右
    DOWN, // 下
    LEFT, // 左
    SIZEOF, // 敵の出現位置の数
}

// 敵を制御するコンポーネント
public class Enemy : MonoBehaviour
{
    public Vector2 m_respawnPosInside; // 敵の出現位置(内側)
    public Vector2 m_respawnPosOutside; // 敵の出現位置(外側)
    public float m_speed; // 移動する速さ
    public int m_hpMax; // HP の最大値
    public int m_exp; // この敵を倒した時に獲得できる経験値
    public int m_damage; // この敵がプレイヤーに与えるダメージ

    private int m_hp; // HP
    private Vector3 m_direction; // 進行方向

    // 敵が生成された時に呼び出される関数
    private void Start()
    {
        // HP を初期化する
        m_hp = m_hpMax;
    }

    // 毎フレーム呼び出される関数
    private void Update()
    {
        // まっすぐ移動する
        transform.localPosition += m_direction * m_speed;
    }

    // 敵が出現する時に初期化する関数
    public void Init( RESPAWN_TYPE respawnType )
    {
        var pos = Vector3.zero;

        // 指定された出現位置の種類に応じて、
        // 出現位置と進行方向を決定する
        switch ( respawnType )
        {
            // 出現位置が上の場合
            case RESPAWN_TYPE.UP:
                pos.x = Random.Range( 
                    -m_respawnPosInside.x, m_respawnPosInside.x );
                pos.y = m_respawnPosOutside.y;
                m_direction = Vector2.down;
                break;

            // 出現位置が右の場合
            case RESPAWN_TYPE.RIGHT:
                pos.x = m_respawnPosOutside.x;
                pos.y = Random.Range( 
                    -m_respawnPosInside.y, m_respawnPosInside.y );
                m_direction = Vector2.left;
                break;

            // 出現位置が下の場合
            case RESPAWN_TYPE.DOWN:
                pos.x = Random.Range( 
                    -m_respawnPosInside.x, m_respawnPosInside.x );
                pos.y = -m_respawnPosOutside.y;
                m_direction = Vector2.up;
                break;

            // 出現位置が左の場合
            case RESPAWN_TYPE.LEFT:
                pos.x = -m_respawnPosOutside.x;
                pos.y = Random.Range( 
                    -m_respawnPosInside.y, m_respawnPosInside.y );
                m_direction = Vector2.right;
                break;
        }

        // 位置を反映する
        transform.localPosition = pos;
    }
}

これで、敵の移動を行うスクリプトの用意ができたので、

f:id:baba_s:20180331123353p:plain

Unity エディタに戻り、「Enemy」スクリプトを
「Enemy1」プレハブにドラッグして設定します

f:id:baba_s:20180331123432p:plain

「Enemy1」プレハブを選択して、Inspector の欄に
「Enemy」スクリプトが表示されていれば、正常に反映できています

f:id:baba_s:20180331123959p:plain

さらに、「Enemy」スクリプトのパラメータを設定します

項目 補足
Respawn Pos Inside X: 4.8 Y: 3.5 敵の出現位置(内側)
Respawn Pos Outside X: 5.8 Y: 4.4 敵の出現位置(外側)
Speed 0.03 移動する速さ
Hp Max 1 HP の最大値
Exp 2 この敵を倒した時に獲得できる経験値
Damage 5 この敵がプレイヤーに与えるダメージ

これで、敵を制御するスクリプトの作成が完了しました

敵の出現を管理するスクリプトの作成

敵を作成することができたので、
一定時間ごとに敵を出現させるスクリプトを作成していきます

f:id:baba_s:20180331124219p:plain

「Player」スクリプトを作成した時と同様の手順で、
「EnemyManager」スクリプトを作成します

そして、作成した「EnemyManager」スクリプトをコードエディタで開き、
下記のコードを記述します

using UnityEngine;

// 敵の出現を制御するコンポーネント
public class EnemyManager : MonoBehaviour
{
    public Enemy[] m_enemyPrefabs; // 敵のプレハブを管理する配列
    public float m_interval; // 出現間隔(秒)

    private float m_timer; // 出現タイミングを管理するタイマー

    // 毎フレーム呼び出される関数
    private void Update()
    {
        // 出現タイミングを管理するタイマーを更新する
        m_timer += Time.deltaTime;

        // まだ敵が出現するタイミングではない場合、
        // このフレームの処理はここで終える
        if ( m_timer < m_interval ) return;

        // 出現タイミングを管理するタイマーをリセットする
        m_timer = 0;

        // 出現する敵をランダムに決定する
        var enemyIndex = Random.Range( 0, m_enemyPrefabs.Length );

        // 出現する敵のプレハブを配列から取得する
        var enemyPrefab = m_enemyPrefabs[ enemyIndex ];

        // 敵のゲームオブジェクトを生成する
        var enemy = Instantiate( enemyPrefab );

        // 敵を画面外のどの位置に出現させるかランダムに決定する
        var respawnType = ( RESPAWN_TYPE )Random.Range( 
            0, ( int )RESPAWN_TYPE.SIZEOF );

        // 敵を初期化する
        enemy.Init( respawnType );
    }
}

これで、敵の出現を管理するスクリプトの用意ができたので、
Unity エディタに戻ります

f:id:baba_s:20180331124504p:plain

Hierarchy の欄の「Create>Create Empty」を選択して
新規のゲームオブジェクトを作成します

f:id:baba_s:20180331124641p:plain

作成した「GameObject」を選択して、名前に「EnemyManager」と入力します

f:id:baba_s:20180331124730p:plain

そして、先ほど作成した「EnemyManager」スクリプトを、
今回作成した「EnemyManager」オブジェクトにドラッグします

f:id:baba_s:20180331124825p:plain

「EnemyManager」オブジェクトを選択して、
Inspector の欄に「EnemyManager」スクリプトが表示されていれば
正しく設定ができています

続けて、「EnemyManager」スクリプトのパラメータを設定していきます

f:id:baba_s:20180331124916p:plain

まず、「Enemy Prefabs」の左側の三角形をクリックして、
表示された「Size」に「1」と入力します

f:id:baba_s:20180331125148p:plain

そして、表示された「Element 0」の欄に、
「Enemy1」プレハブをドラッグして設定します

f:id:baba_s:20180331125155p:plain

最後に「Interval」(出現間隔)に「0.5」と入力します

f:id:baba_s:20180331125349g:plain

これで、Unity を再生すると、
0.5 秒毎に、画面外から敵が出現するようになったことが確認できます

おまけ:敵の速さの調整

f:id:baba_s:20180331125916p:plain

「Enemy1」プレハブを選択して、
「Enemy」スクリプトの「Speed」(移動する速さ)を調整することで、
敵が移動する速さを調整することができます
興味があればパラメータを調整してみて頂ければと思います

f:id:baba_s:20180331125949g:plain

おまけ:敵の出現間隔の調整

f:id:baba_s:20180331125623p:plain

「EnemyManager」オブジェクトを選択して、
「EnemyManager」スクリプトの「Interval」(出現間隔)を調整することで、
敵の出現間隔を調整することができます
興味があればパラメータを調整してみて頂ければと思います

f:id:baba_s:20180331125631g:plain

次回は、弾と敵の当たり判定を作成していきます

次のチュートリアル

チュートリアル一覧