【第9回】60秒生存のクリア判定を作ろう(時間で勝利!)

FUnity Unity
FUnity

こんにちは、パパコーダーです!

第9回では、いよいよこのゲームのゴールとなる
「60秒生き残れたらゲームクリア!」 の仕組みを作っていきます。

これまでは「動く主人公」と「動き回るボール」を作りました。
今回はそれに時間制限を加えて、きちんと勝ち負けのあるゲームにしていきます。

⏱ 60秒生存のクリア判定を作ろう(時間で勝利!)


⏱ 1. ルールを決めよう(60秒生存)

このゲームのルールはシンプルです。

  • スタートしたらボールが動き出す
  • 主人公はボールをよけ続ける
  • 60秒間当たらなければクリア!

Scratch版では、変数 「あと」 を 60 から 0 までカウントダウンして、
0 になった(またはマイナスになった)タイミングで「クリア」メッセージを送っています。

FUnity版でも、この動きをほぼそのまま再現していきます。


🎭 2. 背景用スクリプトを動かす「非表示Actor」を作る

Scratch では「背景」に直接スクリプトを書けますが、
FUnity では背景には Script Graph がありません。

そこで、背景の代わりに裏方担当の Actorを 1 つ作り、

  • BGM を鳴らす
  • 背景を切り替える
  • 変数「あと」をカウントダウンする
  • 0 秒になったら「クリア」を送る

という処理をまとめて任せることにします。

▼ GameManager Actor を作る

  1. FUnity → Create → FUnityActorData を選択
  2. 名前を GameManager(または BackgroundController など)にする

この Actor は画面に見せる必要がないので、
Sprite は透明画像にするか、ステージの外に置いておいてもOKです。

作成したら、BallAvoidance_ProjectData の Actors に追加しておき、
GameManager_ScriptGraph.asset の [Edit Graph] を押して、スクリプト編集画面を開きます。

Actors に GameManager を追加
Actors に GameManager を追加

🔊 3. BGM をずっと鳴らす(Scratch 左上のスクリプト)

まずは、Scratch の「終わるまで <Dance Magic> の音を鳴らす」を再現します。

▼ FUnitySoundData を作る

  1. FUnity → Create → FUnitySoundData を選択
  2. Sounds に BGM となる AudioClip を設定する
Sounds の設定
Sounds の設定

Free の BGM をインポートして使わせていただきました。

Arcade Game BGM #3 | Audio Music | Unity Asset Store
Layer in the sounds of Arcade Game BGM #3 from B.G.M for your next project. Browse all audio options on the Unity Asset ...
  • 緑の旗が押されたとき
  • ずっと
  • 終わるまで音を鳴らす
Scratch のプログラム
Scratch のプログラム
BGM の再生
BGM の再生

これだけで、ゲーム中は BGM がループ再生されます。
音の名前は、FUnitySoundData の Sounds に設定した Id に置き換えてください。
このスクリプトはBGM専用なので、他の処理(カウントダウン等)とは別の緑の旗イベントに分けておくと安全です。


🖼 4. 背景を切り替える(Scratch 右上のスクリプト)

次に、Scratch の「背景を pico-a6 にする → 4 回繰り返す → 次の背景にする」スクリプトに相当する処理です。

  • 緑の旗が押されたとき
  • 背景を〇にする
  • 4回繰り返す
    • 次の背景にする

FUnity では、StageData に登録した背景 Sprite を切り替える Unit を使って、
同じような見た目の演出を付けてあげましょう。

Backgrounds の設定
Backgrounds の設定

「4 回繰り返す」のところは、好きな回数や間隔に変えてしまっても問題ありません。

Scratch のプログラム
Scratch のプログラム
背景の設定
背景の設定

🔢 5. 残り秒数「あと」をカウントダウンする(Scratch 左下)

いよいよ時間制限の中心部分です。
Scratch では、変数 「あと」 を使ってカウントダウンしています。

