チュートリアル: スクリプトコース#1 射撃攻撃を作ってみよう。

このコースでは、ACTION GAME MAKERでの基本的なスクリプト作成方法を学んでいきます。
第一回では、攻撃を作っていきます。

ヴィジュアルスクリプトを扱う上での注意点

  • ヴィジュアルスクリプトとタブ
    Godotの仕様上、エディター画面でどのシーンタブを開いていても自由に任意のスクリプト画面を開くことが可能です。しかし、ヴィジュアルスクリプトでは、開いているシーンタブにあるノードの情報を取得して利用します。 そのため、ヴィジュアルスクリプトがアタッチされていないシーンタブを開いた状態でヴィジュアルスクリプトを設定しようとすると、ノードの情報を取得できずアニメーションや変数/スイッチのデータが取得できませんのでご注意ください。なお、誤って開いてしまってもヴィジュアルスクリプトに変更を加えずに正しいタブに戻せば問題はありません。

  • ヴィジュアルスクリプトと参照ファイル
    Godotの仕様上の制約から、各アクションの「他のオブジェクトを指定するパス」は文字列データとして保存されています。そのため、ファイルシステム上で対象のゲームオブジェクトを動かしてしまうと、参照先が存在しない状態になってしまいます。 参照先のデータに到達できるかを確認する参照確認(Missing Check)機能を用意してはおりますが、開発が大規模になってから参照の再設定を行うのは大変です。開発を開始する際には、事前にフォルダを整理してから開発を開始することを強くおすすめします。

コース開始の事前準備

このコースでも、最初のチュートリアルで使用したチュートリアルプロジェクトを利用します。
それではプロジェクトを開いて準備してください。

STEP1: 弾のオブジェクトを作ろう - 弾の設定

  1. 新しいゲームオブジェクトシーンを作りましょう。中央エディターウィンドウのタブで+を押して新しいタブを開きます。そしてシーンウィンドウでGame Objectを選択しましょう。
  2. オブジェクト作成画面では、以下のように設定して作成ボタンを押します。
    オブジェクト名: 任意の名称(ここではsample_bulletとします)
    テンプレート: bullets
    種類: bullet_base
    グループ: Player
  3. 一通りの基本設定がされたゲームオブジェクトシーンが生成されます。まずはセーブをしておきましょう。未保存となっているタブを右クリックするか、Ctrl+Sのショートカットを使って任意の場所に保存しておきましょう。
  4. 画像を設定したいところですが画像がありません、今回はGodotで四角形を描画するノードで代用しましょう。シーンウィンドウ左上の+ボタンを押してください。
  5. Node>CanvasItem>ControlにあるColorRectノードを選択して作成しましょう、検索バーでColorやRectと入れて検索すると便利です。
  6. 白い四角形が生成されました。比較対象がないため分かりづらいですが、これは非常に大きいので小さくします。シーンウィンドウで作成されたColorRectノードを選択してください。
  7. インスペクターウィンドウでLayout>Transformを展開します。サイズが40x40と非常に大きいので、4x4くらいにしておきましょう。
  8. 原点から右下に向かって作成されているので、中央が原点になるようにしましょう。Positionをx=-2,y=-2にします。これでシーンの原点が中央になるようになりました。
    image
  9. 赤い半透明の四角形(AttackCollision)は攻撃範囲なのですが、大きすぎるようです。小さくしましょう。シーンウィンドウでAttackCollisionを選択してください。
  10. 四隅を選択してColorRectより一回り大きいくらいまで縮めましょう。
  11. 水色の半透明の四角形(CollisionShape2D)は壁判定です。このままでは壁に阻まれて攻撃が届かないので、壁は攻撃範囲よりさらに一回り小さくしましょう。
  12. 続いてMoveAndJumpSettingsノードを選択してください。水平/垂直方向の移動速度の初期値は秒間100pxと非常に遅いので、300pxくらいにしておきましょう。
  13. 通常のオブジェクトであればアニメーションや基本設定なども必要になりますが、今回の弾はシンプルなものにするので設定不要です。

STEP2: 弾のオブジェクトを作ろう - 弾のスクリプト

  1. 新しいスクリプトを作成しましょう。 シーンウィンドウ上部の:scroll:マークをクリックして新しいスクリプトを作ります。
    image

  2. 言語がVisualScriptであることを確認の上、任意の名称をつけて作成してください。

  3. 最初のノードはMoveと名称を変更し、重力の影響を受けないオプションを有効にしておきます。

  4. Actions>+Add Excutable Actionより実行アクションとして、攻撃設定を追加します。命中グループを指定し、Enemyのみとしましょう。これにより攻撃がプレイヤーにあたってしまうのを回避します。

  5. 続いて、ステートを追加より新たなステートを作り、Removeと名付けましょう。こちらも重力の影響を受けないオプションを有効にしておきます。

  6. Removeステートに実行アクション、自身を削除(RemoveSelf)を追加します。これは、自身をゲームから取り除く処理です。弾や敵のようなオブジェクトは、役割を終えた際に取り除くようにしないとずっと存在することになり、リソースを圧迫してしまいますので必ず取り除くようにしましょう。

  7. 最後にMoveを右クリックしてリンクを作成してRemoveにつなぎます。

  8. 取り除く条件を3つ設定します、1つ目は敵に命中したときです。インスペクターよりConditions>Add Conditionで、当たり判定と接触(ContactWithHitArea)を追加します。どの方向から当たっても判定したいので、判定方向はすべて、対象グループはEnemyとしましょう。

  9. 2つ目の条件を設定します。同様の手順でカメラの範囲外(Offscreen)を追加します。ターゲットタイプはこのノード、前の条件との論理条件はORにしましょう。ここがANDのままだと、双方の条件を満たさないと遷移しなくなってしまいます。

  10. 3つ目の条件を設定します。同様の手順でタイルと接触(ContactWithTile)を追加します。同じくどの方向からあたっても判定したいので、判定方向はすべてとします。前の条件との論理条件はORにしましょう。

  11. これで、敵グループと命中する「もしくは」カメラの範囲外になる「もしくは」タイルと接触することで自身が削除されるようになりました。

TIPS

削除(Remove)と復活(RestoreRemove)、無効化(Disable)と有効化(Enable)アクション
似たような条件があることに気づいた方もいらっしゃるかもしれませんので、使い分けについて説明させていただきます。
削除(Remove)はその名の通りゲームから完全に取り除くもので、再利用する必要がないオブジェクトに向きます。復活(RestoreRemove)することはできますが、実際は新たに生成し直すもののため以前の状態はリセットされます。

無効化(Disable)は一時的に動作しないようにするだけのもので、ゲームからは取り除きません。そのため、有効化(Enable)することで元の状態そのままで復帰できます。便利ですが、Disable状態のオブジェクトもリソースを消費するため、再利用する予定がないものは削除(Remove)したほうが安心です。

消滅アニメーションを設定する場合の設定
今回は特にアニメーションを設定していないため、即座に消滅するようにしましたが、Removeアクションにアニメーションを設定するとアニメーションが再生される前に消滅してしまいます。
設定したい場合は、RemoveとMoveの間に命中用のステートを追加すると良いでしょう。
命中条件を満たすと命中用ステートに遷移し、アニメーションを再生。「アニメーションが終了した」条件か「秒数経過」条件でRemoveステートに遷移するようにすると良いでしょう。

STEP3: プレイヤーに弾と銃を設定しよう。

  1. Object_Sampleplayerタブに戻りましょう。

  2. シーン画面左上のノード追加ボタンを押してください。

  3. Node>AGMakerにあるBulletSettingsノードを追加します。これは発射する弾を管理するためのノードです。

  4. BulletSettingsは以下のように弾を発射する側オブジェクトに設定します。

  5. BulletDataList→弾を追加(+Add Bullet)→<空>→NewBulletDataと展開し、新しい弾データを作ります。

  6. 弾の基本設定をします、BulletData>Bullet Base Settingsを展開し、以下のように選択します。
    名前: 任意の名称をつけてください、ここではSample_Bulletとします。
    オブジェクトパス: 先ほど作成したsample_bulletを指定してください。*以後、sample_bullet.tscnの場所を移動すると参照が切れて動作しなくなるのでご注意ください。
    弾を無制限にする: オン *ここについては後ほど解説します。

  7. 次に初期動作を設定します。初期動作(Initial Behavior)を展開し、初期動作をオブジェクトの表示方向に発射(FireObjectDirection)としましょう。

  8. これで弾の設定は完了です。これで弾を発射アクションでsample_bulletを表示方向に発射できるようになりました。続いて銃を持たせていきます。

  9. AnimationPlayerを選択してアニメーションで044_Gun_Aimを選択して再生してみてください。銃を撃つアニメが再生されます・・・が、素手のままです。

  10. 銃の画像自体は同梱されていますファイルシステムのtemplates>objects>weapons>P_otherの中にW_005_gun.pngがありますのでこれを使いましょう。この銃を左手のボーンにもたせるとうまくいきそうです。

  11. シーンウィンドウに戻り、BoneAnimationRoot2d>Skeleton>B_Chest>B_Joint_L>B_Arm_L>B_Hand_L>B_Weapon_Lを選択してください。

  12. B_Weapon_Lを選択した状態で、ファイルシステムのW_005_gun.pngを手のあたりに持っていき、Shiftを押しながらドロップします。

  13. Shiftを押しながらドロップすると選択したノードの子ノードとなるため、B_Weapon_Lの子としてW005Gunが追加されたはずです。うまくいかなかった場合は手動で動かしてください。

  14. 配置できましたが変な角度になってしまっていますので直しましょう。W005Gunを選択して、Node2D>Transformの位置(Position)と角度(Rotation)を直します。
    大体x:12,y:21,Rotation:156.4くらいにすればきれいになるはずです。
    なお、なぜ0度なのに傾いているのかという点については、親となる骨の角度がアニメーションによってすでにそのように傾いているからです。

  15. アニメーションを再生して問題なく動くか確認してみましょう。問題がなければ次は発射地点となる銃口を設定します。

  16. 発射地点にはConnectorというノードを利用します。このサンプルキャラクターには既にConnector - gun fireというそれらしきノードがありますが、なぜか足元にあるようなので調整しましょう。銃のグラフィックと同じく位置を調整して銃口のあたりに移動しましょう。

  17. これで、弾、銃、銃口の設定ができました。

