Unityで作る「シューティングゲーム」Vol.20

Unityで作るシューティングゲーム、いよいよ20回を迎えました。
徐々に敵も増えてきていますので、そろそろいったんゲームクリアに向けて進んでいこうかなと思います。

前回は「中ボス」の上で動く「タレット」を作って、ぐるぐる回りながらミサイルを撃つ動きを確認することができたと思います。
今回は「中ボス」を動かしていきます。

では早速作っていきましょう。

中ボスのプログラム

まずは中ボスを管理する「 EnemyStationAManager.cs 」というスクリプトファイルを作成します。
つづいて作成したスクリプトファイルに以下のコードを記述していきましょう。

変数を3つ準備しておきます。
速度を管理する 変数:「speed」宣言と同時に初期値を入れてもいいのですが、後に調整ができるようにここでは宣言のみ。
void Start で初期値を代入します。
さらにRigidbody2Dコンポーネントを扱うための 変数:「sARb2d」
もう一つは攻撃や、ダメージを管理するための bool型のフラグ変数:「IsMove」
初期値を[ false ]にしておきます。

❶移動を管理するコルーチン型関数 StationA_Move() を作成します。
この関数は登場シーン(❷)と通常の移動シーン(❸)に分けて管理します。

❷登場シーンはEnemy2と同じような動きになります。
まず初期値を乱数で決め、下方向に3秒間移動させます。
ここで移動を止めて、変数: IsMove を true にします。

❸登場シーンが完了したら、While文を使って、通常の移動を繰り返します。
ここでは3秒間移動、1秒停止の繰り返しを行っています。
X,Yそれぞれ乱数でvelocity の力を決め、移動させます。
乱数を取得してからそれをVector2d型の変数:direction に代入、それを[Rigidbody2d] の[velocity] に入れるなど回りくどいやり方をしていますが、実は1つの文で記述することもできます。

sARb2d.velocity = new Vector2(Random.Range(-3.0f, 3.0f), Random.Range(-3.0f, 3.0f)) * speed;

でもいいのですが、わかりやすいように1つずつ分けて記述しています。

Start 関数では前述したように、
・変数:speedに初期値を入れるコード、
・Rigidbody2D コンポーネントを取得して変数に代入するコード、
・❶のコルーチンを発動するコード(❹)を実行しています。

Update 関数では❺で中ボスが画面外に出ないように、移動制限をかけています。
以前学習したMathf.Clamp を使って実現しています。

private float speed;      //基本の速度を管理する変数
Rigidbody2D sARb2d;       //Rigidbody2Dを管理するための変
bool IsMove = false;      //登場と通常の動きを判定するフラグ

IEnumerator StationA_Move()      //❶移動のコルーチン型関数
{
    transform.position = new Vector3(Random.Range(-15f, 15f), 12f, 0);  //❷初期位置から移動 
    sARb2d.velocity = new Vector2(0, -1f);     //下方向に移動 
    yield return new WaitForSeconds(3);        //3秒継続 
    sARb2d.velocity = transform.up * 0;        //移動を止める 
    yield return new WaitForSeconds(0.5f);     //0.5秒停止 
    IsMove = true;                             //IsMove をtrueに 
    while (true)                               //❸繰り返し処理 
    { 
        float x = Random.Range(-3.0f, 3.0f);       //横の動きを乱数で取得 
        float y = Random.Range(-3.0f, 3.0f);       //縦の動きを乱数で取得 
        Vector2 direction = new Vector2(x, y);     //移動方向を変数で取得 
        sARb2d.velocity = direction * speed;       //移動 
        yield return new WaitForSeconds(3);        //3秒継続 
        sARb2d.velocity = transform.up * 0;        //移動を止める 
        yield return new WaitForSeconds(1);        //1秒停止
    }
}

void Start()
{
    speed = 2f;                               //speed の初期値を2fにセット 
    sARb2d = GetComponent<Rigidbody2D>();     //Rigidbody2D を取得 
    StartCoroutine(StationA_Move());          //❹コルーチン型関数を発動
}

void Update()
{
    //❺移動制限 
    transform.position = new Vector3(Mathf.Clamp(transform.position.x, -18f, 18f), Mathf.Clamp(transform.position.y, -12f, 12f), 1);
}

ここまで作っていったん動かしてみたいと思います。
敵が多くなってきたので、いったんザコキャラはいったん止めておきましょう。

①下の図のように、GameManager を選択して Inspector のチェックを外しておきます。

Unityで作る「シューティングゲーム」Vol.20

スクリプトファイル EnemyStationAManager.cs を EnemyStationA にアタッチして、起動させてみましょう。
すると下の図のように、Turret が3つとも置いてけぼりになってしまいました。
子要素になってはいるものの物理的に接続されていないようです。

Unityで作る「シューティングゲーム」Vol.20

②3つの「TurretLarge」を選択して、Rigidbody2Dコンポーネントの「BodyType」を変更します。
現状「Dynamic」になっていると思います。
「Kinematic」に変更します。それぞれの「BodyType」特徴は以下の通りです。

Dynamic物理演算で移動するオブジェクト
Kinematicスクリプトで動かすオブジェクト(重力や他の力の影響を受けない)
Static全く動かないオブジェクト(リソースに負担がかからない)
Unityで作る「シューティングゲーム」Vol.20

この状態で起動させると、しっかりEnemyStationAについてくると思います。

今回はここまで。
次回は「EnemyStationA」のダメージ判定をしますが、その前にPlayer の攻撃を追加していく必要がありそうです。

続きはこちらから ファイブボックス公式HP

https://www.fivebox.info/post/unityshooting_021

教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。

TOP