第9回では、ステージ内のTargetをすべて倒したら次のSceneへ移動する仕組みを作ります。教材ではStage1からStage2へ進むところまで作り、最後に自分でStage3へ発展させる課題へ挑戦します。
最後のTargetを倒すとCLEARを表示し、少し待ってからStage2を読み込みます。完成後は、同じ仕組みを使ってStage3を自分で作ります。
Stage2を作ろう
ProjectのScenesフォルダーでStage1を複製し、名前をStage2にします。複製はCtrl + Dで行えます。
Stage2を開き、敵の位置、壁、床のMaterialなどを変更します。
複製しただけではStage1とStage2の内容は同じです。Hierarchy上部のScene名を確認してから、Stage2だけを変更します。
Scene Listへ登録しよう
File → Build Profilesを開き、Scene ListへStage1とStage2を登録します。
開いているSceneを登録する場合はAdd Open Scenesを使えます。Stage1とStage2の両方が一覧に入っていることを確認します。
SceneManagerを読み込もう
ShootCheck.csの先頭へ次の1行を追加します。
using UnityEngine.SceneManagement;
Sceneを切り替えるSceneManagerをスクリプトから利用できるようになります。
クラス内の変数部分へ、次の2つを追加します。
public string nextSceneName = "Stage2";
public float nextStageDelay = 2f;
nextSceneName次に読み込むSceneの名前をInspectorから設定します。nextStageDelayCLEARを表示してからSceneを切り替えるまでの秒数です。SceneManagerSceneを読み込むUnityの機能です。全Targetを倒したら次のStageへ進もう
ShootCheck.csには、Scene開始時のTarget数をremainingTargetsへ保存する処理があります。Targetを倒すたびに1減らし、0になったらSceneを切り替えます。
remainingTargets == 0の処理を次の形にします。
if (remainingTargets == 0)
{
gameEnded = true;
scoreText.text =
"CLEAR!\nSCORE: " + score;
Invoke(
nameof(LoadNextStage),
nextStageDelay);
}
クラスの最後の}より前へ、次の関数を追加します。
void LoadNextStage()
{
SceneManager.LoadScene(nextSceneName);
}
LoadNextStage()はUpdate()の外側で、ShootCheckクラスの内側へ置きます。
Stage1からStage2への切り替えを確認しよう
Stage1のMain Cameraを選び、ShootCheckの設定を次のようにします。
Next Scene Name:Stage2
Next Stage Delay:2
Stage1を再生してTargetをすべて倒します。CLEARが表示され、2秒後にStage2が始まれば成功です。
自分でStage3を作ってみよう
ここまでの手順を使い、自分の力でStage3を作ってStage2から移動できるようにしてみましょう。Stage1からStage2を作った流れを思い出せば完成できます。
- Stage2を複製して、Scene名を
Stage3にする。 - 床のMaterial、壁、敵の位置などを変更し、Stage2と違うステージにする。
- Stage3をBuild ProfilesのScene Listへ追加する。
- Stage2をクリアしたらStage3が読み込まれるように設定する。
- PlayしてStage1 → Stage2 → Stage3と進めるか確認する。
新しいC#スクリプトは作りません。Stage1とStage2で使った同じShootCheck.csを利用します。どのSceneのNext Scene Nameを変更すればよいか考えてみてください。
ヒント1|Scene Listの並び方
0 Stage1
1 Stage2
2 Stage3
Stage3の左側にもチェックを入れます。Scene名は大文字と小文字も含めて正確に付けてください。
ヒント2|どこにStage3と設定する?
Playを停止してStage2を開き、Stage2内のMain Cameraを選択します。Shoot CheckのNext Scene Nameを確認してください。
できたら答え合わせ
Stage2内のMain Cameraで、次のように設定します。
Next Scene Name:Stage3
Next Stage Delay:2
Ctrl + SでStage2を保存します。Stage3と入力してもStage2のままになる場合
コードに書いた初期値より、Inspectorへ保存されている値が優先されます。Playを停止してStage2を開き、Stage2内のMain Cameraで値を変更してからCtrl + Sで保存します。
Play中に変更した値は、停止すると元へ戻ります。
発展|最後のStageでALL CLEARを表示する
最後のStageではNext Scene Nameを空欄にし、空欄ならSceneを切り替えないようにします。
void LoadNextStage()
{
if (string.IsNullOrWhiteSpace(nextSceneName))
{
scoreText.text =
"ALL CLEAR!\nSCORE: " + score;
return;
}
SceneManager.LoadScene(nextSceneName);
}
スコアとHPを次のStageへ引き継ごう
Sceneを切り替えると、現在のスコアやHPは初期値へ戻ります。次回はステージをまたいでゲームの状態を保存する方法へ進めます。


コメント