Menu
CoddyTech

波をデータとして扱う

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 27/64。

レベルのウェーブはリストで表せます。雑魚敵が3体、その後に強敵が2体、最後にボスです。スポナーのコードとして書くと、レベルごとに専用のコードが必要になります。データとして書けば、リストはアセットに格納され、レベルごとに1つのアセットを用意し、スポナースクリプトは渡されたアセットを読み取るだけです。各要素は [System.Serializable] クラスなので、アセットのInspectorにリストが表示されます。

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Wave
{
    public GameObject enemy;
    public int count = 1;
    public float spacing = 1f;
}

[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
    public List<Wave> waves;
    public float restBetweenWaves = 3f;
}

これはすべて1つのファイル、WaveSet.csに記述します。ScriptableObjectにはクラス名と同じ名前のファイルが必要ですが、通常のWaveクラスはその隣に置けます。WaveSetアセットを選択すると、InspectorにWavesとSizeが表示され、その下にElement 0、Element 1などの行が並び、それぞれにEnemy、Count、Spacingがあります。+ボタンでウェーブを追加できます。スポナーはコルーチン内でリストを順に処理します。

public class WaveSpawner : MonoBehaviour
{
    public WaveSet waveSet;

    void Start()
    {
        StartCoroutine(SendWaves());
    }

    IEnumerator SendWaves()
    {
        foreach (Wave wave in waveSet.waves)
        {
            for (int i = 0; i < wave.count; i++)
            {
                Instantiate(wave.enemy, transform.position, Quaternion.identity);
                yield return new WaitForSeconds(wave.spacing);
            }
            yield return new WaitForSeconds(waveSet.restBetweenWaves);
        }
        Debug.Log("Last wave sent");
    }
}

Level1に、0.5秒間隔で雑魚敵3体、その後に強敵2体を設定すると、雑魚敵は0秒、0.5秒、1秒に出現します。最後の雑魚敵の後の間隔と3秒の休止時間が続き、最初の強敵は4.5秒後に出現します。Level 2のスポナーには、より難しいウェーブを設定したLevel2アセットを割り当てます。スクリプトは同じままです。

challenge icon

チャレンジ

中級

Dropperのリズムを曲のアセットにしましょう。

  1. DropPattern.csに、publicなint laneとfloat delayを持つ[System.Serializable]クラスDropを書きます。
  2. その下に、[CreateAssetMenu]を付け、publicなGameObject blockPrefab、float laneWidth、List<Drop> dropsを持つDropPattern : ScriptableObjectを書きます。
  3. Dropperでは、public DropPattern pattern;を使います。ドロップごとにdrop.delayだけ待ってから、ブロックをx方向にdrop.lane * pattern.laneWidth移動させて落とします。

「プレイ」を押すと、4つのブロックが落下します。その後、「確認」を押します。

自分で試してみよう

using System.Collections.Generic;
using UnityEngine;

// Drop(1つのブロック:そのレーンと、出現前の待機時間)とDropPattern(アセット)はここに記述する

Unityのゲームアーキテクチャのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド