敵キャラを生成する仕組みの作り方

前回までの作業で、今回のシューティングゲームの敵キャラに相当する隕石を作ることができました。次はその隕石を一定間隔で生成する仕組みを作りましょう。

スポンサーリンク

敵キャラ生成オブジェクトのC#スクリプト

では早速ですが敵キャラ生成オブジェクトのC#スクリプトを書いていきます。新しいC#スクリプトを作り、名前を「MeteorSpawner」に変更して次のコードを書いてください。

using System.Collections;
using UnityEngine;

public class MeteorSpawner : MonoBehaviour
{

  enum MeteorSize { Small, Medium, Large, }

  public bool isActive = false;

  [SerializeField]
  GameObject meteorPrefab = null;
  [SerializeField, Min(0)]
  float minMeteorSpeed = 1;
  [SerializeField, Min(0)]
  float maxMeteorSpeed = 4;
  [SerializeField, Range(-90, 90)]
  float minAngleZ = 0;
  [SerializeField, Range(-90, 90)]
  float maxAngleZ = 0;
  [SerializeField, Min(0.1f)]
  float minSpawnInterval = 1;
  [SerializeField, Min(0.1f)]
  float maxSpawnInterval = 3;

  bool spawning = false;

  void Update()
  {
    if (isActive && !spawning)
    {
      StartCoroutine(nameof(SpawnTimer));
    }
  }

  IEnumerator SpawnTimer()
  {
    spawning = true;

    yield return new WaitForSeconds(Random.Range(minSpawnInterval, maxSpawnInterval));

    SpawnMeteor();

    spawning = false;
  }

  void SpawnMeteor()
  {
    GameObject meteorObj;
    MeteorController meteor;
    Vector3 scale = Vector3.one;
    Quaternion rotation = Quaternion.Euler(Vector3.forward * Random.Range(minAngleZ, maxAngleZ));   // 隕石の発射角度
    int hpMultiplier = 1;
    int scoreMultiplier = 1;

    // enum「MeteorSize」の要素数を取得
    int sizeCount = System.Enum.GetNames(typeof(MeteorSize)).Length;
    
    // 隕石の大きさを決定
    int choosedSize = Random.Range(0, sizeCount);

    // intをenumに変換し、サイズやHP等を設定
    switch ((MeteorSize)System.Enum.ToObject(typeof(MeteorSize), choosedSize))
    {
      case MeteorSize.Medium:
        hpMultiplier = 2;
        scoreMultiplier = 2;
        scale *= 1.5f;
        break;
      case MeteorSize.Large:
        hpMultiplier = 3;
        scoreMultiplier = 3;
        scale *= 2;
        break;
    }

    meteorObj = Instantiate(meteorPrefab, transform.position, rotation * transform.rotation);
    meteorObj.transform.localScale = scale;
    meteor = meteorObj.GetComponent<MeteorController>();
    meteor.hp *= hpMultiplier;
    meteor.score *= scoreMultiplier;
    meteor.speed = Random.Range(minMeteorSpeed, maxMeteorSpeed);
  }

}

書けたらこれを新しい空のゲームオブジェクト(※名前は「Meteor Spawner」にしてください)にアタッチしましょう。

C#スクリプトの解説

少しだけ長いスクリプトですが、やっていることは単純で「ランダムな間隔で、あらかじめ決まったサイズの隕石をランダムに生成する」という処理内容になっています。

SpawnTimer

ランダムな間隔で(後述する)SpawnMeteor関数を呼び出すコルーチンです。

SpawnMeteor

実際の隕石生成処理です。少しごちゃごちゃしたコードになってしまいましたが、処理内容は次の通りとなっています。

  • 隕石の大きさを決定する
  • 隕石のゲームオブジェクトを生成する
  • 隕石の大きさに応じて必要なパラメーターを変更する

アタッチした「Meteor Spawner」コンポーネントを設定

あとはMeteor Spawnerコンポーネントの設定を行うだけです。「Meteor Prefab」に前回作った隕石のプレハブを登録し、あとのパラメーターは適当に変更しておいてください。

ここまでできたらMeteor Spawnerオブジェクトをプレハブ化しておきましょう。

テストプレイして動作を確認しよう

では最後にテストプレイして動作を確認しておきます。シーンの適当な場所にMeteor Spawnerオブジェクトを配置し、「Meteor Spawner」コンポーネントの「Is Active」にチェックを入れてから再生ボタンを押してみてください。

  • ランダムな間隔で
  • ランダムな方向に
  • ランダムな大きさの隕石が

生成されれば成功です。

なお今の状態では大きい隕石に弾を当てた時に、隕石が弾かれて飛んで行ってしまうと思います。これだと大きな隕石を破壊しづらいので、隕石のリジッドボディの質量を「1000」など大きい値にしてみてください。


次のページ→自機が画面外に出ないようにする方法