チュートリアル: 弾のツクり方とスプライトアニメについて学ぼう!

Part3: プレイヤー側で弾の発射を設定しよう!

続いて、プレイヤー側で弾の設定を行います。
手順は「弾」設定で弾データに「炎弾」を登録。「弾を発射」アクションを追加、の2段階です。

Part3-1: 「弾」設定をしよう!

  1. オブジェクトビューに戻り、オブジェクトを「プレイヤー」に切り替えます。
  2. 左上にある「+設定を追加」しましょう。
  3. 設定を追加ウィンドウで、オブジェクト利用にある「弾」を追加します。
  4. 右側のインスペクターを見て、弾の一覧にある「Array[BulletData]」をクリックして展開し、続けて出てくる「BulletData」をクリックして展開します。
  5. 基本設定を展開します、まずは弾の名前を炎弾として、弾オブジェクトを指定の「一覧」ボタンから「炎弾」を追加します。
  6. 続けて、基本設定の「制限無し」をオンにしましょう(ここがオフだと、シーン内に炎弾があると発射できなくなります)、基本設定が画像のようになっていればOKです。
  7. 次は「弾の飛び方(初期動作)」を展開し、「発射元オブジェクトの表示方向」と設定しましょう。
  8. これで弾データ側の設定はOKです、「炎弾」を、「発射元オブジェクトの表示方向」に、「シーン内にいくつ炎弾があっても」発射する。というデータをつくることができました。

Part3-2:「弾を発射」アクションを設定しよう!

  1. 「ヴィジュアルスクリプトを編集」に入り、「移動」ステートの近くに新しいステートを作り、アニメーションカテゴリ名には「shoot」を設定し、「地上発射」と名付けましょう。

  2. 「+実行アクションの追加」をしましょう。左枠は「攻撃/弾」の「弾を発射」、右枠は弾データ「炎弾」を選んで「追加」します。もし炎弾がないときは正しくプレイヤーの「弾」設定に炎弾が設定されているかチェックしてください。

  3. アクション側は設定完了なのでリンクを作ります。「移動」ステートから「地上発射」にリンクを追加し、「以下の入力がなされた」にチェックを入れ、「+入力を追加」します。

  4. 左枠を入力に使う操作キー、右枠を入力キー: B、入力の条件: 押された瞬間として「追加」しましょう。

  5. このままでは移動中しか炎弾しか打てないので、待機からもつなぎます。内容は全く一緒なので、「移動」→「地上発射」リンクをコピーして待機にペーストし、地上発射につなぎましょう。

  6. 最後に「地上発射」から「待機」に戻るリンクを作り、ステートを切り替える条件を「アニメーションが終了した」にしましょう、これで「shoot」アニメがおわると「待機に戻るようになります。」

  7. これで設定できましたが、線がゴチャゴチャしていると感じるかもしれません、ステートはドラッグで移動できるので、この機会に少し動かして整理をしておくとよいでしょう。(以下画像では、全体的にステートの位置を下げて地上発射を上にうごかしました。)

  8. さて、それではテストプレイをしてみましょう。うまく設定できていれば、プレイヤーの向いている方向に炎弾が出て、跳ねながら前に進むはずです。なお、「この時点では正しく設定していても、弾は消えますが敵を倒せません」。弾が出せるか、跳ねながら進むかだけをチェックしてください。

うまくいかないときのチェックリスト

・弾がでない。
「弾を発射」アクションで正しく弾データが指定されているかチェックしてください。
・弾は出るが、その後動けなくなる。
待機へ戻るリンクの設定が正しいか、地上発射ステートにshootアニメが正しく設定されているかチェックしてください。
・弾は出るが、2回目以後でない。
弾データで基本設定で「制限なし」が正しくオンになっているかチェックしてください。
・弾は出るが、バウンドしない。
移動ステートで正しくテンプレート移動:バウンドが設定されているか。
「衝突可能なものとの接触」で誤って下方向を有効にしていないか
をチェックしてください。

Part3-3: 弾でエネミーを倒せるようにしよう。

さて、この時点で正しく設定をしていても弾は敵にあたり、消えます、そして実際にダメージも入ってHPが0になっていますが、敵はダメージ動作を行いません。
これはなぜかというと、「ダメージ」ステートへの遷移条件が「player」グループとの接触だけになっており、プレイヤーの弾が属する「player_bullet」との接触が設定されていないためです。早速設定を直してみましょう。

  1. オブジェクトビューに戻り、「エネミー」を開き、「ヴィジュアルスクリプトを編集」します。ダメージステートをコピーしてペーストしましょう。

  2. ダメージ(1)というステートができるので、「炎弾ダメージ」とタイトルを変更し、設定されている「オブジェクトの速度を設定」を削除します。(速度を設定はプレイヤーを跳ね上げるアクションですので、弾で跳ね上げがおきないようにします。)

  3. walk→ダメージのリンクをコピーして、walk→炎弾ダメージのリンクとして貼り付けます。

  4. インスペクターの「オブジェクトの攻撃判定に゙接触」を開き、対象となるオブジェクトグループを「Player_Bullet」に変更しましょう。

  5. 続いて、ダメージ→Deadの条件を同じくコピーし、炎弾ダメージ→Deadのリンクとして貼り付けます。

  6. これで準備は完了です。プレイヤーの弾にあたると炎弾ダメージにリンクするようになり、hpが0になるとDeadまでつながるはずなので。テストプレイで試してみましょう。

うまくいかない時のチェックリスト

・弾が敵で止まらない
炎弾オブジェクトの「敵の当たり判定と接触」条件をチェックしてみましょう。
・弾は消えるが敵が消えない。
エネミーのwalk→炎弾ダメージのリンクと炎弾ダメージ→Deadのリンクの条件をチェックしてみましょう。

次のチュートリアルへは目次から

発展課題

さて、これで弾の出し方やアニメーションの設定方法が理解できたはずなので、チュートリアルとしてはここまで・・・ですが、ゲームとして見ると気になる点がいくつかあるはずです、その解決方法だけ記載しておくので、興味がある方はチャレンジしてみてください。

空中で弾が出せない。

地上発射のコピーでよいので、「空中発射」のステートを作り、「ジャンプ」ステートと「落下」ステートからリンクをつなぎましょう。
「空中発射」ステートからは「落下」ステートにだけリンクをつなぎましょう。
全ての設定は地上発射と同じで問題ありません。

・なぜ「ジャンプ」に戻さないのか?
ジャンプに戻すと、再びジャンプしてしまうからです。

・なぜ「地上発射」と「空中発射」にわけるのか?
戻り先をわけるためです。空中発射から「待機」に戻してしまうと、空中発射後に空中でジャンプできるようになってしまいます。

敵のHPを増やすと敵の動作がおかしくなる。

今の作りはダメージを受けた後、walkステートに戻ることができません。(HPが1しかないことが前提の作りになっているからです)
「ダメージ」、「炎弾ダメージ」からwalkに戻るリンクを用意しましょう。
そのリンクでは、その他条件として「変数・スイッチが変わった」HP>0としておけばHPが0より大きければwalkに戻り、HPが0であればdeadに移る、という設定にできます。

なお、せっかくステートをわけているので、新しい公式パーティクル(例えばexplode)を読み込み、炎弾ダメージのステートで「パーティクルを表示」すれば、炎弾を受けたときだけ違うパーティクルを出すことができます。