チュートリアル:「ACTION GAME MAKERでゼロから始める」—第4章

第 4 章:让它真正成为一个“游戏”

在上一章中,我们完成了游戏玩法的基础内容,
实现了玩家可以发射子弹并击败敌人的功能。

在本章中,我们将更进一步,
把这个项目打磨成一个真正可以游玩的游戏


要让它成为“游戏”,还缺少什么?

在当前版本中,玩家可以移动,敌人也已经存在,
但仍然缺少一些关键要素。

  • 关卡规模太小,因此需要扩大舞台(地图)

  • 玩家虽然有受伤反应,但无法真正被击败
    同时,玩家还无法直观看到剩余的 HP,因此需要将其可视化。

  • 最后,游戏还没有一个明确的目标
    理想情况下可以加入 Boss 战,
    但在本教程中我们先简化目标:
    击败 5 个敌人即可通关游戏


完成示例

ステージ1の拡張(ステージの拡張)

まず、より多くのタイルを描画することでステージを拡張しましょう。
ステージが大きくなると、プレイヤーが最終的に現在のカメラの表示範囲の外に移動してしまうため、カメラがプレイヤーの動きに追従するようにする必要があります。


より多くのタイルを描画する

ステージの地形は Base(TileMapLayer) ノードによって作成されているため、このノードを使用してステージを拡張します。

  1. stage1 シーンのタブに切り替えます。

  2. Scene(シーン) ウィンドウで、Base(TileMapLayer) ノードを選択します。

  3. 下部のウィンドウで TileMap タブを開き、タイルを選択します。

  4. 右側の空白領域にタイルを自由に配置します。ステージのプレイ性を良好に保つために、以下のバランスの原則に注意してください:

    • 空中のプラットフォームや壁の高さは 4タイル以内 に保つ。

    • 空隙やトラップの幅は 4タイル以内 に抑え、プレイヤーが簡単に飛び越えられるようにする。

地形を十分に配置したら、次のステップに進むことができます。

「いいね!」 1

カメラをプレイヤーに追従させる

ACTION GAME MAKER では、カメラの追従は「Target ID」というシステムによって制御されます。
プレイヤーを作成する際に追加した CameraTargetSettings ノードを覚えていますか?このノードには Target ID というプロパティがあります。

カメラノードの ZoomCamera2D も同様に Target ID プロパティを持っています。
カメラとあるゲームオブジェクトが同じ Target ID を持っている場合、カメラは自動的にそのオブジェクトを追従します。

ここでは、ZoomCamera2D とプレイヤーの CameraTargetSettings に同じ Target ID を設定します。


InitialCamera(ZoomCamera2D)に Target ID を設定する

  1. Stage1 シーンタブに切り替え、InitialCamera(ZoomCamera2D) ノードを選択します。

  2. Inspector で Target ID(Array…) プロパティを展開します。

  3. + Add Element ボタンをクリックします。

  4. テキストボックスが表示されます。デフォルトの \u003cnull\u003e を削除し、player と入力します。


プレイヤーの CameraTargetSettings ノードに Target ID を追加する

  1. player シーンタブに切り替えます。

  2. CameraTargetSettings ノードを選択します。

  3. Inspector の Target ID フィールドに player と入力します。


拡張されたステージをテストする

それでは、ゲームを実行して拡張されたステージが正しく動作するかテストしましょう。
プレイヤーをステージの右端まで移動させてみてください。

すべての設定が正しければ、カメラはプレイヤーの移動に滑らかに追従するはずです。


チェックリスト

  • カメラがプレイヤーを追従しない
    再度、Stage1InitialCamera とプレイヤーの CameraTargetSettings が同じ Target ID を設定しているか確認してください。

  • ステージの右端に到達できない
    Base(TileMapLayer) の地形レイアウトを確認し、たとえば穴の幅や壁の高さが高すぎないか調整してください。

「いいね!」 1

プレイヤーに「死亡」エフェクトを追加:パーティクルエフェクト(Particles)の作成

敵と同様に、プレイヤーのHPが0になったときも倒されるべきです。
現在のキャラクターアトラスには適切な「死亡アニメーション」のフレームがないため、ここではパーティクルエフェクト(Particles) を使ってプレイヤーが倒された際のビジュアル演出を表現します。


