(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

範囲内に入ったパーティクルに重力等の力を加えて動きを変えるParticle System Force Field【Unity】【Particle System】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.4.0f1


はじめに

今回はUnity2018.3から追加されたParticle System Force Fieldを試してみた感じの記事です!



Particle System Force Fieldは名前の通り、

範囲内に入ったパーティクルに重力等の力を加えて動きを変えるもので、

Effector2Dのパーティクル版と考えると分かりやすいかもしれません。



イメージとしては以下のような感じ。(パーティクルの設定は色以外全て同じ)


f:id:kan_kikuchi:20190605063824g:plain


Particle Systemの設定

まず、Particle Systemはデフォルトの状態ではParticle System Force Fieldの影響は受けないので、

影響は受けるようにExternalForcesを有効にする必要があります。


f:id:kan_kikuchi:20190604064848p:plain


ちなみにMultiplierが影響受ける度合いで、

数値を増やすほどより強く影響を受けるようになります。


f:id:kan_kikuchi:20190604065506p:plain


また、Influence Filterで影響を受ける対象の設定方法を決められます。

Layer Maskだと指定したLayerのものにだけ影響を受けるようになり、


f:id:kan_kikuchi:20190604065409p:plain
f:id:kan_kikuchi:20190604065417p:plain


Listだと、Listに追加したものにだけ影響を受けるようになり、


f:id:kan_kikuchi:20190604065424p:plain


Layer Mask And Listだと、どちらか一方、もしくは両方に該当したものに影響を受けるようになります。


Particle System Force Fieldの作り方

次にParticle System Force Fieldの作り方ですが、

Particle Systemなどと同様に、Createメニューから生成出来ます。


f:id:kan_kikuchi:20190604064451p:plain


なお、生成したParticle System Force Fieldを選択するとSceneビュー上に影響範囲が表示されます。


f:id:kan_kikuchi:20190605064403g:plain


Particle System Force Fieldの設定項目

Particle System Force Fieldには色々な設定項目があるので、この項ではそれらを説明してきます。


Shape : 影響範囲の設定

Shapeでは影響範囲の設定が行えます。


f:id:kan_kikuchi:20190604073447p:plain


形はSehere(球)、Hemisphere(半球)、Cylinder(円柱)、Box(箱)の4種類から選べ、

f:id:kan_kikuchi:20190604072925p:plain f:id:kan_kikuchi:20190604072936p:plain f:id:kan_kikuchi:20190604072947p:plain f:id:kan_kikuchi:20190604072957p:plain


StartRangeで影響範囲の開始地点(これより内側は力が作用しない)、

EndRangeで影響範囲の終了地点(これより外側は力が作用しない)、

そしてLengthで影響範囲の高さを設定できます。


f:id:kan_kikuchi:20190604073512p:plain


Direction : パーティクルに加える力のベクトル

Directionではパーティクルに加える力のベクトルを設定できます。


f:id:kan_kikuchi:20190605050649g:plain


Gravity : パーティクルを引っ張る力

Gravityではパーティクルを引っ張る力(重力)を設定できます。


Strengthで引っ張る(マイナスなら押し出す)力の強さ

Focusで重力が発生する場の割合(?)を設定できます。


f:id:kan_kikuchi:20190605050546g:plain


Rotation : パーティクルを回転させる力

Rotationではパーティクルを回転させる力を設定できます。


Speedで回転の速度

Attractionでパーティクルがどれだけ影響されるかの割合

Randomnessでランダム性を設定できます。


f:id:kan_kikuchi:20190605052545g:plain


Drag : パーティクルの動きを止める力

Dragではパーティクルの動きを止める力を設定できます。


Strengthで止める力の大きさを設定できます。


f:id:kan_kikuchi:20190605053651g:plain


なお、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();

f:id:kan_kikuchi:20190605062350g:plain


さらに、この生成した3DテクスチャをVectorFieldを設定してみると、以下のようになりました。


f:id:kan_kikuchi:20190605062709g:plain