![見出し画像](https://assets.st-note.com/production/uploads/images/125169184/rectangle_large_type_2_08a1a9025a95d998831abd52ba628dbc.png?width=1200)
5-1ステージを増やす【Unityゲーム開発の基礎】作って学ぶブロック崩し
ブロック崩しを作りながらUnityを学んでいこう!
フェーズ1で「ブロック崩しの骨格」を作り
フェーズ2で「見た目をかっこよく」して
フェーズ3で「タイトル画面やゲームオーバーなどの画面」を作って
フェーズ4では「アニメーション」させることができました。
フェーズ5の目標は「ステージの作成」です。
複数のステージを用意して敵のバリエーションを増やしたり難易度をちょっとづつ上げるような仕組みづくりを目指します。
今回は複数のステージを作成していきます。
ステージを作る
たくさんある Enemy オブジェクトは EnemyUnit オブジェクトの中にいれて管理するようにしてあります。
今回は新たに Stages オブジェクトを作成してその中にEnemyUnit を配置するように変更してみます。
Hierarchyウィンドウで右クリックして CreateEmpty を選んで Stages オブジェクトを作成し、EnemyUnitをドラッグして Stages の下層に移動させます。
![](https://assets.st-note.com/img/1702965951476-ROW3rmTdrI.png)
EnemyUnitを複数作る
Stagesオブジェクトの中に EnemyUnit をいくつか追加していきます。
表示する EnemyUnit を制御して、ステージをクリアするごとに表示される EnemyUnit を切り替えることステージごとに出現する敵を変化させるという感じです。
EnemyUnit を Prefab化
EnemyUnit をたくさん複製するとことになるので Prefab 化しておきます。
Hierarchy にあるオブジェクトを Projectウィンドウの Prefabs フォルダへドラッグ&ドロップすれば Prefab が出来上がります。
![](https://assets.st-note.com/img/1702967199372-Ch5BwZ9cZt.png)
EnemyUnit を複製
Projectウィンドウの Prefab を Hierarchy へドラッグ&ドロップすればオブジェクトを複製できます。
Enemy も複製して EnemyUnit の中へ配置していきましょう。
Enemy の位置を工夫しながらステージのバリエーションを増やしていきます。
![](https://assets.st-note.com/img/1702967736268-dtN0JZKbah.png)
ステージを切り替えるスクリプトの追加
Stagesオブジェクトに追加するスクリプトはこんな感じ。
public class StagesBehaviour : MonoBehaviour
{
private MainManagerBehaviour mainManager;
private EnemyUnitBehaviour[] enemyUnitList;
private int currentStageNum;
public void Startup(MainManagerBehaviour manager, int stageNum)
{
this.mainManager = manager;
this.gameObject.SetActive(true);
if (null == enemyUnitList)
{
enemyUnitList = this.GetComponentsInChildren<EnemyUnitBehaviour>(true);
}
currentStageNum = stageNum;
foreach (var enemyUnit in enemyUnitList)
{
enemyUnit.gameObject.SetActive(false);
}
enemyUnitList[currentStageNum].Startup(mainManager);
}
public int GetCurrentStageNum()
{
return currentStageNum;
}
public int GetMaxStageNum()
{
return enemyUnitList.Length;
}
}
Startupメソッドで表示されるEnemyUnitを切り替える仕組みです。
GetComponentsInChildrenメソッドを呼び出して下階層にある EnemyUnit を取得します。取得した EnemyUnit 全てを一旦非表示にしてから、表示したい EnemyUnit を初期化する感じです。
スクリプトができたら Stages オブジェクトの Component に追加します。
ゲーム全体を制御する MainMangerBehaviour は以下のように改良します。
public class MainManagerBehaviour : MonoBehaviour
{
:
//public EnemyUnitBehaviour enemyUnit; //←コレの代わりに
public StagesBehaviour stages; //←コレを追加
:
:
public void OnNewGameButtonClicked()
{
gameTitle.Hide();
gameClear.Hide();
gameOver.Hide();
player.gameObject.SetActive(true);
stages.Startup(this, 0);
ball.Startup(this);
}
public void OnNextStageButtonClicked()
{
gameTitle.Hide();
gameClear.Hide();
gameOver.Hide();
player.gameObject.SetActive(true);
stages.Startup(this, stages.GetCurrentStageNum() + 1);
ball.Startup(this);
}
:
:
}
今まであったメンバ変数 enemyUnit にかわって stages を作ります。
ゲームスタート時に呼ばれる OnNewGameButtonClicked では stagesのStartupメソッドを呼び出して最初のステージ(0番目)が表示されるようにしています。
また、次のステージへ進むためのメソッド OnNextStageButtonClicked を作りました。
ゲームクリア画面から次のステージへ
ゲームクリア画面のボタンを改良して、次のステージへ進むためのボタンに変更します。
ボタンのテキストを「 Next Stage >」という感じに変えて、
ボタンクリック時に呼び出されるメソッドを、先ほど作ったOnNextStageButtonClickedへ変更しました。
![](https://assets.st-note.com/img/1703132316800-uIljMOU9oh.png?width=1200)
これが今回の成果です。
Phase5-1の成果 (ステージを増やす)#unity #indiedev #indiegame pic.twitter.com/3T5ejptI69
— をりはぅ@indiedev (@worihau__) December 22, 2023
つづく