チュートリアル:スクリプト講座 #1 – 射撃攻撃を作成しよう

このコースでは、ACTION GAME MAKERでのスクリプティングの基礎を学びます。
パート 1では、基本的な攻撃システムを作成します。


:warning: ビジュアルスクリプトの利用に関する注意点


:bookmark_tabs: ビジュアルスクリプトとシーンタブ

Godot の仕組み上、現在アクティブなシーンタブに関係なく、任意のビジュアルスクリプトタブを開くことは技術的に可能です。
ただし、ACTION GAME MAKER のビジュアルスクリプトは、現在開かれているシーンタブ内のノードに依存します

異なるシーンがアクティブな状態でビジュアルスクリプトを編集しようとすると、正しいゲームオブジェクトからのアニメーションデータ、変数、またはスイッチにアクセスできなくなります。

:small_blue_diamond: もし这种情况が発生しても、パニックにならず、スクリプトに変更を加えずに正しいシーンタブに戻ってください。


:file_folder: ビジュアルスクリプトとファイル参照

Godot の制限により、アクション内の他のオブジェクトへの参照(オブジェクトパスなど)は、すべてプレーンな文字列として保存されます。

つまり、参照されているゲームオブジェクトをファイルシステム内で移動すると、リンクが切断され、参照切れが発生します。

ACTION GAME MAKER には参照切れチェックツールが用意されていますが、大規模なプロジェクトで壊れた参照を修正するのは非常に時間がかかります。

:white_check_mark: 開発を開始する前に、フォルダ構造を適切に整理することを強くお勧めします。


:white_check_mark: 始めましょう

以前のチュートリアルと同様に、このコースでも最初のコースで提供されたチュートリアルプロジェクトを使用します。
準備を整えるため、今すぐプロジェクトを開いてください。

ステップ 1: 弾丸オブジェクトの作成 – 弾丸の設定


1. 新しいゲームオブジェクトシーンを作成しましょう。

中央のエディタパネルで、新しいシーンタブを開くために +タブ をクリックします。
次に、シーンウィンドウで Game Object を選択します。


2. オブジェクト作成ウィンドウで、以下を設定します。

  • オブジェクト名: 任意の名前(ここでは sample_bullet を使用します)
  • テンプレート: bullets
  • タイプ: bullet_base
  • グループ: Player

次に、Create ボタンをクリックします。


3. 基本設定が事前設定されたゲームオブジェクトシーンが生成されます。

タブを右クリックするか、Ctrl + S を押して、すぐにシーンを保存し、好きな場所に保存してください。


4. 弾丸の視覚表現が必要ですが、画像ファイルを持っていません。

代わりに、長方形を描画する Godot ノードを使用します。
シーンウィンドウの左上にある +ボタン をクリックします。


5. ノード選択ダイアログで、以下へ移動します。

Node > CanvasItem > Control > ColorRect を選択して作成します。
検索バーを使用して、「Color」または「Rect」と入力すると簡単に見つかります。


6. 白い長方形が表示されます。

デフォルトではかなり大きいため、縮小しましょう。
シーンウィンドウで ColorRect ノードを選択します。


7. インスペクタで、以下へ移動します。

Layout > Transform にて、サイズを 40×40 から約 4×4 に変更します。


8. 長方形は左上隅から描画されるため、中央に配置しましょう。

Position を以下のように設定します。

  • x = -2
  • y = -2
    これで、長方形がシーンの原点を中心に配置されます。

image


9. 赤い半透明の長方形は攻撃当たり判定を表していますが、大きすぎます。

サイズを変更しましょう。

  • シーンウィンドウで AttackCollision を選択します。
  • コーナーを調整して、ColorRect よりも少し大きくします。


