UE4で弾幕ゲームを作る際に、押さえておきたい Niagara Collision の扱い方。

#はじめに
__Unreal Engine 4__ (以下UE4)での__弾幕__ってどうやるのか、検証した結果をまとめました。
__Niagara初心者__でも分かるように、__手順__を細かめに載せていこうと思います。__[動画での解説](https://youtu.be/wYq2SR63vkM)__もあります。
似たような情報を見かけなかったので、割といろいろな方の参考になるかもしれません。

<iframe width="560" height="315" src="https://www.youtube.com/embed/wYq2SR63vkM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#もくじ
[はじめに](#はじめに)
[1. Niagaraとは](#1-niagaraとは)
[2. 実践！Niagaraパーティクル作成](#2-実践niagaraパーティクル作成)
[3. Niagara コリジョン](#3-niagara-コリジョン)
[4. Niagara 弾幕の作り方。(規則的な飛ばし方）](#4-niagara-弾幕の作り方規則的な飛ばし方)
[5. サンプルデータ](#5-サンプルデータ)
[Niagara参考資料](#niagara参考資料)
[おわりに](#おわりに)

#1. Niagaraとは
##1.1. 概要
Niagaraとは、UE4の新しいパーティクルシステムです。

https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/Niagara/Overview/

- 2017年　4.18頃から公開され、
- 2020年　4.25で正式リリースされた次世代VFXシステムです。

現在UE4には、__Cascade__ と __Niagara__ の二つのパーティクルシステムがあり、
4.25の正式リリース後は、Niagara を推していくということなので、
これからパーティクルを触るような人は、Niagaraを覚えた方が良いかもしれません。

Cascadeで過去に作ったパーティクルは、

https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/Niagara/CascadeToNiagaraConverterPlugin/

Niagaraにコンバートするプラグインがあるので、
過去に作ったり買ったパーティクルなどが、無駄にはならないようになっています。
（実験的機能ということで、まだ全てがコンバート可能という訳ではなさそうです。）


##1.2. 何が凄いのか

Cascadeで、複雑な事をしようとすると、C++で機能を拡張する必要があったものが、
Niagaraでは、ノード形式で機能の追加編集が可能という点が、特に大きな要素になっています。
![qiita_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f61826aa-958a-a676-128b-a3721f066cb1.jpeg)
次に挙げられるのが、エミッター要素の共有ができる点が、Cascadeとの大きな違いとなります。

他にも凄い要素があるようですが、より詳しくは、以下の動画がとても参考になります。

https://youtu.be/jzrXrREsAoo

##1.3. Niagara基本構造

従来の__Cascadeパーティクル（白）__と　__NiagaraSystem（赤）__は、同等の扱いだと思っておいていいです。
![qiita_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/dd993b0a-90df-5ceb-3857-9a1f1ab104bc.jpeg)
FXのNiagaraSystem以外の項目は、凝ったことをする時に使う物だと思っておけばいいです。
![qiita_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8ec0f588-21dc-ba4d-9268-4c31bf51e44f.jpeg)
基本的な機能を使うだけであれば、NiagaraSystemを作れば、Niagaraのパーティクルは作れます。


NiagaraSystem内で、左の青い方が、Niagara Systemで、右のオレンジが、Niagara Emitterです。
![qiita_004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/eef27aeb-a8c5-2921-411a-359ca45fab2a.jpeg)
エミッターは、右クリックから追加でき、
![qiita_005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/757e58b3-3cd7-5b1f-1122-ec2b45306840.jpeg)

- __Templates（テンプレート）__　基本的なパーティクルエミッターが選べます。
- __Parents（親）__　自作エミッターはここに表示されます。
- __Behavior Examples（動作例）__　参考例のエミッターが表示されるので、学習時に確認してみましょう。

エミッターを右クリックから、__「Create Asset From This（これからアセットを作成）」__を選ぶと、エミッターが共有可能な状態でデータが作成されます。
![qiita_006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/46a3ea75-08b0-ebba-59de-d602132f6272.jpeg)
※注意　エミッターの追加方法などが、4.26とは少し変わっているので、お気を付けください。










#2. 実践！Niagaraパーティクル作成
__UE4 4.27.1__ を立ち上げて、__ThirdParsonテンプレート__を選んで開きます。
多くの方が見慣れているところから始めたいと思います。
![qiita_007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f5562356-457e-f12d-b30c-b896652c64e4.jpeg)

:::note warn
※注意　Niagaraは高速に開発が進められている為、バージョンが違うと見た目や項目名などが異なる場合があります。
学習する際は、参考にしている資料と同じバージョンで確認することをお勧めします。
:::


##2.1. Niagara System作成
FXフォルダを作り、その中で、__右クリック__＞__「FX」__＞__「Niagara System」__を選択
![qiita_008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/81197f26-753d-8a69-9c61-b4e3f20a2b63.jpeg)
__New system from selected emitter(s)（選択したエミッタに基づく新しいシステム）__を選択
![qiita_009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/285b6969-dc11-ec69-4569-b2ff3bd19dee.jpeg)
今回は、__Fountain__を選びます。選択は、__ダブルクリック__か__緑のプラスボタン__からエミッターを追加します。
__「Finish（終了）」__を押すとナイアガラシステムが作成されます。
![qiita_010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/0866a922-19e6-cf0c-338c-78e681a689b8.jpeg)
名前を　NS_Test1　にしました。

ダブルクリックをし、開くと
![qiita_011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/dc14335b-e4b5-0d89-178a-0773dcbbe7a9.jpeg)
シンプルな噴水パーティクルが確認できると思います。

確認したら、サードパーソンテンプレートのビューポートに戻り、
作成された　NS_Test1 をビューポートにドラッグすると、噴水パーティクルが、発生します。
![qiita_013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/487b3905-2e1c-0c8f-b1c4-752d0c09d6a1.jpeg)
パーティクルをそのまま置くだけであれば、ナイアガラパーティクルを作成して発生させる工程は、これで完了です。






#3. Niagara コリジョン
今回、弾幕を作るにあたっては、コリジョンの扱いが肝になるので、
パーティクルの細かい制御方法より前に、コリジョンの割り当て方法を先に載せます。

##3.1. コリジョン追加
まず、噴水エミッターの__「Particle Update（パーティクル更新）」__の右の__「＋」__をクリック
![qiita_014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/42e01ba6-0859-00a0-fa33-a7280531a5fe.jpeg)
Collisionを選択すると、赤いビックリマークが出るので、__「Fix issue（問題を修正）」__をクリック。
![qiita_015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/03d86afe-ea6d-171f-c062-925cbb3f5624.jpeg)
これで、ビューポートに戻ってみると、地面に噴水の球がバウンドしていると思います。

赤いビックリマークが何を意味しているのか、気になる方用に翻訳を。
>The module has unmet dependencies.
>The following post-dependency is not met: SolveForcesAndVelocity;
>Move module Collision Before SolveFrocesAndVelocity
>Dismiss the issue without fixing (I know what I'm doing)
>----↓DeepL翻訳----
>このモジュールには、満たされていない依存関係があります。
>以下のポスト依存関係が満たされていません。SolveForcesAndVelocity;
>モジュールCollisionをSolveFrocesAndVelocityの前に移動します。　__「Fix issue（問題を修正）」__
>修正せずに問題を解除する（自分が何をしているかわかっている）__「Dismiss issue（問題を解除する）」__

__SolveForcesAndVelocity__モジュールより上にコリジョンがある必要があるという注意書きで、
__「Fix issue（問題を修正）」__のボタンを押したら自動で順序が変更されたという流れです。

##3.2. コリジョンの衝突通知を行う為に必要な設定

__「Parameters（パラメータ）」__タブの
__「User Exposed（公開されたユーザー）」__システム設定の__「+」__をクリックし　__「Object」__を選択
![qiita_016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/4871efdc-7ddd-0e14-4654-9d2449672dca.jpeg)
作成された、__NewObject__ の名前を変更して、__BPCallback__とします。
![qiita_017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/934b4f38-69b6-2d5f-1d1f-ff738c671e10.jpeg)

次に、パーティクル更新の右にある__「+」__をクリックし、__blue__　と検索して、
![qiita_018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/bfbe9481-b853-ec94-f602-46127f252d02.jpeg)
__「Export Particle Data to Blueprint」__を追加
 
青いビックリマークの注意書きが出てくるので、一応確認しておきます。
>Module Usage Note
>The setup to export particle data is somewhat complex. 
>There is an example asset under the Learn tab of the Epic Games Launcher in the Content Examples project which shows how this works and how the connection is made.
>Dismiss
>----↓DeepL翻訳----
>モジュール使用上の注意
>パーティクル データをエクスポートするためのセットアップは、やや複雑です。
>Epic Games Launcher の [Learn] タブにある [Content Examples] プロジェクトには、この仕組みと接続方法を示すサンプル アセットがあります。
>解除

この機能を理解する為には、[Content Examples](https://www.unrealengine.com/marketplace/ja/learn/content-examples/) を確認してください。という注意書きです。
青いビックリマークを消したい場合は、Dismissを押します。放っておいても構いません。

__Export Particle Data to Blueprint__ を選択した状態で、右に詳細表示された
__Condition To Export Data__ の__右の下三角__をクリックして、__collision__ と検索をかけ、
![qiita_019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/17e43750-fe38-b118-3ee7-b7f55a781cb4.jpeg)
__「OUTPUT（出力）」 「COLLISION」 Collision Valid__ を指定します。

これで、何かが衝突した時、このモジュールが反応するという設定になりました。

反応をどこに送るかの設定が
__「Callback Handler Parameter」__ のタブで、ここに、先ほど作成した、__「BPCallback」__を指定します。
![qiita_020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/962c6a58-d261-14e2-3cb4-4eafce1db5fa.jpeg)
これで、Niagara側の最低限の設定ができました。



##3.3. ActorにNiagaraを呼び出す
コリジョンの衝突の通知を行う為に、__NiagaraSystem__をそのまま置くのではなく、__Actor__を用意します。
__右クリック__から、__「Blueprint Class（ブループリントクラス）」__＞__「Actor」__を選び、__「BP_Niagara_Test1」__ とします。
![qiita_021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f58c3a2d-33c8-a5e2-7697-92cd78b41cec.jpeg)

__BP_Niagara_Test1__を__ダブルクリック__で開き、左上の__「+ Add Component（+ コンポーネントを追加）」__から、__「Niagara Particle System」__を選択
![qiita_022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5d0c0d6e-4c8f-6e93-4fe6-0b218b263b0f.jpeg)

追加された__「Niagara」__を選び、詳細欄の__「Niagara System Asset」__に__「NS_Test1」__を指定します。
![qiita_023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f4c674e4-fe21-85ca-6622-107173201c74.jpeg)

##3.4. コリジョンイベント　ブループリント設定
__イベントグラフ画面__で、__右クリックから検索__をかけて__「Set Niagara Variable (Object)」__のノードを呼び出します。
![qiita_024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/218b1168-6a0a-b9c7-1f08-8bba7603007d.jpeg)
__「Event BeginPlay」__に繋ぎ
__「In Variable Name」__ の欄に　__「BPCallback」__と打ちます。
__「Object」__の項目には、__「Self」__を当てます。
![qiita_025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/67fad1d1-ffef-3d2b-1549-d5ae676e8c16.jpeg)


次に、__「Class Settings（クラス設定）」__を選択した状態で、
__「Interfaces（インターフェース）」__＞__「Implemented Interfaces（実装インターフェース）」__
の__「Add（追加）」__から
__「niagara」__で検索をかけて、__「Niagra Particle Callback Handler」__ を選択します。
![qiita_026.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/67d9954b-eb3c-c705-a1bf-26cb5259b353.jpeg)
そこまでできたら、__コンパイル　保存__　をしてください。


左下の__「Interfaces（インターフェース）」__の欄の、
__「Niagara」__＞__「Receive Particle Data」__を右クリック__「Implement event（イベントを実装）」__を選び
__「Event Receive Particle Data」__ を用意します。
![qiita_027.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/af77bc04-8fc1-6e75-d7eb-439bb44b3120.jpeg)

そこに__Print String__を繋いで、__Hello__ が呼ばれるか確認します。
![qiita_028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/27b6f4b9-73b2-194e-a256-68c950d36e0c.jpeg)
レベル上に、直で置いてある__Niagara System__は、__削除__して、作った__ブループリント__を__ドラッグ__します。
![qiita_029.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/d6052205-e73c-59d4-eab6-6dc563bb448d.jpeg)
__プレイ__をすると、__Hello__が__画面左__に出てくると思います。
これで、Actorに衝突のイベントを送ることが確認できました。



##3.5. プレイヤーにダメージを送る。
デフォルトのコリジョン設定の場合、__World Dynamic__が当たっており、なんでもかんでも衝突判定を取ります。
![qiita_030.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/b1c9bf1d-58e2-379e-9c3d-d653cab28fad.jpeg)
これをプレイヤーにのみ衝突判定をしたいと思います。

###プロジェクト設定　トレースチャンネル追加
__「Project Settings（プロジェクト設定）」__
__「Engine（エンジン）」__＞__「Collision」__＞__「Trace Channels」__ の__「New Trace Channel（新規のトレースチャンネル）」__を選択
__「Name（名前）」__を__「EnemyProjectile」__
__「Default Response（デフォルト応答）」__を__「Ignore」__
にして__「Accept（承認）」__を押します。
![qiita_031.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/d79da0a3-db2a-efe0-d022-72c7a1df4832.jpeg)
新しいトレースチャンネルができたので、これを使用していきます。

###コリジョン　トレースチャンネルを指定
__「ナイアガラ（NS_Test1）」__を開いて__「Collision」__の__「CPU Collision Trace Channel」__に
__「EnemyProjectile」__をセットします。
![qiita_032.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/20b3bc1f-743f-3d8d-69e9-a0ea96dd3408.jpeg)


###プレイヤー側のコリジョン設定
次にプレイヤー側の設定を、__「ThirdPersonCharacter」__を開いて、
![qiita_033.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/2c82edf4-636d-dd86-d6f1-d40150ff28e4.jpeg)

__「Mesh」__の__「Collision Presets（コリジョンプリセット）」__を、__「Custom」__にして、
__「Trace Pesponses（トレース応答）」__の項目の__「EnemyProjectile」__をブロックに変更します。
![qiita_034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/92fc9e73-acbf-d569-238d-d88dcd80ceff.jpeg)
簡易的には、これで、プレイヤーにのみ衝突する状態になっています。

###ダメージ送信処理
あとは、__Niagara__の__Actor__の__ブループリント__で、__Apply Damage__を　__GetPlayerPawn__に送り。
![qiita_035.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/e77751ec-de57-127a-c4cc-39bcd0d18cc1.jpeg)

__プレイヤー側のブループリント__で、__Event AnyDamage__を組むと、ダメージが送られてきます。
![qiita_036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/cf5ad687-9982-317d-a585-e2c6e3371d1a.jpeg)
プレイヤー側のコリジョン判定の基本構造の説明は以上です。


##3.6. 衝突した弾を消したい
現状だと、プレイヤーに弾が当たった後、バウンドして複数回プレイヤーに当たる可能性があります。
衝突したら消えるように設定したいと思います。

__「NS_Test1」__の__「Particle Update（パーティクル更新）」__の右の__「+」__をクリック
__「Kill」__で検索をかけて、__「Kill Particles」__を追加。
![qiita_037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/54441310-5bd7-4684-9a34-14101973756e.jpeg)

__「Kill Particles」__の右の下三角をクリックし、__「Collision」__と検索
__「OUTPUT（出力）」「COLLISION」「Collision Valid」__を選びます。
![qiita_038.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/47fea316-0745-285a-e56a-33d024cd1016.jpeg)
これで、衝突したら、消えるという処理になります。



##3.7. プレイヤー以外にダメージを与えたい。
敵の弾をプレイヤーに当てるだけであれば、__Trace Channel__を指定するだけでもなんとかなりますが、
不特定多数の相手にダメージを与えるような場合、ダメージの送り先が分からない状態になります。
何と衝突したか、Actorのブループリントで再度トレースしたいと思います。

###ナイアガラ　Export Particle Data to Blueprint　設定
まず、__「ナイアガラ（NS_Test1）」__の __「Export Particle Data to Blueprint」__ を選択し、
__Vector to Send(As Struct Position)　「PARTICLES」「PRECIOUS（前）」「Position」__
__Vector To Send(As Struct Velocity)　「PARTICLES」「PRECIOUS（前）」「Velocity」__
__Float To Send(As Struct Size)　「TRANSIENT（一時的）」「CollisionSize」__
を指定します。
![qiita_039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/1ed13534-946a-d5c0-1fa1-8868265de744.jpeg)

###アクターでトレース設定
ナイアガラ用の__「Actor（BP_Niagara_Test1）」__を開いて、
__「Data」__から右に引っ張って__「For Each Loop」__を作り、__「Array Element」__ を__「 Break」__で展開し、
__「Position」__と__「Size」__と__「Velocity」__を使って、__「SphereTraceByChannel」__ にセットします。
![qiita_040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/7c89bd50-9f8c-e3d1-2938-69513bbf6e59.jpeg)
Trace結果の__Hit Actor__を__Apply Damage__に当てることが可能です。
これで、不特定多数の衝突物にダメージを送る処理ができました。

__※注意__　方法論の一つです。より良い方法がありましたら、共有していただけると嬉しいです。


##3.8. 衝突した場所にパーティクルを発生させたい。
衝突エフェクトを出したい場合の設定方法も載せておこうと思います。

###Generate Collision Event
コリジョンが発生したイベントを、別のエミッターに送る時に使います。
![qiita_041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/fbb974a0-61ae-02c4-6a14-826c789ddc9f.jpeg)
このモジュールを追加すると、赤いビックリマークの注意文が出てきます。
Niagara Logをチェックすると

>Before the Particles.ID parameter can be used, the 'Requires persistent IDs' option has to be activated in the emitter properties. Note that this comes with additional memory and CPU costs. -  Fountain, Particle Update Script, 
>----↓DeepL翻訳----
>Particles.IDパラメータを使用するには、エミッターのプロパティで「Requires persistent IDs」オプションを有効にする必要があります。これには追加のメモリとCPUコストがかかることに注意してください。- Fountain, Particle Update Script, 

パーティクルIDを有効にする必要があることと、少し重くなるけどいいかという確認です。

###Requires Parsistent IDs
Requires Parsistent IDs　のチェックを入れると、赤いビックリマークと注意文が消えます。
![qiita_042.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/4bbfbc39-2583-f5e5-2125-04555caa3de0.jpeg)

###新規エミッターを追加
右クリックからエミッターを追加で、Fountainを選びます。
![qiita_043.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/91c8d8de-7190-6338-4a12-a07e87a2fb21.jpeg)
別のエミッターでも構いませんが、知らないエミッターを追加するより混乱が少ないので、これを選びます。

###Event Handler Properties
__イベントハンドラー__の__プラス__を__クリック__すると、プロパティが追加されるので、
__Source__ を __CollisionEvent__
__Spawn Number__ を __30__（衝突時に発生するパーティクルの数）
にします。
![qiita_044.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/9e0c602d-953c-5491-9a64-5b7e61c42402.jpeg)

###Receive Collision Event
もう一度イベントハンドラーの右のプラスをクリックして、collisionと検索。
![qiita_045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/591acee9-0fc9-9790-822d-7870c08ad189.jpeg)
Receive Collision Event を追加します。
これで、衝突が起こった場所にパーティクルが発生するようになりました。

###Spawn Rate を削除
Spawn Rate があると衝突以外の場所にもパーティクルが発生する為、Spawn Rateを削除します。
![qiita_046.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5fbe912d-ca2e-1cbe-d625-dec37fa33f79.jpeg)
画像は、チェックを外しているだけですが、右クリックから削除してもいいです。

###衝突チェック
パーティクルの色を赤くして、衝突後のパーティクルと分かりやすくしています。
![qiita_047.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/32ff76c7-09b6-de92-4724-92d66849ca1c.jpeg)
見た目的には、Velocityの調整や、パーティクルサイズなどの調整が必要だと思いますが、
イベントハンドラーを使った衝突位置にパーティクルを発生させる手順は以上です。

#4. Niagara 弾幕の作り方(規則的な飛ばし方）
新しいNiagaraSystemを作成します。
構造を把握するために、Emptyを選んで、NS_Test2 を作成します。
![qiita_048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/406939cd-b9d8-8256-9937-151c04d6c106.jpeg)

##4.1. パーティクルスポーン設定
###Spawn Burst Instantaneous
Emptyは空のエミッターなので、まずパーティクルを発生させるSpawnモジュールを追加します。
__Spawn Burst Instantaneous__
![qiita_049.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/7f1fa16b-3433-aacb-b672-03d2b7023df9.jpeg)
このモジュールを使うと、最初のフレームで、指定位置に指定数のパーティクルが発生します。

__Spawn Count__を仮に__32__にしておきます。この時点では、エミッターの中央位置に一つ点が見える状態ですが、
32個のパーティクルが重なって表示されています。
![qiita_050.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8851fa95-08f5-c703-3090-61b25f12c093.jpeg)
ここから、規則的な位置にパーティクルを配置します。


##4.2. 規則的にパーティクルを並べる。
Locationモジュールを追加することで、パーティクルの発生位置を調整することができます。
規則的な配列がしやすいモジュールをいくつかピックアップします。
![qiita_051.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/7e93d0eb-4c24-b83a-17e6-660a7c7858c0.jpeg)

###Sphere Location
球状に配列する時に便利。
__Sphere Distribution__ を　__Uniform__　にして　
デフォルトの状態が、正多角形の頂点の位置にパーティクルが発生します。
![qiita_052.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/cd4c23e1-00ec-6c05-2fa4-8c0be4ed168f.jpeg)

__Uniform Spiral Amount__ の値を変えると、配列のパターンを変えることができます。
![qiita_053.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/43448593-eac7-6f4c-ad8a-2fb444f5d71f.jpeg)
他の数値を変えると、もっといろいろなバリエーションが作れます。

###Grid Location
四角いグリッド状に綺麗に配列する時に便利。
![qiita_054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/c6804558-46ae-49c5-93ad-a06035793a51.jpeg)
Grid Locationを追加すると、Spawn Particles in Grid が作られるので、こちらで、パーティクルの数を調整。
Grid Locationの方で、間隔などの調整ができます。

###Torus Location
リング状に配列する時に便利。
![qiita_055.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/653bacf0-e155-6f50-c42b-797f91abbeb4.jpeg)
使い道が多そうなのですが、結構設定いじらないと綺麗に並んでくれないので、
画像を参考に設定をいじってみてください。

###自作モジュールを作るには
各モジュールを、ダブルクリックすると、構造が見ることができるので、
![qiita_056.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/931d00f4-2767-b048-4ce5-d8da8d614e45.jpeg)
やりたいことに近いモジュールの中身を確認して、自分で、モジュールを作成することができます。
![qiita_057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8577bdad-3157-93a6-326a-21fa0035dc21.jpeg)
標準で用意してあるモジュールで、足りないものは、自分で作る事ができます。


##4.3. 規則的にパーティクルを飛ばす。
規則的な配置が済んで、簡単に飛ばす場合は、

###Emitter State
まず__Emitter State__を、__System__ から __Self__に変更します。
__Loop Duration__ を __0.1__にします。（0.1秒ごとにパーティクルが発生するようになります。）
![qiita_058.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/255ef803-3ce3-795e-eb10-c6df2cdca933.jpeg)

### Add Velocity from Point
Add Velocity from Pointを使うと、中心から一定の速度でパーティクルを移動させることができます。
![qiita_059.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5e4239dd-0fde-a0be-7161-7c7c42126862.jpeg)
Add Velocity from Point を追加すると、注意文が出てくるので読みます。

>The module has unmet dependencies.
>The follow post-dependency is not met: SolveForcesVelocity;
>Add new dependency module SoleceForcesAndVelocity           Fix issue
>Add new dependincy module ApplyInitialForces                Fix issue
>Dismiss the  issue without fixing (I know what I'm doing)   Dismiss issue
>----↓DeepL翻訳----
>このモジュールには、満たされていない依存関係があります。
>フォローポストの依存関係が満たされていません。SolveForcesVelocity;
>新しい依存モジュールSoleceForcesAndVelocityの追加　　　　  問題の修正
>新しい依存モジュール ApplyInitialForces の追加　　　　　　　問題の修正
>修正せずに問題を却下する（自分が何をしているかわかっている）　問題の解除

SolveForcesVelocityが必要ですということで、問題を修正するを押すと、
SolveForcesVelocityが自動で作成されます。
Velocity　Strength（速度設定）は、好きな数値で大丈夫です。
![qiita_060.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/afadc2d0-9ea8-8ea8-2c1c-4e09a81277ea.jpeg)
規則的に飛ばす基本は以上です。

### Expression
Expression　という数式を直接打って、制御する方法があり、
モジュールやスクリプトを作成するほどでもないものは、Expressionを活用することで、数字を打つだけでは出来ない挙動が、作成できます。

https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/Blueprints/UserGuide/MathNode/

簡単な__Expression__で、エミッターを回転させたいと思います。
__Torus Location__ の　__Normalized Angle Around Torus Axis__ の右の__下三角__をクリックして、
__New Expression__を選びます。
![qiita_061.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/32af5b23-b27a-1721-8e1e-7d8afb18afc0.jpeg)

試しに `((Emitter.Age)*0.1)` と打ってみます。
![qiita_062.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/600f6b4f-8c07-6068-4a3e-8f36090ac7e2.jpeg)

これだけで、エミッターが回転するようになります。
![qiita_063.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/6810d8c6-0096-8db3-5b6e-5ce3f4e83d75.jpeg)
`(Emitter.Age)`に何かを掛けると、時間に応じて変化のある値を簡単に作れるので、重宝します。

この記事と同時に投稿される動画や、Githubにサンプルプロジェクトを置いておくので、
そちらも確認してみていただければと思います。



機能別サンプルで使われていたExpressionの抜粋　こんな組み方もあるみたい。

```
Sin(Emitter.Age)*56
normalize(((( rand(float3(1.0,1.0,1.0) ))) * 2 ) -1 )
rand(1.5f) + 2.2f
Emitter.InitialPosition + Particles.RandomVector *rand(145.0f)
cross(Particles.RandomVector, float3(0,8,0)) * (float3(0.0f, 0.0f, Emitter.ZOffset) *0.2f) + (-1.0f * normalize(Emitter.InitialPosition - Particles.Position)*20) 
Particles.NormalizedAge < 0.333 ? float4(1,0.1,0.1,1) : Particles.NormalizedAge < 0.575 ? float4(0.1,1,0.1,1) : float4(0.1,0.1,1,1)
Particles.Position + float3(0, 0, ( sin(Engine.Time) * 0.3f ))
(1.0f - abs(Particles.NormalizedAge * 2.0f -1.0f)) * 2.0f
1-Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25)
Particles.Position.z > Emitter.InitialPosition.z - Emitter.ZOffset ? Particles.Position : float3(Particles.Position.x, Particles.Position.y, Emitter.InitialPosition.z -Emitter.ZOffset)
```

この辺、情報共有していけると、より便利な世の中になりそうですね。


#5. サンプルデータ
ナイアガラで弾幕を作る際に参考になると思う要点を、サンプルデータに並べてみました。
![Niagara_Github.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/9a3b4087-d7b3-6f96-4139-9245545ec6b2.gif)
[ダウンロード↓](https://github.com/O-Y-G/NiagaraSample)

https://github.com/O-Y-G/NiagaraSample

中級者以上の方は、データを見るだけで理解できると思いますが、
Niagara初心者の方は、この記事を把握するか、__[動画の解説](https://youtu.be/wYq2SR63vkM)__を見た上で触った方が理解しやすいかなと思います。


#Niagara参考資料
##機能別サンプル（Content Examples）
__Epicランチャー__からラーニングのタブを選んで、機能別サンプルを選んで、プロジェクトを作成すると、
UnrealEngineのさまざまな機能を確認できます。
![qiita_064.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8a6207a2-aabf-71ab-7b09-1c3e5d965e77.jpeg)

https://www.unrealengine.com/marketplace/ja/learn/content-examples/

今回見るべきなのは、__Maps__ の中の　__Niagara__ と __Niagara_Advanced__ の二つです。
![qiita_065.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/fd880562-c27e-a98f-15b0-2b2299af63d7.jpeg)
二つとも自分で確認して、興味があるものの中身を確認していけばいいのですが、
今回関連がある要素を抜粋します。

##Niagara 2.5 Expressions
![qiita_066.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5003f5d6-1432-306d-6326-bf911bb3bc50.jpeg)
Expressionでどういう処理ができるのかを確認できます。

##Niagara_Advenced 2.1 Particle Attribute Reader
![qiita_067.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/e3708289-4d02-4997-22dd-0d1033477abd.jpeg)
リング状に配列する方法は、ここから拝借しました。
また、記事では紹介していませんが、__Particle Attribute Reader__ は、
少し凝った事をする時には、必要になる機能だと思うので、凝ったことをする人は、要チェックです。

##Niagara_Advenced 4.2 Export Particle Data to Blueprint
![qiita_068.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/9c3c05e7-2adc-1d33-0af0-1e6da4f934b5.jpeg)
コリジョン情報を、アクターに送る工程は、こちらがベースになっています。
公式の情報を確認したい場合は、こちらをご確認ください。

他にもいろいろあるので、確認してみましょう。

##花火ナイアガラサンプル（まめお様）

https://papersloth.hatenablog.com/entry/2020/09/13/021609

花火を作る際に参考になると思います。

##参考リンク

- __[公式ドキュメント Niagara ビジュアル エフェクト システム](https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/Niagara/)__

- __[公式YouTube（日本語）Unreal Engine JP](https://www.youtube.com/c/UnrealEngineJP)__
 - [新しいエフェクトツール、Niagaraを楽しもう！ ～Niagara作例のブレイクダウン～](https://youtu.be/jzrXrREsAoo)
 - [もっとNiagaraを楽しもう！～UE4.25での作例と解説～ (UE4 VFX Art Dive)](https://youtu.be/bkZkW-Hblig)
 - [Niagaraの開発背景 | Unreal Engine 5](https://youtu.be/ClTNccf9OcI)

- __[公式YouTube（英語）Unreal Engine](https://www.youtube.com/c/UnrealEngine)__
 - [Advanced Niagara Effects | Inside Unreal](https://youtu.be/31GXFW-MgQk)
 - [Creating next-gen visual effects that think for themselves with Niagara | Unreal Engine 5](https://youtu.be/6fnzUkPDrsI)
 - [Simulating Large Crowds In Niagara | Unreal Engine](https://youtu.be/CqXKSyAPWZY)
 - [Building advanced effects in Niagara | Unreal Engine](https://youtu.be/syVSRDQxrZU)
 - [Building Effects with Niagara and Blueprint | GDC 2019 | Unreal Engine](https://youtu.be/etSfYfIIoSE)
 - [Cascade to Niagara | Live from HQ | Inside Unreal](https://youtu.be/NkK31uQNY28)
 - [Niagara in 4.25 | Inside Unreal](https://youtu.be/tMPwXotnl5I)
 - [An Introduction To Niagara | Feature Highlight | Unreal Engine Livestream](https://youtu.be/s7QpAkzx5eM)
 - [Diving Into Niagara: Intelligent Particle Effects | Unreal Fest Online 2020](https://youtu.be/oX6uiPWXJDY)
 - [Programmable VFX with Unreal Engine's Niagara | GDC 2018 | Unreal Engine](https://youtu.be/mNPYdfRVPtM)
 - [Introduction to Niagara | Unreal Fest Europe 2019 | Unreal Engine](https://youtu.be/2CtBa3zEaYU)
 - [Advanced Niagara | Unreal Fest Europe 2019 | Unreal Engine](https://youtu.be/-UPZuuikYZ0)
 - [The Evolution of Real-Time VFX with Unreal Engine's Niagara | Unreal Fest Online 2020](https://youtu.be/bX6tdCdOEVA)
 - [Introduction to Niagara | Dev Days 2018 | Unreal Engine](https://youtu.be/GIzwxwrM9Mk)
 - [Introduction to the Niagara Visual Effects System | 2018 EDU Summit | Unreal Engine](https://youtu.be/mk3MJOqxT3g)

- [YouTube Nigara UE4検索](https://www.youtube.com/results?search_query=niagara+ue4)
 - [historia Inc. | YouTube | コンテンツサンプルを楽しむ”超”初心者の為のNiagara](https://youtu.be/R-dvkov9cts)
 - [NVIDIA Studio | YouTube | UnrealEngineパート1のナイアガラ入門| NVIDIAスタジオセッション](https://youtu.be/1ce7amarWKI)
 - [Niagara でサクッとMorph Effectを作ろう！| 第8回 UE4 勉強会 in 大阪](https://youtu.be/Pl4IyfMvt_E)
 - [【UE4】Niagaraで雨を作る【逆引きUE】](https://youtu.be/6sLdjSdusFk)
 - [【UE4ゲーム制作講座】Niagaraを使って火の玉エフェクトを作ろう！](https://youtu.be/h00ZD9wS3gE)
 - [初心者向け、ナイアガラのクイックスタートチュートリアル　ＵＥ４](https://youtu.be/RGwD5RI9eb8)

- [Google Niagara 検索](https://www.google.com/search?q=niagara)
- [Twitter Niagara 検索](https://twitter.com/search?q=niagara&src=typed_query)

書き加えた方が良いリンクがありましたら、コメントいただけると助かります。

- この記事関連リンクとしては、
 - [YouTube【15分で解説】UE4で弾幕ゲームを作る際に、押さえておきたい Niagara Collision の扱い方。](https://youtu.be/wYq2SR63vkM)
 - [YouTube【English】 How to use Niagara Collision when creating a bullet hell game in UE4.](https://youtu.be/9x5EpHmfFQo)
 - [GitHub NiagaraSample](https://github.com/O-Y-G/NiagaraSample)






#おわりに
弾幕ゲームの作り方の質問を受けて、
Niagara使えば、簡単に弾幕作れるんじゃないかと、軽い気持ちで調べたんですが、
コリジョン周りの情報が少なく困りました。

また、旧バージョンで情報共有していただけている部分などは、
使えなくなっているものや、名称が変わっているものなどがあり、
Niagaraの情報を探るのは、想定以上に大変でした。

そんなこんなで、Niagara初心者でも分かるようにしようと、つらつら書いていったら、
ずいぶん縦に長い記事になってしまいました。

良い感じに情報共有をして、ある程度の事は、誰でも簡単に出来るようにしていきたいですね。

結構時間をかけて調べたものの、
今のところ、弾幕ゲームを作る予定が無いのが、悲しいところです。

https://twitter.com/O_Y_G/status/1459111227599335426?s=20

ツイッターのフォローとか、[チャンネル登録](https://youtu.be/wYq2SR63vkM)とかしてもらえると励みになります。