2022-01-20

【ナイアガラ超基礎 #10】ビームをはどうやって作られるか【Unreal Engine】

ナイアガラの基本エフェクトの中に入っているStatic Beamを紐解いてビームの基本を理解する。

Article Image

ビームって何?

ビームを例で見ていく。

まずStatic Beamを追加したナイアガラシステムを作る。

static beam

※選択画面にDynamic Beamというのもある。こちらは上記にUpdate Beamモジュールが増えただけ。このモジュールは難解なのでひとまずスキップ。

再生してみると...

デフォルトのビームを再生

うん、ビームだ(?)

これが表示されてゆっくり消えていくだけ。

動いたりもしたい。

が、基本はここに詰まっている。

ビームのメリット

ゲームを作らないのであまり詳しくないのだが、恐らくビームのメリットは終点を明示的に指定できることなのではないだろうか。

適当な方向へ飛んでいってしまうパーティクルと違い、敵にビームを当てるような動作で座標コントロールが可能でプログラムしやすい。

ビームは少しクセがある

ビームを作る時に使うモジュールは球を飛ばす時とはちょっと挙動が違うのでじっくり理解する必要がある。

というわけで今回も「各モジュールが何をしているか」ということにフォーカスして解説する。

レンダラはRibbon Renderer

ビームなので当然レンダラはRibbon Rendererである。

Ribbon Renderer

※実はSprite Rendererでもちゃんとドットが描画される。

レンダラやリボンレンダラがわからない場合は次の記事:【ナイアガラ超基礎 #8】レンダラ基礎+リボンレンダラーの使い方【Unreal Engine】 | 謎の技術研究部

Spawn Burst Instantaneousを使う

ビーム系を作る時は必ずSpawn Burst Instantaneousを使う。

Spawn Burst Instantaneous

なんで?というのには理由があって「時間差で生み出されたパーティクルは別のビーム」という挙動らしく「まったく同時に生成されたパーティクルのみ線で結ぶ」というのがビームだからだ。

ちょっと解釈が難しいかもしれないが、逆に言えばSpawn Burst Instantaneousを何回かに分けてやれば、複数のビームをつなげること無く分ける事ができる。

複数のビーム

※一つのエミッタで複数のビームを打った例。Spawn Burst Instantaneousが発生する度に新しいビームとして別々に線が結ばれる

ビーム用のLocationのようなものを作る

これまでのSprite Rendererの場合Spawnする位置をLocationモジュールで決めていたが、ビームのときだけなぜか特殊なやり方でロケーション(のようなもの)を定義する。

※ロケーションについては過去の記事を参照:【ナイアガラ超基礎 #7】Locationモジュールとは【UE5】 | 謎の技術研究部

次の2つを必ずセットで使う必要がある。

  • Beam Emitter Setup
  • Spawn Beam

順に解説する。

Beam Emitter Setup

エミッタの更新にBeam Emitter Setupを入れる。

Beam Emitter Setup

※位置はSpawn Burst Instantaneousの下になっても良い。

設定

Beam Emitter Setup設定

  • Beam Start: ビームのスタート位置。細かい設定はどういうわけかダイナミックインプットしか使えない(Make Vector,Random Vector等)
  • Absolute ~: これをチェックしていると絶対値になる。ゲームに配置して動かしたときに常に一定の座標に向かっていくイメージ。
  • Beam End: ビームの終点。長さなどはここで調節する。
  • Use Beam Tangents: ビームを捻じ曲げる。難しいので詳しくは割愛。直感的に試すと面白い。

Use Beam Tangents

Use Beam Tangentsをいじった例

とにかくここで重要なのは ビームがどこに着地するかをBeam Endに設定しているという点。

かならずこの設定を確認しよう。

Spawn Beam

Beam Emitter Setupだけではビームの発生位置は確定しておらず、パーティクルのスポーンにSpawn Beamを入れて初めてビームが描画される。

Beam Emitter Setup

なんとこちらはモジュールを挿すだけでOK。設定は必要ない。

ただしSpawn Beamはパーティクルのスポーンに入れるということを間違えないように。

よくわからん

恐らく裏で動いてるコーディングの兼ね合いでこのような構造になっていると思うが、こういうものだと覚えるほかない。

基本的にはここまでの解説でビームは完成しており、描画はされるはず。

ここからは外観を定義していくモジュールを解説する。

Beam Width

パーティクルのスポーンにBeam Widthというものを追加する。

こちらがその名の通りビームの幅を決定するもの。

Beam Width

設定はBeam WidthBeam Twist Amountの2つだけ。

Beam Widthの設定

Beam Widthにビームの帯の太さを入れれば良い。

システムが用意しているBeamエミッタから作成した場合はここにカーブのダイナミックインプットが入っており、頭と尻尾が細くなるようになっている。

先細り

Beam Twist

Beam Twistの値を見る感じ「ビームをねじるもの」っぽいイメージがあるがここの数字をいじってもビームがピクピクするだけで特に変化がないようにみえる。

これは実際にはねじっているのだが「全てのパーティクルが同じ角度ねじられている」ので、ただ全体が回転しているだけの結果になってしまうため。

ここは初心者向けではないのでわからなければスキップでよいが、次のダイナミックインプットを組み合わせるとパーティクルごとに角度に差ができてねじりが表現できる。

Beam Twistにダイナミックインプット

Beam Twistによるねじり成功

Return Normalized Exec Indexはパーティクルに振られた番号を0~1に正規化して返すモジュール。

これを乗算することで後ろのパーティクルにいくほど角度が付くというわけ。

ビームを何本も打ちたい

エミッタ1個でビームを何本も撃ちたい場合にSpawn Burst InstantaneousSpawn Timeを弄っても、なぜか表示しなくなるだけで意味不明になる初心者は多いと思う。

例えばSpawn Time2を入れた場合は「最初の2秒間は描画しないでね」という設定なので注意だ。

Spawn Time

Loop Durationで設定する

ビームを何本も撃ちたいと言う時はEmitter StateLoop Durationを調整しよう。

Emitter State

Loop Durationの設定

ただ、このままだと同じ位置に描画されるだけなので、好みの方法でビームをずらそう。

例1

上記の設定で1つのエミッタで複数のビームを発射する例を作る。

Beam Emitter SetupBeam EndSine, Cosineを設定した例。

反時計に回る

Period1からちょっとずらすことで花びらが重ならないように回転する。

例2

上の設定に加えていつものVortex Forceを入れた例。Gravity Forceはおまけ

picture 10

これは悪い例です

正直上の例は単一のビームエミッタを使ってサクッと見栄えが良いもの...で作ったのでビームのメリットが活かせておらず、あまり良い例ではない。

もっと複雑なモジュール+複数のエミッタを重ねてターゲットにスパっと飛んでいく面白いビームを各自つくってみてほしい。

以上

今回はビームを紹介したが、ビーム系を作る時は必ずこの方法でなければいけないわけではない。

この方法は「終点を簡単に設定できる」というメリットを活かすため(だと思う)

軌跡をもっと複雑にしたい場合などでは普通にパーティクルをリボンで繋ぐだけのほうが良いかもしれない。

ちょっとモジュールの種類にクセがあるので完全に覚えなくても気になったらここに返ってきてもらえたら幸いである。

このタイプのエミッタを使うと雷エフェクトが簡単に作れるが、そちらはまた別の記事で。



この記事をシェア


謎の技術研究部 (謎技研)