パーティクル(Particles)とは?

パーティクルは本質的に多数の小さな画像が分散して配置されたもので、それらの動きや変化によって視覚効果を構成します。
これを紙吹雪や花火に例えるとわかりやすいでしょう——個々の要素は小さくても、組み合わせることでインパクトのある映像が生まれます。

Godot Engine では通常、GPUParticles2D または CPUParticles2D ノードを使ってパーティクルエフェクトを作成します。
一方、ACTION GAME MAKER では、パーティクルエフェクトは ParticleObject ノードによって管理されます。

ParticleObject には20種類以上のパーティクルテンプレートが内蔵されており、そのまま使用できるため非常に便利です。


パーティクルオブジェクト(Particle Object)の作成

パーティクルオブジェクトの作成手順は、通常のGame Objectを作成する手順とまったく同じです。

  1. 新しいシーンタブを作成します。

  2. ルートノードを作成する際、GameObject を選択します。

  3. Object NameDeathParticle に設定し、
    Templateparticles に選択して、Create をクリックします。

  4. Scene ウィンドウで、新しく作成された DeathParticle ノードを選択します。

  5. Inspector で、Particle TemplateNone から Fireworks に変更します。

  6. これにより、自動的に GPUParticles2D ノードが追加されます。

  7. GPUParticles2D のInspectorで、Emitting プロパティにチェックを入れて、パーティクルの発射を開始します。

  8. これで、シーンビューに花火のようなパーティクルエフェクトが再生されているはずです。

最後に、[Unsaved](*) タブを右クリックして、シーンを deathparticle.tscn として保存します。

「いいね!」 1

プレイヤーのVisual Scriptに「死亡(Death)」状態を追加する

「死亡(Death)状態」についての考察

プレイヤーのHPが0になったとき、キャラクターは行動を停止し、先ほど作成した**死亡パーティクル効果(Death Particle)**を再生する必要があります。

構造的に見ると、この状態をAnyStateから接続するのが最も理にかなっていますが、ここには問題があります:

下図のように、現在はプレイヤーが敵の攻撃と衝突した場合、AnyStateからTake Damage状態に移行しますが、現在の状態に関係なく移行します。

HP = 0のとき、プレイヤーはすでに「死亡」していますが、追加の処理を行わなければ、Death状態中に再びTake Damage状態がトリガーされる可能性があります。

この問題を解決するために、Take Damageの遷移条件に制限条件を追加する必要があります:

「HP ≠ 0(HP is not Zero)」

これにより、プレイヤーがすでに死亡している場合、再びダメージ状態に入ることはありません。


「Death(死亡)状態」の作成

専用の死亡アニメーションフレームがないため、ここではDamageTakenアニメーションを再利用します。
死亡をより明確にするために、**フィルター効果(Filter)**を重ねて、キャラクターが徐々に消えていくようにします。

  1. Playerシーンを開きます。

  2. エディタビューを2DからScriptに切り替えます。

    image

  3. Take Damage状態の近くの空白領域を右クリックし、Add Stateを選択します。

  4. 新しく作成されたState001Deathにリネームします。

  5. AnimationDamageTakenを選択します。

  6. Action Settingsを展開します。

  7. **Ignore Movement Input(移動入力を無視)**にチェックを入れます。

  8. + Add Executable Actionをクリックします。

  9. DisplayParticleを選択します。

  10. Particle Object Path:page_with_curl:アイコンをクリックし、以前に作成したDeathParticle.tscnを選択します。

  11. Addをクリックします。

  12. 再度+ Add Executable Actionをクリックします。

  13. ApplyObjectFilterを選択します。

  14. Filter TypeTransparentに、
    Finish Time3.0秒に設定します。

    • これにより、キャラクターは3秒以内に徐々に透明になり、消えていきます。

  15. Addをクリックします。

  16. 実行アクションリストが下図と一致していれば、Death状態は完成です。


AnyStateを「Death」状態に接続する

  1. AnyStateを右クリック → Add LinkDeathに接続します。

  2. + Add Other Conditionをクリックします。

  3. HPIsZeroを選択し、Addをクリックします。


「Take Damage」の遷移に制限条件を追加する