10. 薄い青色の半透明の四角形(CollisionShape2D は壁の当たり判定です。

現状では、壁が重なり合うため攻撃がブロックされてしまいます。
壁の当たり判定を攻撃範囲よりもさらに小さくしましょう。

サイズを変更します。

  • シーンウィンドウで CollisionShape2D を選択します。
  • コーナーを調整して、AttackCollision よりも少し小さくします。


10. 次に、MoveAndJumpSettings ノードを選択します。

デフォルトでは、水平および垂直の移動速度は 100 px/sec で、非常に遅いです。
これを約 300 px/sec に増やしましょう。


11. 通常はアニメーションや他のプロパティも設定しますが、

このシンプルな弾丸オブジェクトでは、追加の設定は必要ありません。

ステップ 2: 弾オブジェクトの作成 – 弾スクリプト


1. 新しいスクリプトを作成しましょう。

シーンウィンドウの上部にある**:scroll:(スクロールアイコン)**をクリックして、新しいスクリプトを作成します。

image


2. 言語がVisualScriptに設定されていることを確認し、名前を付けて作成をクリックします。


3. 最初のステートノードをMoveに名前を変更し、重力を無視オプションを有効にします。


4. Actions > + Add Executable Action に移動し、Attack Settings アクションを追加します。

Hit GroupEnemy のみに設定し、弾が誤ってプレイヤーに当たらないようにします。


5. もう一つのステートノードを追加し、Remove と名付けます。

重力を無視オプションも有効にします。


6. Remove ステートで、RemoveSelf というExecutable Action を追加します。

これにより、オブジェクトがゲームから削除されます。
使用後は常に弾や敵をクリーンアップしてください。そうしないと、それらが残ってシステムリソースを消費し続けます。


7. Move ステートを右クリックし、Remove ステートへのリンクを作成します。


8. 最初の遷移条件を設定します:

インスペクターで、Conditions > Add Condition に移動し、Contact With Hit Area を選択します。
以下のように設定します:

  • Direction: All
  • Target Group: Enemy

これにより、弾が敵に当たったときに削除されます。


9. 2 つ目の条件を追加します:Offscreen(弾がカメラビューの外に出た場合)。

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

  • Target Type: This Node
  • Logical Condition with previous: OR

:warning: この設定を AND のままにすると、両方の条件が真である場合にのみ発動してしまいます。これは望ましくありません。


10. 3 つ目の条件を追加します:Contact With Tile

同様に、Direction を All に設定し、OR で結合します。


:white_check_mark: これで、弾は以下の条件のいずれかで自動的に削除されます:

  • 敵に当たった場合
  • 画面外に出た場合
  • タイルに衝突した場合

:light_bulb: ヒント

:firecracker: Remove と RestoreRemove、Disable と Enable の違い

似たようなアクションに気づかれたかもしれませんが、それぞれの違いは以下の通りです:

  • Remove: オブジェクトをゲームから完全に削除します。戻ってくる必要のない弾や敵などのアイテムに最適です。
  • RestoreRemove: 削除されたオブジェクトを復活させますが、新しく生成された状態になります。元の状態は失われます。
  • Disable: オブジェクトを削除せずに一時的に無効化します。
  • Enable: 無効化されたオブジェクトを再活性化し、元の状態 exactly に復元します。

:warning: 無効化されたオブジェクトもメモリを消費します。
再利用する予定がない場合は、代わりにRemoveを使用してください。


:film_frames: 消滅アニメーションを追加したい場合

この例では、簡略化のためアニメーションをスキップしました。
しかし、弾が消える前にアニメーションを表示したい場合は、ヒット後に直接 RemoveSelf を呼び出さないでください。

その代わりに、Move と Remove の間に中間の「Hit」ステートを追加します:

  1. 衝突時に Hit ステートへ遷移します。
  2. アニメーションを再生します。
  3. **「Animation Ended」または「Time Elapsed」**のような条件を追加して、その後 Remove ステートへ遷移します。

ステップ 3:プレイヤーの弾と銃を設定する


1. Object_Sampleplayer タブに戻ります。

2. シーンパネルの左上にある Add Node ボタンをクリックします。


3. Node > AGMaker から BulletSettings ノードを追加します。

このノードは発射される弾を管理します。


4. BulletDataList > + Add Bullet > <empty> > NewBulletData を展開して、新しい弾データを生成します。


5. Bullet Base Settings で基本的な弾の設定を構成します:

  • Name: 任意の名前を設定します(例:Sample_Bullet
  • Object Path: 先ほど作成した sample_bullet.tscn を選択します。

:warning: このファイルを後で移動させると、参照が切断されます。

  • Unlimited Bullets: このオプションを有効にします

(詳細は後で説明します。)


6. Initial BehaviorFireObjectDirection に設定し、オブジェクトが向いている方向に弾を発射するようにします。


7. 弾の設定は完了です!

これで、発射アクションを使用して、プレイヤーが向いている方向に sample_bullet を発射できるようになります。


8. 次に、プレイヤーに銃を取り付けましょう。

AnimationPlayer を選択し、アニメーション 044_Gun_Aim を再生してみてください。
照準アニメーションが再生されますが、プレイヤーはまだ武装していないように見えます。


9. 銃の画像はデフォルトで含まれています。

ファイルシステムで templates > objects > weapons > P_other に移動します。
W_005_gun.png を使用します。キャラクターの左手に良く合います。


10. シーンパネルで以下を選択します:

BoneAnimationRoot2D > Skeleton > B_Chest > B_Joint_L > B_Arm_L > B_Hand_L > B_Weapon_L


11. B_Weapon_L が選択された状態で、W_005_gun.png を手の近くまでドラッグし、Shift キーを押しながらドロップします。

これにより、画像が B_Weapon_L子ノードとして追加されます。


12. 正しく行っていれば、W005GunB_Weapon_L の子になっているはずです。

そうでない場合は、手動で正しいノードの下に移動させてください。


13. 角度と位置を調整します。

W005Gun を選択し、インスペクターで Node2D > Transform に移動します。
以下を設定します:

  • Position: x: 12, y: 21
  • Rotation: 156.4 度

:light_bulb: 回転が 0 であっても、アニメーションによりボーン自体が回転している場合があり、子ノードに影響を与えることがあります。


14. アニメーションを再生して、移動中に銃が正しく見えるか確認します。

すべてが問題なければ、発射ポイントを調整しましょう。


15. Connector ノードを使用して、弾の発射点を指定します。

キャラクターには Connector - gun fire というノードがありますが、足元に表示されています。
これを銃の銃口まで移動させます。


:white_check_mark: これで、プレイヤーに弾、銃、正しい発射点が備わりました!


:hammer_and_wrench: 弾の設定の詳細

:small_blue_diamond: 基本設定

  • Shot Count: アクションごとに発射される弾の数。
    バースト発射や散弾銃効果に使用できます。

:warning: 発射中に状態が変更されると、発射は停止します。

  • Fire Interval: 多連発時の弾ごとの間隔。
    • 0.3 秒 = 0.3 秒ごとに 1 発発射
    • 0 秒 = すべての弾を同時に発射
  • Shot Limit: 画面に表示される弾の最大数。
    • 1 の場合、前の弾が消えるまで待つ必要があります。

:small_blue_diamond: 初期挙動

  • Initial Behavior: 発射された後の弾の動き方。

:warning: 弾のスクリプトが動きを制御している場合、そちらが優先されます

  • Spread Range: 広がり(散弾)の度合い。
  • Spread Type:
    • Fixed: 広がり角度内で均等に配置
    • Wiper: 発射中に前後に揺れ動く
    • Random: 広がり範囲内でランダムな角度

:small_blue_diamond: 飛行中の挙動

発射後の挙動を制御します。例:

  • 固定されたターゲットへの誘導
  • ブーメランのような軌道

:warning: 再度、弾自体のスクリプトがこれらの設定よりも優先されます

ステップ 4:弾を発射する


1. Player の隣の :scroll: アイコンをクリックして、ビジュアルスクリプトを開きます。


2. Idle の近くに新しい Shoot ステートを作成します。

アニメーションを 044_Gun_Shoot に設定します。

\u003e :warning: アニメーションが表示されない場合は、Object_SamplePlayer タブが開いていることを確認してください。


3. 実行可能なアクション Fire Bullet を追加します。

設定:

  • Bullet DataSample_Bullet に設定
  • ConnectorConnector - gun fire に設定

これにより、プレイヤーが銃口から Sample_Bullet を発射できるようになります。


4. Idle → Shoot をリンクします。

条件を以下に設定します:X ボタンが押されている間(キーボードの場合は C キー)。


5. Shoot → Idle (ショートカット) をリンクします。

条件を以下に設定します:アニメーションが終了したとき


6. すべてが正しく設定されていれば、プレイヤーは今すぐ発射できるようになります。

:test_play: を押すか、F5 キーを押してテストプレイしてください。弾が発射され、タイルに当たると消えれば成功です!


:hammer_and_wrench: トラブルシューティング


:cross_mark: 発射アニメーションが再生されない

\u003e Idle → Shoot の遷移が正しく設定されているか、アニメーションが適切に設定されているか確認してください。


:cross_mark: キャラクターが発射アニメーションのまま永遠に止まる

\u003e Shoot → Idle の戻り遷移が正しく設定されていない可能性があります。


:cross_mark: 弾が発射されない

  • Fire Bullet アクションが正しく設定されているか確認してください。
  • 以下を確認してください:
    • 弾データ が割り当てられていること
    • コネクタ が設定されていること
    • コネクタが銃の銃口に正しく配置されていること

:cross_mark: 一度に発射できる弾が一つだけ

\u003e BulletSettings で弾の制限が無限に設定されていない可能性があります。


:cross_mark: 弾が決して消えない

\u003e sample_bullet のビジュアルスクリプトを確認してください。

  • 以下を確認してください:
    • Remove ステートに正しい RemoveSelf アクションがあること
    • すべての 3 つの条件AND ではなく OR で接続されていること

:right_arrow: パート 2 へ進む

「いいね!」 1