▼ 変数「あと」を用意する

  • 変数名:あと
  • 初期値:60
  • 意味:ゲーム終了までの残り秒数

FUnity では FUnityProjectData の Global Variables に変数を追加します。

変数「あと」の追加
変数「あと」の追加

▼ Scratch と同じカウントダウン処理

Scratch のプログラム
Scratch のプログラム
残り時間のカウントダウン
残り時間のカウントダウン

このロジックを Visual Scripting で組めば、
1 秒ごとに「あと」が 60 → 59 → 58 → … → 0 → -1 … と減っていきます。


🏁 6. 0 になったら「クリア」を送る(Scratch 右下)

Scratch の右下のスクリプトでは、

Scratch のプログラム
Scratch のプログラム

という形で、残り時間が 0 になったか、マイナスになったかを判定しています。

残り時間の判定
残り時間の判定

FUnity でも同じイメージで、GameManager の Script Graph に
次のような処理を追加します。

  • 緑の旗が押されたとき
  • If(「あと = 0」 または 「あと < 0」
  •  → メッセージを送る「クリア」

こうしておくことで、タイミングのズレで「あと」が -1 になってしまっても、
ちゃんとゲームクリアになります。


✨ 7. 「CLEAR!!」を表示する Actor を作る(Scratch クリア用スプライト)

次は、ゲームクリア時に表示される文字やイラストを担当する Actor を作ります。

▼ ClearActor を作る

  1. FUnity → Create → FUnityActorData から新しい Actor を作成して、名前を ClearActor にする
  2. Sprites に「CLEAR!!」などの文字画像を設定する
ClearActor の追加
ClearActor の追加

FUnityProjectData の Actors に ClearActor を追加します。

Actors に ClearActor を追加する
Actors に ClearActor を追加する

そして Script Graph を開き、上の Scratch と同じように、

  • 緑の旗を押したとき隠す(最初は非表示)
  • 「クリア」を受け取ったら 表示する
  • 「ゲームオーバー」を受け取ったら 隠す(または ずっと隠す

といった処理を組んでおきます。
これで、クリアのときだけ画面に出てくる表示が完成します。

Scratch のプログラム
Scratch のプログラム
クリアのプログラムその1
クリアのプログラムその1
Scratch のプログラム
Scratch のプログラム
クリアのプログラムその2
クリアのプログラムその2
Scratch のプログラム
Scratch のプログラム
クリアのプログラムその3
クリアのプログラムその3

🧪 8. テストしてみよう

Unity の 再生(▶)ボタン を押して、次の点を確認します。

  • BGM が流れ続けるか
  • 背景が切り替わっているか
  • 残り時間「あと」が 60 → 0 とカウントダウンしているか
  • 0 秒(またはマイナス)になったときに「クリア」メッセージが送られ、ClearActor が表示されるか

テストが大変なときは、変数「あと」の初期値を 5 などに変えて、
すぐにクリア判定が走るようにしてチェックすると楽です。


🌟 今回できたこと

  • 背景の代わりに「非表示Actor(GameManager)」を作って、ゲーム全体の進行を管理した
  • BGM 再生と背景切り替えを Script Graph で実装した
  • 変数「あと」を 60 から 0 までカウントダウンする処理を作った
  • 「あと = 0」またはマイナスになったときに「クリア」メッセージを送る仕組みを作った
  • 「クリア」を受け取ったときだけ表示される ClearActor を実装した

これで「60秒逃げ切ったら勝ち!」というゲームのゴール部分が、
Scratch とほぼ同じ構成で FUnity にも入りました。


🔜 次回:第10回「ゲームオーバー判定(ボールに当たったらアウト!)」

次回は、ボールに当たったらゲームオーバー になる仕組みを作ります。
「60秒生存」と「当たったらアウト」の両方がそろうことで、
いよいよ完成形に近いゲームになります!

コメント

タイトルとURLをコピーしました