最後のステップは、HPがすでに0のときにTake Damageが再びトリガーされないようにすることです。

これは**条件の反転(Is Reversed)**を使用して実現できます。

  1. AnyState → Take Damageのリンクを選択します。

  2. + Add Conditionをクリックします。

  3. HPIsZeroを選択します。

  4. Is Reversedにチェックを入れ、条件を**「HP ≠ 0」**に反転します。

  5. 条件リストにアイコンがハイライト表示されていれば、設定は正しく行われています。


「死亡」状態のテスト

これでテストを行います。
プレイヤーの初期HPは1に設定されているため、敵の攻撃を1回受けると死亡状態に入ります。

正常に動作している場合:

  • 攻撃を受けたときに死亡パーティクル効果が生成されます
  • プレイヤーキャラクターが徐々に透明になり消えます
  • ゲーム終了後、F5キーで再開できます

トラブルシューティング

  • パーティクルが表示されない
    DeathParticle.tscnが正しく設定されているか、DisplayParticleアクションの設定を確認してください。

  • キャラクターが徐々に消えない
    ApplyObjectFilterのパラメータが正しく設定されているか確認してください。

  • 死亡後もダメージ状態がトリガーされる
    AnyState → Take Damageリンク内の**HPIsZero(反転)**条件を再度確認してください。

HPバーの作成

現在、プレイヤーが1回の攻撃で倒れてしまうのは少し厳しすぎるので、まずプレイヤーのHPを増やしましょう
しかし、プレイヤーがより多くのHPを持つようになったら、残りの体力を視覚的に表示する方法が必要になります。
そこで、HPバーを作成します。

ACTION GAME MAKERでは、SimpleGaugeまたはImageGaugeノードを使用して、さまざまな数値バーを表示できます。
このチュートリアルでは、SimpleGaugeを使用します。

また、現在カメラはプレイヤーの移動に追従するため、HPバーをプレイヤーと同じ階層に配置すると、一緒に移動して画面外に飛び出してしまう可能性があります。
そのため、HPバーのように常に画面上に表示する必要がある要素は、**UIレイヤー(UI Layer)**に配置するべきです。


UIレイヤーについて

以前に説明した通り、ACTION GAME MAKERのレイヤー構造はおおよそ以下のようになっています。
この中で、UIレイヤーと**スクリーンエフェクトレイヤー(Screen Effect Layer)**は、カメラの影響を受けない特殊なレイヤーです。

これは次を意味します:

  • UIレイヤーに配置されたノードは常に画面上に表示されます
  • HPバー、スコア、UIボタンなどに非常に適しています
  • Screen Effect Layerは、アクションによってトリガーされる画面エフェクトに使用されます

このセクションでは、UIレイヤーにHPバーを配置します。


プレイヤーのHPとMax HPを10に設定

  1. プレイヤーオブジェクト内のBaseSettingsノードを選択します。

  2. Inspectorで、HPMax HP1から**10**に変更します。


SimpleGaugeノードの追加と設定

  1. stage1シーンタブに切り替え、エディタビューをScriptから2Dに戻します。

    image

  2. SceneパネルでUIノードを選択します。

  3. Sceneパネル左上にある**+(Add Child Node)**ボタンをクリックします。

  4. SimpleGaugeを選択し、Createをクリックします。

  5. 初期状態では、Gaugeがつぶれたように見えます。

  6. オレンジ色のコントロールポイントをドラッグして、適切なサイズに調整します(チュートリアルの例図を参考にしてください)。

  7. UIレイヤーの可視範囲は細い青い線で示されています。
    HPバーをこの範囲内の左上隅に移動します。


HPバーをプレイヤーのHP変数と関連付ける

  1. Inspectorで、Variable TypeObjectに設定します。

  2. するとSpecify Target Object Pathが表示されます。
    右側の:page_facing_up:アイコンをクリックします。

  3. player.tscnを選択し、Openをクリックします。

  4. Variable Nameは自動的にhpと表示されます。
    これは「現在値」に使用される変数名であり、そのままにしてください

  5. Use Variable as Max Value(変数を最大値として使用)にチェックを入れます。

  6. 手順9~10を再度繰り返し、player.tscnを再指定します。

  7. このとき、Max Value Variableがデフォルトでobject_idになっている可能性があります。
    これをmax_hpに変更します。

    • これにより、HPバーの最大値はプレイヤーのMax HPを使用します。


