VRChatプレイヤーによるParticle System解説 ～Shape Module編～

:::note warn
この記事はUnity 2019.4.29f1の記事です
:::
[Emission Module編](https://qiita.com/abcde_kind/items/63e8c262df7774f12a41) <<  ここ  >> [Velocity over Lifetime編](https://qiita.com/abcde_kind/items/22d8d266302b08b852e1)
# はじめに
この記事は**ちょっとParticle System触れるようになったけどまだまだ知らないパラメーターだらけで抵抗感がある人向け**にじゃあ全項目解説しようという記事です。

**パーティクル？シェーダー？憧れるけどよくわかんない…**という人は最近は[VRCUnity勉強会][link-1]などで初歩の初歩から解説してくれる講座などが解説されているのでそこに参加してみたりするといいでしょう。
[link-1]:https://discord.gg/mtvTTyM
その他にこの記事はアドベントカレンダーにしてParticle Systemの記事を増やしてパーティクルへの抵抗感を減らしてやろうという企みもあります。

##Shape Moduleってどこ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/5bee8af1-59d1-17ae-8819-81676bfdc82b.png)
ここのShapeって書いてあるやつ

##本題
###Shape
デフォルト Cone
**パーティクルの発生源の形状を決めるパラメーター**
ここを何にするかによって設定できるパラメーターが変わる
どういうパーティクルを作りたいかで何を選択するか大きく変わる
**以下の解説では同じ項目は省略して説明する**
****
####Sphere,Hemisphere
放出方向 球の中心から外に向かう方向
**球、半球状**
半球は底面にはパーティクルが発生しない
#####Radius
デフォルト 1 (0.0001~3.402823e+38)
単位 m
**球の半径**
#####Radius Thickness
デフォルト 1 (0~1)
**パーティクルの発生する領域の厚み**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/9aac21b7-cef6-5b61-ab17-542420592355.png)
赤と黒の領域がパーティクルの発生する領域で0にすると表面のみから発生するようになる
**他の項目でもこの概念を使うのでこの概念を覚えていたほうが良い**
#####Arc
デフォルト 360 (0~360)
**パーティクルの発生する領域の角度**
実際にパラメーターを操作してみるとわかりやすい
######Mode
デフォルト Random
**領域からどういった順序でパーティクルが発生するか定めるパラメーター**
Loopにすると時計のようにぐるぐる発生点が回る、Ping-Pongにすると半周はLoopのように動きもう半周は反転して動く…を繰り返す
Bursts SpreadにするとEmissionのBurstを使用した際に均等にまばらに散らばるように発生点が散らされる
######Spread
デフォルト 0 (0~1)
単位 割合
0.5にすれば2方向に、0.33にすれば3方向に、0にすれば全方向に**放出方向を分けるパラメーター**
****
####Cone
放出方向 発生面の表面方向、パラメーターによって変更できる
シャワーのような**円柱~円錐形**
#####Angle
デフォルト 25 (0~90)
単位 度
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/0e0c5903-4d0c-df56-0c86-1d2d1eb4d5db.png)
**図のように広がる角度を指定するパラメーター**
#####Emit from:
デフォルト Base
**パーティクルの発生する領域を面からにするか上で指定した領域内からにするか指定するパラメーター**
****
####Donut
放出方向 ドーナツ面に対して外側方向
**ドーナツ状**
所謂トーラス
#####Radius
デフォルト 1 (0~3.402823e+38)
単位 m
**ドーナツの大半径**
#####Donut Radius
デフォルト 0.2 (0.0001~3.402823e+38)
単位 m
**ドーナツの小半径**
****
####Box
放出方向 正面のみ
**立方体**
#####Emit from:
デフォルト Volume
**立方体のどこからパーティクルが発生するか決めるパラメーター**
Volumeが全体、Shellが面、Edgeが辺から発生する
ShellとEdgeのみ選択するとBox Thicknessという項目が出てくる
#####Box Thickness
デフォルト (0,0,0)
**パーティクルの発生点の偏りを決めるパラメーター**
0~1の間で設定でき、X軸の値が大きくなればX方向に、Y軸が大きくなればY方向にと発生点をずらす
****
####Mesh
放出方向 指定したメッシュの法線[^3]方向
**自分で好きなメッシュを指定できる**
#####Type
デフォルト Vertex
**指定したメッシュのどこからパーティクルが発生するか決めるパラメーター**
Vertex(頂点)、Edge(辺)、Triangle(三角面)の3つから選択する
Vertex、Edgeを選択した時にModeが、Edgeを選択した時にSpreadとSpeedが設定できる
######Mode
デフォルト Random
**どういった順番で指定した場所からパーティクルが発生するか決めるパラメーター**
Loop、Ping-Pongの動作は前述だが基準となる順番は頂点インデックス[^1]の順番になる
######Spread
デフォルト 0 (0~1)
**パーティクルの発生点がどれだけ散らばってるか決めるパラメーター**
数字を0.03とかにすると一部の箇所からのみ出るようになって1にすると1箇所からしか出ない、もちろん0だと全部から満遍なく出る
######Speed
デフォルト 1 (-3.402823e+38~3.402823e+38)
LoopやPing-Pongにするとわかりやすいが上の**パーティクルの発生順のサイクルの速度にかかる倍率**
数値を大きくすると高速で発生点が変わる
#####Mesh
**メッシュを指定するとこ**
#####Single Material
デフォルト 無効(0)
マテリアルスロットが複数あるマテリアルの内**特定のマテリアルが割り当てられてる所をパーティクルの発生点にするパラメーター**
0から始まっているが一番目のマテリアルスロットは0[^2]
#####Use Mesh Colors
デフォルト ON
**メッシュの頂点カラーをパーティクルに適用するかどうか決めるパラメーター**
#####Normal Offset
デフォルト 0 (-3.402823e+38~3.402823e+38)
単位 m
**発生点を法線方向にどれだけずらすか決めるパラメーター**
****
####Mesh Renderer
放出方向 指定したメッシュの法線方向
**別オブジェクトのMesh Rendererを指定できる**
上のMeshと違う点はそれぞれが独立してるためアニメーションとかで動かしたりの自由が効くこと
****
####Skinned Mesh Renderer
放出方向 指定したメッシュの法線方向
**別オブジェクトのSkinned Mesh Rendererを指定できる**
Skinned Mesh Rendererはボーンが通ってたりシェイプキーが使えるメッシュ、アバター本体とかがそう
****
####Sprite
放出方向 正面のみ
**Spriteに自動で設定された三角面**
#####Sprite
**任意のSpriteを指定するとこ**
****
####Sprite Renderer
放出方向 正面のみ
**別オブジェクトのSprite Rendererを指定できる**
****
####Circle
放出方向 円の中心から外に向かう方向(ガイドの平面に沿って)
**円状**
****
####Edge
放出方向 真上
**辺1本**
****
####Rectangle
放出方向 正面のみ
**四角**
Rectangle(長方形)と書いてあるが正方形
****
###Texture
デフォルト なし
平面、立体のShapeを指定した時に**パーティクルの色に特定のテクスチャを指定できる**
テクスチャを指定するとClip Channel, Clip Threshold, Color affects Particles, Alpha affects Particles, Bilinear Filteringが設定できる
####Clip Channel
デフォルト Alpha
特定のチャンネルの色をカットするための設定
**カットするチャンネル(RGBA)を指定する**
####Clip Threshold
デフォルト 0 (0~1)
**カットする閾値を設定する**
####Color affects Particles
デフォルト ON
**テクスチャの色がパーティクルに影響するか**
####Alpha affects Particles
デフォルト ON
**テクスチャの透明度がパーティクルに影響するか**
####Bilinear Filtering
**パーティクルにテクスチャで色を付けるときの補完をどうするかどうか**
###Position, Rotation, Scale
**Shape全体の形にかかるTransform**
下のこれを押すと簡単に設定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/0ece4202-46e8-dc0b-c630-00d2a07e607a.png)
###Align To Direction
デフォルト OFF
**パーティクルの向きを強制的にパーティクルの放出方向に向けるパラメーター**
###Randomize Direction
デフォルト 0 (0~1)
**<font color="Red">パーティクルの発生した瞬間の向き</font>をどれくらいランダムにするか決めるパラメーター**
###Spherize Direction
デフォルト 0(0~1)
**<font color="Red">パーティクルの放出方向</font>をどれくらいランダムにするか決めるパラメーター**
###Randomize Position
デフォルト 0 (0~3.402823e+38)
単位 m
**<font color="Red">パーティクルの発生点</font>をどれくらいランダムにするか決めるパラメーター**
#おわり
というわけでShape Moduleの解説でした
長かった
次はVelocity over Lifetime Moduleの解説です
****
[Emission Module編](https://qiita.com/abcde_kind/items/63e8c262df7774f12a41) <<  ここ  >> [Velocity over Lifetime編](https://qiita.com/abcde_kind/items/22d8d266302b08b852e1)
[^1]: 全ての頂点にはそれぞれを区別する頂点インデックスという値が設定されてるらしい、正直難しくてそれ以上はよくわからない
[^2]: 0番目から数えることはUnityに限らずよくある
[^3]: よくわかんなかったらいいです