この記事でのバージョン
Unity 2018.4.0f1
はじめに
今回はUnity2018.3から追加されたParticle System Force Fieldを試してみた感じの記事です!
Particle System Force Fieldは名前の通り、
範囲内に入ったパーティクルに重力等の力を加えて動きを変えるもので、
Effector2Dのパーティクル版と考えると分かりやすいかもしれません。
イメージとしては以下のような感じ。(パーティクルの設定は色以外全て同じ)
![]() |
Particle Systemの設定
まず、Particle Systemはデフォルトの状態ではParticle System Force Fieldの影響は受けないので、
影響は受けるようにExternalForcesを有効にする必要があります。
![]() |
ちなみにMultiplierが影響受ける度合いで、
数値を増やすほどより強く影響を受けるようになります。
![]() |
また、Influence Filterで影響を受ける対象の設定方法を決められます。
Layer Maskだと指定したLayerのものにだけ影響を受けるようになり、
![]() |
![]() |
Listだと、Listに追加したものにだけ影響を受けるようになり、
![]() |
Layer Mask And Listだと、どちらか一方、もしくは両方に該当したものに影響を受けるようになります。
Particle System Force Fieldの作り方
次にParticle System Force Fieldの作り方ですが、
Particle Systemなどと同様に、Createメニューから生成出来ます。
![]() |
なお、生成したParticle System Force Fieldを選択するとSceneビュー上に影響範囲が表示されます。
![]() |
Particle System Force Fieldの設定項目
Particle System Force Fieldには色々な設定項目があるので、この項ではそれらを説明してきます。
Shape : 影響範囲の設定
Shapeでは影響範囲の設定が行えます。
![]() |
形はSehere(球)、Hemisphere(半球)、Cylinder(円柱)、Box(箱)の4種類から選べ、
![]() |
![]() |
![]() |
![]() |
StartRangeで影響範囲の開始地点(これより内側は力が作用しない)、
EndRangeで影響範囲の終了地点(これより外側は力が作用しない)、
そしてLengthで影響範囲の高さを設定できます。
![]() |
Direction : パーティクルに加える力のベクトル
Directionではパーティクルに加える力のベクトルを設定できます。
![]() |
Gravity : パーティクルを引っ張る力
Gravityではパーティクルを引っ張る力(重力)を設定できます。
Strengthで引っ張る(マイナスなら押し出す)力の強さ、
Focusで重力が発生する場の割合(?)を設定できます。
![]() |
Rotation : パーティクルを回転させる力
Rotationではパーティクルを回転させる力を設定できます。
Speedで回転の速度、
Attractionでパーティクルがどれだけ影響されるかの割合、
Randomnessでランダム性を設定できます。
![]() |
Drag : パーティクルの動きを止める力
Dragではパーティクルの動きを止める力を設定できます。
Strengthで止める力の大きさを設定できます。
![]() |
なお、multiplyDragByParticleSizeでパーティクルが大きいほど止める力が大きくなり、
multiplyDragByParticleVelocityでパーティクルが速いほど止める力が大きくなります。
VectorField : 3Dテクスチャで指定した力を加える
VectorFieldでは3Dテクスチャで指定した力を加える事ができます。
正直、使い方が良く分かってない機能です。
そもそも3Dテクスチャとはなんぞやという話ですが、公式のマニュアルには以下のようにありました。
3D テクスチャはスクリプトからのみ作成できます。以下のスニペットは、X、Y、Z の各軸が赤、緑、青の色の値に対応する3D テクスチャを作成します。
名前の通り3Dのテクスチャで、
試しに上記のコードで生成したやつを.assetで保存してみたら、以下のような感じになりました。
texture = CreateTexture3D (256); AssetDatabase.CreateAsset (texture, "Assets/Texture3D.asset"); AssetDatabase.Refresh();
![]() |
さらに、この生成した3DテクスチャをVectorFieldを設定してみると、以下のようになりました。
![]() |