HPバーのテスト

Test Playをクリックしてゲームを実行します。
設定が正しければ、次のように表示されるはずです:

  • HPバーが画面の左上隅に表示される

  • プレイヤーがダメージを受けると、HPバーがそれに応じて減少する


トラブルシューティング

  • HPバーが表示されない
    → SimpleGaugeがUIレイヤーの子ノードであり、青い可視範囲内にあることを確認してください。

  • ゲーム開始時にHPが低い
    → プレイヤーのBaseSettingsHP10に設定されているか確認してください。

  • Max HPがあってもHPが瞬時に0になる
    → 以下の点を確認してください:

    • BaseSettingsでMax HP = 10
    • SimpleGaugeのMax Value Variableが正しくmax_hpに設定されている

「落下死亡(Fall Death)」の設定

ゲームのテスト中に、以下のような現象に気づいたかもしれません:
プレイヤーが穴に落ちると、無限に下に落ち続けます。

この問題を解決し、プレイヤーが深い穴に落ちたときに**死亡(Death)**と判定されるようにしましょう。

実装の考え方は2つのステップに分かれます:

  1. カメラの移動範囲を制限し、カメラが無限に下を追跡しないようにする
  2. プレイヤーがカメラの表示範囲外に出たときに、Death 状態に移行させる

InitialCamera(ZoomCamera2D)の移動範囲を制限する

  1. InitialCamera ノードを選択します。

  2. Inspector で Limits(制限)セクションを展開します。

  3. Bottom の値を 10000000 から 500 に変更します。

    • これは以下を意味します:
      カメラは赤と緑の座標軸の交点(原点)の下に最大500ピクセルしか追跡しません
  4. テストプレイを実行します。

    • 設定が正しければ:
      • カメラは水平方向と上方向で引き続きプレイヤーを追跡します
      • しかし、下方向で制限に達するとそれ以上下に移動しなくなります

トラブルシューティング

  • 画面が真っ暗になる:
    レベル全体が原点の近くにない可能性があります。
    Bottom の値を 1000 または 2000 に変更して、画面が正常に表示されるまで調整してください。

プレイヤーの Visual Script に「落下失敗」の判定を追加する

すでに Death 状態を作成済みなので、既存の
AnyState → Death のリンクに条件を追加するだけです。

今回使用する条件は OffScreen(画面外) です。


操作手順

  1. Player シーンに切り替え、エディタのビューを Script に切り替えます。

  2. AnyState → Death のリンクを選択します。

  3. + Add Condition をクリックします。

  4. 条件として OffScreen を選択します。

  5. Data TypeUnset から This Node に変更します。

  6. Connection With Previous ConditionOR に設定し、Add をクリックします。

  7. 条件リストが以下のように表示されていることを確認します:

    これは以下を意味します:
    「HP が 0 または プレイヤーが画面外に出た → Death 状態に移行」


「落下死亡」のテスト

再度ゲームを実行し、プレイヤーを穴に落としてみましょう。

設定が正しければ:

  • プレイヤーがカメラの可視範囲外に出たとき
  • Death 状態がトリガーされ
  • 以前に設定した花火のパーティクル効果が再生され
  • プレイヤーが敗北したことを示します

トラブルシューティング

  • 穴に落ちても死亡しない:
    AnyState → Death の条件が HPIsZero OR OffScreen になっているか確認してください

思考“击败 5 个敌人即可通关”:变量的处理方式

我们需要一种方法来从 5 开始倒数。
每当一个敌人被击败,这个数值就减少 1,当它变成 0 时,游戏就会触发 通关(Game Clear) 事件。

为此,我们将使用一个叫做 变量(Variable) 的概念。


什么是变量(Variable)?

变量 就像是一个用来存放数值的容器。
例如,我们之前使用过的玩家 HP(生命值),本质上就是一个变量。

当玩家被敌人的攻击命中时,这个 HP 容器里的数值就会减少 1。

ACTION GAME MAKER 中,变量主要有两种定义方式:

  1. 使用对象上的 VariableSettings 节点
  2. 使用整个项目共用的 Project Variables(项目变量)

