波をデータとして扱う
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アセットを割り当てます。スクリプトは同じままです。
チャレンジ
中級Dropperのリズムを曲のアセットにしましょう。
DropPattern.csに、publicなint laneとfloat delayを持つ[System.Serializable]クラスDropを書きます。- その下に、
[CreateAssetMenu]を付け、publicなGameObject blockPrefab、float laneWidth、List<Drop> dropsを持つDropPattern : ScriptableObjectを書きます。 Dropperでは、public DropPattern pattern;を使います。ドロップごとにdrop.delayだけ待ってから、ブロックをx方向にdrop.lane * pattern.laneWidth移動させて落とします。
「プレイ」を押すと、4つのブロックが落下します。その後、「確認」を押します。
自分で試してみよう
using System.Collections.Generic;
using UnityEngine;
// Drop(1つのブロック:そのレーンと、出現前の待機時間)とDropPattern(アセット)はここに記述する
Unityのゲームアーキテクチャのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド