チュートリアル: スクリプトコース#2 敵を作ってみよう。

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

コース開始の事前準備

第一回で使用したプロジェクトを引き続き利用します。
それではプロジェクトを開いて準備してください。

STEP1: 敵(ゾンビ)の基本設定をしよう。

  1. 敵はテンプレートオブジェクトのゾンビを使います。新しいタブを開き、ゲームオブジェクトを選択し以下のように設定して作成してください。
    名前: 任意、ここではSample_Zombieとします。
    テンプレート: characters
    タイプ: Enemy_Zombie
    グループ: Enemy
    作成したらCtrl+Sでセーブしておきましょう。

  2. 基本設定を行います。BaseSettingsを開いて以下のように設定してください。
    左右反転モード(Enable Auto H Flip):ON ヴィジュアルスクリプトでは右側を表示方向として認識します。しかし、このオブジェクトは左向きに作成されているため、左右反転モードをオンにする必要があります。
    動作開始の条件(Enable Object Condition): カメラに近づく(CLOSE TO CAMERA) *カメラの範囲外では無効化され動作しないようになります。
    HP: 5、MaxHP: 5 HPが1では少なすぎるので5にしておきましょう。
    無敵時間(InvincibilityDuration):0.2秒 *ダメージを受けた際の無敵時間です。1秒では短すぎるので0.2秒としておきましょう。

  3. 本来は各種衝突判定やアニメーションの設定等も必要ですが、テンプレートオブジェクトでは予め設定されているので基本設定はこれだけです。

解説

無敵時間について
無敵時間は非常に重要です。仮に無敵時間を設定しない場合、攻撃判定が消えるまでの間無限に攻撃が命中します。一方で無敵時間が長すぎるとマシンガンのような連続攻撃が無敵で当たらないということが発生します。自分のプロジェクトに最適な設定を調整していきましょう。

STEP2: 敵(ゾンビ)のスクリプトを組もう。

  1. :scroll: +マークを選択して新しいヴィジュアルスクリプトを作成しましょう。
  2. 最初のステートはWalkと改名し、アニメーションは歩行アニメであるE_01_act_003を設定します。また、表示方向を左にしておきましょう。(未設定では右向きに配置されてしまうためです。)

    3.Walkの実行アクションとして、テンプレート移動(TemplateMove)を設定しましょう。テンプレートタイプは水平方向のままで良いですが、折り返しだけ無効化しておきます。これで秒数による折り返しのみ無効化し、壁にあたるまでは反転しないようになります。
  3. 試しにゲームシーンに配置してみましょう。BaseLayer>ObjectRootの子としてsample_zombie.tscnを配置してみましょう。
  4. テストプレイをしてみましょう、左に向かって歩行モーションでゾンビが動き、ゾンビに弾があたって消えていれば成功です。正常に動かない場合は以下を参考にチェックしてください。
    ゾンビが逆方向に動く場合: 基本設定の左右反転モードが有効になっていないか、Walkステートの表示方向が左向きになっていない可能性があります。
    ゾンビに弾を当てても弾が消えない場合: 弾のスクリプトに問題がある可能性があります。オブジェクトの当たり判定と接触が正常に設定されているか確認をしてください。
    なお、ゾンビに弾をいくら当てても死なないのは正常です。なぜなら死亡のステートを設定していないからです。
  5. 次はゾンビに被ダメージを作りましょう。AnyStateの近くに新しいステートDamagedを作ります。アニメーションとして被ダメージアニメE_01_act_008を設定しましょう。
  6. 続いて、アクション設定で水平方向移動速度を10%にします。これでゾンビが被ダメージアクション中は足が遅くなります。
  7. アクションを3つ追加します。1つ目は音を再生(PlayAudio)です。AudioDataとしてZombie2を設定しましょう。
  8. 2つ目はウェイトです。この実行アクションを対象に0.2秒のウェイトをいれます。これはアニメーションが再生される時間を用意するためです。
  9. 3つ目は前のアクションに戻る(TransferToAction)です。特に設定はないのでこのまま追加します。
  10. これで、うめき声を上げて0.2秒後に前のステートに戻るようになります。前のステートについては次で説明します。
  11. AnyStateからDamagedにリンクをつなぎましょう。AnyStateとはその名の通り全てのステートです。つまり、どのステートであっても、条件を満たせばこのリンクでDamagedに遷移することになります。「前のステートに戻る(TransferToAction)」はこのAnyState専用のもので、「遷移前のステート」に戻ることができます。RPGツクール経験者の方であればコモンイベントという名前が馴染み深いかもしれません。なお、今回のゾンビのような小規模なスクリプトであれば、AnyStateを使わず直接つなぐことも可能ですが、沢山のステートがあるオブジェクトの全てからリンクをつなぐのは非常に大変なのでチュートリアルのためこの方式を使います。
  12. リンクに2つの条件を追加します。1つ目は攻撃判定に接触(ContactWithAttackArea)です。Playerからの攻撃に、全ての方向から当たった時、という設定をしましょう。
  13. 2つ目はHP=0です、以下のように設定しましょう。
    ターゲット: このノード
    条件を反転(Is Reversed): オン *これはその名の通り条件を反転します。つまり、HPが0でないときということになります。
    前の条件との論理条件(Connection With Previous Condition): AND *ここではANDのままです。ダメージを受けて、かつHPが0ではないときに遷移としたいからです。
  14. さて、これで被ダメージの設定ができたので動作を試してみましょう。正常に設定できていれば、ダメージを受ければうめき声をあげてのけぞり、5回ダメージを受けた後はのけぞらなくなるはずです。うまくいかない場合は以下をチェックしてください。
    被ダメージ動作してない: リンクが正しいか、特にHP0がきちんと反転設定になっているか確認してください。また、Damagedにアニメーションが正しく設定されているか確認をしてください。
    何度あてても被ダメージ動作をする: リンクの論理条件がANDになっていることを確認してください。
  15. 最後に死亡動作を作ります。新しいステートDeadを作り、アニメーションとしてE_01_act_009を設定してください。
  16. アクション設定で水平方向の移動速度を0%にしておきます。死亡モーション中動かないようにするためです。
  17. アクションを3つ追加します。1つ目はオブジェクトのプロパティを変更(ChangeObjectProperty)です。以下のように設定してください。
    タイプ: オブジェクトのプロパティ *ノードのプロパティ(インスペクターで設定できる項目)を変更します。
    対象: 自分自身
    対象ノード: AttackCollision *AttackArea2Dではありません。
    対象プロパティ: disabled
    代入する値: On *攻撃コリジョンを無効化します。プレイヤーが死体に当たってダメージを受けないための措置です。
  18. 2つ目はウェイトです。0.85秒のウェイトを入れましょう。先程と同じくアニメーションの再生時間を確保するためのウェイトになります。
  19. 3つ目はオブジェクトを消滅(RemoveSelf)です。これで、攻撃範囲を無効化し、死亡アニメを再生し、消滅します。

  20. AnyStateからDeadにリンクをつなぎ、条件としてHP=0を追加します。今回は反転しません。
  21. 最後にテストプレイしてみましょううまく行けば、弾を5発あてれば死亡モーションを再生して消えるはずです。うまくいかない場合はリンクやアクションをチェックしましょう。

第三回はこちら