我们之前使用的 HP,就属于第一种类型。


对象变量 与 项目变量 的区别

  • 对象变量(VariableSettings)

    • 绑定在某一个对象上
    • 当对象被删除时,变量也会随之消失
  • 项目变量(Project Variables)

    • 全项目共通的全局变量
    • 在项目运行期间始终存在
    • 适合用来管理跨场景、跨对象的数据

在实际使用中:

  • HP、攻击力、跳跃力
    → 适合使用 对象变量

  • 最高分、金币数量、剩余生命数
    → 适合使用 项目变量
    (因为它们通常需要在多个关卡之间共享)


“剩余敌人数量”应该用哪种变量?

从技术上来说,两种方式都可以实现。
但由于这个数值会被 多个对象(敌人) 同时操作,因此我们这里选择使用 项目变量(Project Variable)

整体流程将是:

  • 当敌人进入 Vanish(消失)状态
    → “剩余敌人数量” 减少 1

  • 当“剩余敌人数量”变为 0
    → 触发 游戏通关(Game Clear) 流程


如何实现通关流程(Clear Sequence)

我们将创建一个专门用于管理击败数的游戏对象

这个对象将被放置在 UI 层 中,使其始终可见。
和 HP 条类似,它也会显示当前还剩多少敌人,让玩家一目了然。

具体步骤如下:

  1. 创建一个 项目变量(Project Variable)
    Remaining Enemies(剩余敌人数量)

  2. 敌人的 “Vanish” 状态 中,
    添加一个动作,用来让该变量 -1

  3. 在 UI 层创建一个 Clear Event Object(通关管理对象)
    持续监视 “Remaining Enemies”,
    当其数值变为 0 时,触发通关演出

「いいね!」 1

敵の「Vanish(消滅)」状態にアクションを追加する

ACTION GAME MAKER では、変数を変更するには Change Property(プロパティの変更) アクションを使用します。
このアクションは基本的な四則演算(加算、減算、乗算、除算)をサポートしているため、以下のようなロジックを直接実装できます:

Remaining Enemies -= 1
(残りの敵の数を1減らす)


操作手順

  1. enemy シーンタブを開き、エディタビューを Script に切り替えます。

  2. Vanish 状態を選択し、+ Add Executable Action をクリックします。

  3. ChangeObjectProperty を選択します。

  4. 以下の内容で設定します:

    • Target Object Type(対象オブジェクトタイプ):Project Database

    • Database Type(データベースタイプ):Project Variable

    • Record Name(レコード名):Remaining Enemies

    • Expression(演算子)-=

    • Constant Value(定数値)1

    設定項目は全部で5つあります。それぞれが正しく設定されているか確認してください。
    このアクションにより、プロジェクト変数 Remaining Enemies の値が1減算されます。

  5. 最後に、アクションの実行順序を調整します。
    アクションは上から下へ実行されるため、Vanish Self(RemoveSelf)Change Property より先に実行されると、変数は更新されません。

    • Change Property 左側のハンバーガーメニューアイコン(三本線) をドラッグして、
      最上部に移動させ、Change Property が最初に実行されるようにします。


なぜ -= を使うのか?単に - ではいけないのか?

プログラミングでは、-=省略形演算子であり、以下のような意味を持ちます:

新しい値 = 元の値 − 1

つまり、1つのステップで以下の2つを同時に実行します:

  • 減算演算
  • 結果を変数に再代入

単に -(マイナス記号)だけを使用した場合、
システムは計算結果をどこに保存すべきかを認識できず、
結果として変数の値は実際には変更されません。

UIオブジェクト「Remaining Enemies Manager(残り敵マネージャー)」の作成

Remaining Enemies(残り敵数) というプロジェクト変数を管理するためのUIオブジェクトを作成します。

このオブジェクトは以下の2つの役割を担います:

  • 現在のRemaining Enemiesの値を表示する
  • その値が 0 になったとき、ゲームクリア(Clear)の処理をトリガーする

表示をより直感的にするため、UI内に 敵のアイコン(Sprite2D) を表示し、
その隣にアニメーションで Remaining Enemies の値を表示します。
敵のアイコンには、以前使用した enemy.png をそのまま再利用します。