弾の各設定の説明

基本設定
発射数(Shot Count): 一度のアクションで発射する回数です。連射やショットガン等を再現できますが、発射中にステートが遷移すると途中終了してしまうことには気を付けてください。
発射間隔(Fire Interval): 発射数と合わせて使います、発射の間隔です。この数値を0.3秒にすれば、0.3秒ごとに一発の弾を発射し、0秒にすれば同時発射になります。
弾の表示数(Shit Limit): 画面内に表示できる弾の上限数です。これが1であれば、すでにある弾が消滅するまで発射できなくなります。
初期動作
初期動作(Initial Behavior): 発射された弾がどのように動くのかを指定します。弾側で移動スクリプトが設定されている場合は、弾側のスクリプトが優先されます。
発射範囲を広げる(Spread Range): 弾の拡散範囲を指定します。
動きを指定(Spread Type): 弾の拡散の仕方を指定します。固定であれば発射角度の中で等間隔に発射し、ワイパーであれば発射角度の内で上下に動きながら発射します、ランダムであれば発射角度の内でランダムで拡散します。
動きの変化
動きの変化(In-flight Behavior): ロックオンしたターゲットを追尾したり、ブーメラン軌道を描いたりを指定できます。弾側で移動スクリプトが設定されている場合は、弾側のスクリプトが優先されます。

STEP4: 弾を発射しよう。

  1. Playerの横の:scroll: マークをクリックしてヴィジュアルスクリプトを開きます。
  2. Idleの近くに新しいステートShootを作り、アニメーションとして044_Gun_Shootを設定しましょう。もしアニメが何も表示されない場合は、Object_SamplePlayerタブを開いているかを確認してください。
  3. アクションを追加で弾を発射(FireBullet)アクションを設定します。弾データはSample_Bulletを選択し、接続点としてConnector - gun fireを指定しましょう。これで銃口からSample_Bulletを発射するようになります。
  4. IdleからShootにリンクをつなぎます。遷移条件はXボタン(キーボードではCキー)の入力がされている間と設定します。
  5. ShootからIdleのショートカットにリンクをつなぎます。遷移条件はアニメーションが終わったら、と設定しましょう。
  6. さて、これでうまく設定できていれば弾が発射できるはずです。:play_button:かF5キーでテストプレイをしてみましょう。弾が発射され、タイルにあたって消えていれば成功です。

うまくいかない場合のトラブルシューティング

発射アニメが再生されない
遷移に失敗している可能性が高いです。きちんとアニメーションが設定されているか、IdleからShootの遷移の設定が正しいかを確認してください。

ずっと発射アニメのままになった
同じく遷移に失敗している可能性が高いです。ShootからIdleに戻る遷移が正常に設定できているか確認してください。

弾がでない
弾の発射アクションの設定に失敗している可能性があります。
発射アクションで正しく弾データを設定できているか。
接続点がきちんと設定されているか。
接続点が銃口の位置にあるか。
等を確認してください。

弾が一度しかうてない
BulletSettingsで弾の表示数が無制限になっていない可能性があります。

弾が消えない
sample_bulletオブジェクトのビジュアルスクリプトを確認してください。Removeに消滅アクションが設定されているか、3つの遷移条件がORで繋がれているかを確認してください。

第二回はこちら