GASP-ALSでアクション その13 敵AI10/11 いざ対決 銃を撃つ

※本サイトはアフィリエイト広告を利用しています。

GASPのALS版をもとに、モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラをつくりましょう。

遊べる完成形はこちらで公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering

本記事はプレイヤーと敵キャラ双方が銃を撃てるようにする方法の説明です。

ステップ10/11の記事です 01:00:11~

ステップ10 いざ対決プレイヤーのターン

せっかく武器持っているんだから戦いましょう。

AIだけでなくプレイヤーも同じ攻撃ができるように、サンドボックスキャラクターに実装していきます。

入力定義

左クリックからも呼びたいですがそれっぽいものがなんか定義されていませんね

であれば右クリックのIA_AimをコピペでIA_Fireを作りましょう
キーマッピングのアセットに登録します

IMC_Sandbox

Mappingsの+ボタン押下すると、一番下に「なし」が追加されているので、そこに今作ったのを登録します。

開いてキーボードのボタン押して左クリックすればマウス左ボタンとの紐づけできます
(ゲームパッドなどもお好みで)

攻撃イベント作成

とりあえず左クリックまたはAI用のAddCustomEventを発動したらFireと表示してみましょう。

CBP_SandboxCharacter > イベントグラフ

反応はしていますね

ではオーバーレイステートがライフルの時だけ発射できるようにしましょう

武器持ってない状態ではファイヤーできず、ピストルでもダメで、ライフルに持ちかえたら発射できますね。
まだ、構えているかは関係ありません

では構えているときだけという条件をさらに追加しましょう

Gaitに構えの情報はありませんね
アニメーションBPでは何を見ているか参考にしましょう
ここでも入力状態を見ているみたいですね

ABP_SandboxCharacter > AnimGraph

では真似しましょう

エイムはフラグなので、上の ライフルだったら && エイム でよさそうですね。
AND Booleanです

よっしー
よっしー

Input Stateは構造体ですが、出力ピンを右クリックして分解すると直接フラグを取り出せます。Breakというノードを使ってもOKです。

できましたね
ただしスプリント中は構えてないのですが発射できていますね

もうひとつ端子を増やしてスプリントフラグのNOTも追加しましょう

これでダッシュで走っているとき(ALSの現在の設定だと銃を構えない)は銃を撃てなくなりました

弾発射

では弾を飛ばしましょう(以前の記事で解説済の内容と結構かぶるので割愛気味で)

新規ブループリントクラスを作ります。種類はアクターで、弾なのでBP_Bulletとしておきます

Lyraからもらってきたりしていないので、今回は適当にスフィアを飛ばします
1メートルはでかすぎるので小さくしましょう。0.05倍で5cmくらいにしてみます

さらに追加でプロジェクタイルです

よっしー
よっしー

日本語だと投射物移動コンポーネントと堅苦しい名前ですね

BP_Bullet / ProjectileMovement 詳細欄

初期スピードが弾の飛んでいく速さです

よっしー
よっしー

単位はcm/秒です

遅いので4000にしました。

Projectile Gravity Scaleを0にして、重力落下させないことなどもできますが、私は落ちるほうがリアルかなと思います

あとは当たったらダメージを与えるイベントを作りましょう

ヒットかオーバーラップかどっちかな?とりあえずオーバーラップでやりましたが、コリジョンをブロックにしてHitがよいでしょう。

other actor ぶつかった相手に Apply Damage で攻撃します

BP_Bullet > イベントグラフ

それを受けるサンドボックスキャラクター側にもイベントを作りますが、その前に体力変数を追加して1撃ではやられないようにしましょう
1じゃなくて2にしておきます

では Any Damage 何らかのダメージイベント で攻撃を受けたときの処理を作りましょう

攻撃を受けたら体力からダメージを減らして、あとはダメージ受けたあとの体力が0以下だったらやられます。ラグドール化しましょう。

おっとラグドール関連はたくさんあってどれかわかりませんね

Xキー押したときは Server_ActivateRagdoll イベントが呼ばれているようなのでこれにしましょう

5秒間寝て復活(ラグドール解除)する仕様としましょう

よっしー
よっしー

麻酔銃という仮設定で、寝るけど起きると

ではFireイベントに、弾を飛ばす処理を追加します。Spawn Actor from Classです

ライフルはオーバーレイスケルタルメッシュなのでこれを参照して、muzzle というソケットが銃口なのでここから飛ばしたいです

緑のY軸が正面になっていますね

muzzle ソケットのトランスフォームを参照します

座標系はワールド座標のままがよいです。子供ではなく別なアクターとして飛んで行ってほしいので

よっしー
よっしー

ソケット名は間違えないようにコピペ推奨します

ソケットの向きに合わせて弾が飛ぶ方向もY軸に変更しましょう

よっしー
よっしー

ソケット側をX軸に直すこともできるでしょうが、ピストルなども同じ設定でしょう。自分で別な銃を用意する場合はどちらかに合わせましょう

BP_Bullet / ProjectileComponent > 詳細欄

このベロシティーが飛ぶ方向ですね

ちゃんと飛んでいますが角度が悪くて見づらいです

よっしー
よっしー

これALSのV4のときはまっすぐ向いていたので調整の問題っぽいですね

※動画ではコリジョンをいじったせいで自キャラはいいけど敵キャラがぶっ飛ぶ事件が発生して大変でした

コリジョンまわりを変更するときはラグドール処理に影響ないかも確認してください

ステップ11 いざ対決敵キャラのターン

敵キャラ側の攻撃を実装します。が、ただ撃ちまくるだけじゃ面白くならないので
一定距離に近づいたら撃ちつつ近づいてきたり、追いかけながらパルクール動作もしつつ撃ってくるようにします

ここでサービスというのを使って、ビヘイビアツリー全容を把握しましょう

よっしー
よっしー

これがこのチュートリアルの真の目的

まずは攻撃のタスクを用意しましょう。このあたりはもう説明不要かなと思います。
BT_AIにファイヤータスクを登録しましょう

新規BTタスク:BTT_Fire

発見して追いかけているときにこのへんで実行してみます

これで、追いかけながら、発砲とトラバースできるか確認を0.5秒ごとに繰り返す作業をします。

次に、エイム状態じゃないと発射できないので、一旦強制的にエイム状態にしておきましょう

CBP_AI / 変数 / CharacterInputState 詳細欄

バンバン撃たれてますね

こっちも反撃です

よっしー
よっしー

ゲームらしくなってきましたね

コメント

タイトルとURLをコピーしました