GASPのALS版をもとに、モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラをつくりましょう。
遊べる完成形はこちらで公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering
本記事はプレイヤーと敵キャラ双方が銃を撃てるようにする方法の説明です。
ステップ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 詳細欄
バンバン撃たれてますね
こっちも反撃です
ゲームらしくなってきましたね
コメント