ミサイル作ります( ゚Д゚)
今回はぷちコンで自作していた、
Niagaraでのミサイル処理を作ってみようと思います。
※UE5.1を使用しています
※説明の誤りや不明瞭な点はコメントいただけると幸いです。
※サンプルも用意しました。見てみてください。
ミサイルエフェクト作り
それではミサイルをNiagaraで作成していきたいと思います。
その前にフォルダごとに色々分けようと思うので、
Missileフォルダを作りそちらにミサイル関連の処理等をまとめます。
それではNiagaraのMissileのエフェクトを作成していきます。
NiagaraSystemではEmptyのNiagaraSystemを作りましょう。
作り終わったら下記のようにNiagaraの設定画面になります。
それでは実際に設定していきたいと思います。
まずレンダリングをMeshRendererに変更します。
Emitter StateについてですがselfのOnce(一度だけ出現)するようにしてください。
onceの中でもInfinityの設定もあるのでこちらをCompleteに設定しておきます。
SpawnRateを追加して設定します。
SpawnRateを1に設定して一度のエフェクトで一つ出るようにします。
InitializeParticleの設定をします。
LifetimeModeをDirectSetにしてLifeTimeを2.0にします。
表示されている時間を設定します。
AddVelocityを追加して、
飛んでいく移動量とモードを設定をしていきます。
VelocityModeを「FromPoint」にして「LifeTime」を2にします。
続いてユーザーパラメータを作成します。
こちらはロックオンしてホーミングする位置情報になります。
上記のユーザーパラメータの方で追加したLockPositionを使用して、
SpringForceを使って指定した位置に飛んでいくように設定していきます。
ホーミングの動きはSpringForceを使って再現してます。
続いてCollisionの設定をします。
Collisionを設定することにより何かに当たった時の判定を取るために必要です。
続いてNiagaraとBPとの連携をするために、
ExportParticleDataToBlueprintを設定します。
その前にユーザーパラメータでCallBackObjectを追加します。
ユーザーパラメータを追加したらExport Particle Data to Blueprintを設定します。
②で出力するタイミングにCollisionValidを設定します。
これで当たった時の情報を渡すことができます。
③のCallBackHandlerに先ほど作成したCallBackObjectを設定してあげます。
これで設定は完了します。
最後にKillparticlesを追加します。
②で削除される条件として何かに当たった場合の「CollisionValid」を設定します。
続いて簡単なミサイルのトレイルの作成をします。
先ほど作成したミサイルのエミッタをコピーします。
コピーしたら不必要なスクリプトが多いので、
いらない処理は削除しておきます。
続いてレンダリング項目の部分をMeshRendererから、
SpriteRendererに変更します。
続いて先ほど作ったミサイルに追随してエフェクトが出るように、
Spawn Particles from Other Emittterを追加します。
そのまま追加するとエラーが発生してしまうので、
「問題を修正」を押すとSampleParticlesFromOtherEmitterが追加されます。
問題が修正されたらEmitterNameと各種設定を変更します。
SpawnRateを1000にしてSpawnRatePerParticleCapを10000にします。
これでミサイル側のエミッタの作成は完了です。
実際に作成が完了した場合下記のような状態になります。
ミサイルとは別に爆風のエフェクト作成しました。
こちらも解説してほしいなどありましたらコメントいただけると幸いです。
※今回はミサイル部分の説明をメインにしてます。
敵をロックオンする処理
先ほどまで説明していたエミッタを使用して、
ロックオンして飛ばす処理を作成していきます。
まずは入力から作っていきます。
UE5.1はEnhanced Inputを主体とした入力なので入力アクションを作ります。
アクションを作成したら入力マッピングに追加して、
入力アクションイベントを追加してあげます。
※今回はキーボードRキーを押したらロックする仕組みになってます。
入力設定が完了したらロック用のWidgetとターゲット用のActor、
ロックした敵の位置を渡すためのインターフェースを追加します。
ロックシステムのWidgetを作成して、
CanvasPanel内にImageを一つ追加したような形になります。
それからインターフェースですが、
今回はVector(ロックしている敵の位置)を渡すための関数一つのみです。
ミサイル処理を作成する準備は整ったので、
実際にミサイルの処理を作成していきます。
まずはロックされるActor内の処理になります。
〇ロックオンしたときの表示切替動作
Actorが見える範囲にいてまだロックされていない場合に、
ロックをしてWidgetを表示した後、敵の位置情報をインターフェースで渡す。
〇ロック解除時の動作
ロックされている場合に、ロックフラグをオフにしてWidgetの表示もオフにする。
最後に操作する側の処理を追加します。
まずは操作キャラにArrowを追加して、
ミサイルが最初に出現する場所を作ってあげます。
Arrowを追加したらミサイルで使用する、
イベントや変数などを作成します。
ミサイル関連のアクションイベントや、
ミサイル生成関数・Niagaraや作成したインターフェースの追加、
ターゲット位置のVector配列があります。
インターフェースの追加方法が分からない人がいるかもしれないので、
一応インターフェースの追加方法も書いておきます。
クラス設定から実装インターフェースの追加ボタンを押して、
インターフェースを指定すれば追加できます。
実際に内部の処理について説明していきます。
まずはNiagaraのミサイルを生成する関数から。
SpawnMissile関数を作り、インプットにcomponentとVectorを追加します。
追加した情報を元にSpawnSystemAtLocationでミサイルエフェクトを追加して、
CallBackObjectと飛んでいくVector情報をナイアガラパラメータに渡します。
続いてターゲットをロックしてミサイルを発射して、
ミサイルのロックを解除するまでの処理になります。
〇敵のロックオン処理
ロックボタンを押したら敵をロックする。
ロックが行われると右側のロックした位置をもらう、
インターフェースのイベントが発生する。
〇ミサイルのエフェクト生成
forEachLoopでミサイルエフェクトを生成。
ターゲット位置情報を渡しつつエフェクトを生成していく。
最後にターゲット位置配列情報を消して、
ターゲット表示も消す。
Niagaraのエフェクトが当たった時のイベントになります。
こちらは当たった位置で爆発エフェクトを発生するようした処理になります。
実際に作成したものはこのような形になっています。
次回記事のサンプルプロジェクト。
— よしかた (@yoshikata_game) 2023年4月14日
ぷちコン用に作ったNiagaraミサイルのサンプル。
記事もgithubへのアップもまだ先です。
もう少々お待ちください (´・ω・`) pic.twitter.com/RisukVhzYm
最後に
ここまでだいぶ長かったですが見ていただきありがとうございます。
このブログを見返して思ったのですが、
初心者向けといえるほど基礎的かつ役立つ情報があまりないので、
そういった情報を増やしていけたらと思います。