2022-02-01

【ナイアガラ】リボンがぐちゃぐちゃになる時【Unreal Engine】

リボンレンダラ使用時に時々思ってたのと違う順番で結ばれる事がある。ひとまずサクッと試せる解決策。

Article Image

リボンレンダラがぐちゃぐちゃになる時

今回はUnreal Engineにて次のようなケースで試せる解決策を紹介する。

Sprite Rendererだと次のようなパーティクルを

Sprite Renderer

Ribbon Rendererに差し替えて次のようにしたい

円状のリボン

※デフォルトのリボンマテリアルは尻尾側の色が自動で薄くなる

でも、普通に作ると...

Ribbon

そうなるんかーい!

desperate

これを解決する策を紹介する。

先に結論

少し長くなるので先に何を使うかだけ書いておく

  • パーティクルのスポーンにスクラッチパッドを使ってRibbonLinkOrderを設定
  • Sample Particle From Other Emitterの場合はParticle ID Sampling=Apply Sampled ID as Ribbon IDに変更

作例の作り方1(読み飛ばしOK)

あくまで再現して確認したい人向けなので、解決策だけ読みたい方はこの項はスキップして良い。

軽く作成の概要を書いておく。

エミッタ1

  • Spawn Burst Instantaneousにてパーティクルを生成するエミッタ
  • Torus Locationにて円状にパーティクルを配置

Torus Locationの設定

Torus Locationの設定

ちょっと解説

  • Handle Radius=0にすると1列の円に
  • DistributionU PositionReturn Normalized Exec Indexを設定しないとパーティクルは重なってしまう

以上で完成。

なぜかRibbon Rendererで描画するとリボンがぐちゃぐちゃになる。

解決策: RibbonLinkOrder

パーティクルのスポーンに新しいスクラッチパッドモジュールを追加

新しいスクラッチモジュール

パーティクルのスポーンに

ダブルクリックしてノードエディタのようなものが出る

すぐできる

この画面に入ると複雑そうで気が引けるが一瞬で終わる。

少し右のMap Setのノードでを押してRibbonLinkOrderをセット。

そこに実行インデックスを挿せば完成。

実行インデックスexecで検索すれば出る。

実行インデックス

Map Set

必ず適用を押すこと

適用

たったこれだけで完成

これで既に次のようになっているはずだ。

円状のリボン

何が起こっている?

実は私もあまり細かいことはわかっていない。

海外のフォーラムを読む感じだとSpawn Burst Instantaneousで生成したリボンはデフォルトで生成順につながらないらしい。

ではこのRibbonLinkOrderとはなにかというとリボンの接続順を明示するパラメータのようだ。

デフォルトではこのパラメータは用意されておらず、上のスクラッチパッドにて「実行インデックス」という名称が示す通りパーティクルの生成順にRibbonLinkOrderを設定している。

作例2

次は少し複雑な例。中級者以上向け。

先ほどと殆どおなじエミッター

モジュール

実行画像

もう一つ別のエミッターを作って、上のパーティクルをスタート地点として外に向かってパーティクルを撃つ。

使うのはSpawn Particles From Other Emitter

Spawn Particles From Other Emitter

Sprite Rendererだと実行結果は次

実行結果

このままのイメージで外側にリボンとして点を結びたい。

では、リボンレンダラに切り替える。

リボンへ切り替え

美しい配列ではあるが、思っていたのと違う。

外に繋ぐ場合(リボンを別々にする場合)はどうすればよいのだろうか。

Ribbon IDを付けるだけ

Sample Particles From Other EmitterParticle ID > Particle ID Sampling

こちらをApply Sampled ID as Ribbon IDに変える。

Apply Sampled ID as Ribbon ID

実行結果

正しい結果

正しくリボンが表現できた。

何が起こっている?2

これはSpawn Particles From Other Emitterで生成されたパーティクルに、それぞれRibbon IDというアトリビュートを付与するという設定。

このときRibbon IDは発生している元のパーティクルのIDと同じ数字が設定される。

※デフォルトのままだとこのアトリビュートは何も設定されない。

つまり1本のリボンにつながっているパーティクルは全て同じRibbon IDというのを持っている。

Ribbon IDが同じモノは一つのリボンにつながるが、違うものはつながらない。

発生源のパーティクルはそれぞれ別のIDを持っているので、そこから発生したパーティクルだけが接続されているということ。

例

※内部の実際の数字はちょっと違う。あくまで例

以上

今回はちょっと理解が難しいが、ひとまず解決策として2つ紹介した。

ただ、リボンがつながらない理由はケースバイケースでこの他にも様々なエラーが考えられる。

上のケースはおそらく最も良くあるケースなのでこの2つは覚えておきたい。



この記事をシェア


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