Remaining Enemies Manager オブジェクトの作成

  1. エディタビューを 2D に切り替えます。

  2. 新しいシーンタブ を開き、ルートノードの作成時に GameObject を選択します。

  3. 以下のように設定します:

    • Object NameRemainingEnemiesManager
    • TemplateUI
    • TypeEmpty

    その後、Create をクリックします。

  4. 新しく作成したシーンを保存します。

  5. FileSystem から、enemy.png(敵用のスプライト画像)を
    エディタビュー内の 赤と緑の座標軸の交点の左側の空白領域 にドラッグ&ドロップします。

  6. システムは自動的に Enemy という名前の Sprite2D ノードを作成します。

    • Godotでは、画像ファイルを直接エディタビューにドラッグすると、
      自動的に Sprite2D ノードが生成され、その画像がテクスチャとして設定されます。

「Remaining Enemies Manager」の可視化スクリプト(変数表示)の設定

まず、変数自体の表示に焦点を当てます。
ここでは、プロジェクト変数「Remaining Enemies」の現在値を表示するための状態「Count」のみが必要です。

変数を表示するには、DisplayText(表示テキスト) アクションを使用します。


「Count」状態の作成

  1. Scene ウィンドウで、RemainingEnemiesManager(GameObject) ノードを選択し、:page_with_curl:+(Attach Script) をクリックします。

  2. スクリプト「RemainingEnemiesManager.vs」を作成します。

  3. デフォルトの State001Count にリネームします。

  4. DisplayText 実行アクションを追加し、以下のように Basic Settings(基本設定) を設定します:

    • Text Type(テキストタイプ):Variable

    • Variable Source(変数ソース):Data Management

    • Database Type(データベースタイプ):Project Variables

    • Record Name(レコード名):Remaining Enemies

  5. 次に、以下のように Layout & Action(レイアウトとアクション) を設定します:

    • Unlimited Duration(無制限持続):On

    • Font(フォント):New SystemFont

    • Font Size(フォントサイズ):64

    • Display Size(表示サイズ)x = 80, y = 80

    • Margins(上/左/右/下):すべて 0 に設定

    • Horizontal Alignment(水平配置):Center

    • Vertical Alignment(垂直配置):Center


「DisplayText」アクションにおける位置の説明

このアクションは、指定されたサイズのテキストボックスを作成し、
基準点を中心にテキスト(または変数値)を指定時間表示します。

基準点を 「This object’s center(このオブジェクトの中心)」 に設定した場合、
この中心点は 原点(赤と緑の座標軸の交点)を指します。

現在の設定では:

  • 80×80 ピクセルのテキストボックスが作成されます
  • テキストボックスは原点を中心に配置されます
  • テキストはボックス内に中央揃えで表示されます
  • 表示時間は無制限です

「Count」の表示効果のテスト

次に、シーンに配置してテストします。
常に表示されるようにするため、UI レイヤーに配置する必要があります。

  1. stage1 シーンタブに切り替え、エディタビューを 2D に切り替えます。

    image

  2. Scene ウィンドウで、UI(CanvasLayer) の下にある SimpleGauge ノードを選択します。

  3. FileSystem で RemainingEnemiesManager.tscn を選択し、
    UI レイヤーの青い枠内の右上領域にドラッグ&ドロップします。

  4. 実行して確認します:

    • ゲーム開始時に、正しく Remaining Enemies = 5 が表示される

    • 敵を1体倒すと、数値が 4 に減少する


トラブルシューティング

  • アイコンと数字が両方表示されない:
    オブジェクトが UI レイヤーの子ノード であり、青い枠(UI 表示領域)内 にあることを確認してください。

  • アイコンは表示されるが数字が表示されない:
    Remaining Enemies Manager で以下の点を確認してください:

    • アイコンの位置が 原点付近 にあること
    • Count 状態内の DisplayText アクションの設定が正しいこと
  • 敵を倒しても数字が変化しない:
    敵オブジェクトの Vanish 状態の実行順序を確認してください。
    先に Change Property、次に RemoveSelf である必要があります。

「いいね!」 1

クリアシーケンスの作成

次に、クリア演出(Clear Sequence) を作成します。
ここでも DisplayText アクションを使用します。

プレイヤーが「クリアした」と明確に感じられるように、
画面中央に大きな文字で “STAGE CLEAR” を表示します。

クリアのトリガー条件は、
プロジェクト変数 Remaining Enemies の値が 0 になることです。


「Stage Clear」状態の設定

  1. RemainingEnemiesManager シーンタブに切り替え、エディタビューを Script に切り替えます。

  2. Count 状態の近くで右クリックし、Add State を選択します。

  3. 新しく作成された状態を Stage Clear にリネームします。

  4. + Add Executable Action をクリックします。

  5. DisplayText を選択します。

  6. 以下の内容で設定します(項目が多いので、一つずつ確認してください):

    • Text Body(テキスト内容)STAGE CLEAR

    • Unlimited Duration(無制限持続):On

    • Font(フォント):New SystemFont

    • Font Size(フォントサイズ)96

    • Display Area(表示領域)x = 1200, y = 120

    • Horizontal Alignment(水平配置):Center

    • Vertical Alignment(垂直配置):Center

    • Reference Point(基準点):Use Scene as Base

    • Anchor(アンカー):Center

    「Use Scene as Base」とは?
    これは、表示位置がそのオブジェクトを基準とするのではなく、ゲーム画面全体(カメラが表示する領域) を基準にすることを意味します。
    この設定では、1200×120 のテキストボックスが画面中央に配置され、
    その中に STAGE CLEAR が中央揃えで表示されます。

  7. Count 状態を右クリック → Add LinkStage Clear に接続します。

  8. + Add Condition をクリックします。

  9. SwitchVariableChanged を選択します。

  10. 以下のように条件を設定します:

    • Variable Type(変数タイプ):Variable
    • Target Type(ターゲットタイプ):Project Variable
    • Database Record Name(レコード名):Remaining Enemies
    • Variable Condition(条件)=

    (これは、Remaining Enemies == 0 のときに状態遷移をトリガーすることを意味します。)


クリアシーケンスのテスト

まず、ステージに十分な敵を配置する必要があります。
合計 5体の敵 を配置し、クリアシーケンスが正常にトリガーされるか確認してください。

  1. stage1 シーンタブに切り替え、エディタビューを 2D に設定します。

  2. BaseLayer の下で、配置操作のためにサブノード(例:enemy または player)を選択します。

  3. FileSystem から enemy.tscn をステージにドラッグ&ドロップし、1体の敵を配置します。

  4. 上記の操作を繰り返し、合計 enemy5(5体の敵) を配置します。

  5. テスト実行を開始します。

    • 設定が正しければ、すべての敵を倒した後、画面中央に STAGE CLEAR が表示されます。


トラブルシューティング

  • 「配置した5体の敵が見えない」:
    敵が画面外に落ちている可能性があります。
    以下の点を確認してください:

    • 各敵が地面の上に配置されていること
    • Template MoveDon’t fall off ledges(プラットフォームから落ちない) が有効になっていること
  • 「敵の数が0になったとき、何も起こらない」:
    以下の点を確認してください:

    • Stage Clear 状態内の DisplayText の設定
    • 状態リンクの条件が正しいこと:
      プロジェクト変数 Remaining Enemies == 0
「いいね!」 1

第4章 まとめ

この章では、ゲームを本格的なゲームにするための基礎となる以下の内容を学びました:

  • カメラの追跡メカニズム
  • パーティクルエフェクトの使用
  • UIの表示(HPバー&残り敵数)
  • 変数(Variable)の使用と管理

これらの機能により、ゲームは動くだけでなく、以下の機能も備えるようになりました:

  • 実時UI表示
  • ゲームオーバー判定
  • ゲームクリア判定
  • シンプルでスムーズなステージ体験

しかし、現時点ではまだ単調で、音響効果や背景設定が不足しており、全体的な表現は単調です。

次の章——第5章では、ゲームの完成度をさらに高め、以下の追加を行います:

  • :musical_note: 音響効果(Sound Effects / BGM)
  • :national_park: 背景とビジュアル表現の設定
  • :package: プロジェクトをエクスポートし、誰でもプレイできるようにする

ゲームの磨きをさらに進めていきましょう!
:backhand_index_pointing_right: