今回はUnityのVFXのKillブロックとColliderブロックを使ったサンプルを作ってみます。
Killブロックは指定する領域にパーティクルが衝突した時にパーティクルを消滅させるブロックで、Colliderブロックは指定する領域にパーティクルが衝突するようにします。
VFXのブロックについては
を参照してください。
今回作成したKillブロックを使ったサンプルは以下のようになります。
パーティクルの表示にメッシュとベースカラーマップを指定していますが、今回使用した剣は以下の記事で作成した剣
ベースカラーに指定したUVMapは以下の記事で作成したテクスチャです。
設定するメッシュとベースカラーは上記の記事で作成した剣を使用する必要はなくご自由に設定してみてください。
Colliderブロックを使ったサンプルは以下のようになります。
エフェクトを作る前の準備
VFXでエフェクトを作成する前の準備は
の記事に書いていますので、設定をしてVFXのテンプレートファイル名をMyVFX2(名前はご自由にお付けください)としておきます。
VFXのテンプレートファイルにデフォルトで作成されているコンテキストは全部選択し削除しておきます(コンテキストと流れを自分で作成します)。
作成したVFXのテンプレートファイルをヒエラルキー上にドラッグ&ドロップしてTransformのPositionのXを0、Yを1、Zを0とします。
それ以外のTransformはデフォルト設定のままです。
剣が飛び出し地面と接触したら消えるエフェクトの作成
まずは剣が飛び出した後に重力で落下し地面と接触したら消えるエフェクトを作成していきます。
Spawnコンテキストの作成
まずはVFXウインドウの何もない所でSpaceキーを押しContext→Spawnを選択します。
Spawnコンテキストを選択した状態でSpaceキーを押してSpawn→Constant Spawn Rateを選択し、Rateに100を設定します。
これで1秒間に100のパーティクルが生成されることになります。
Initializeコンテキストの作成
次は生成したパーティクルの初期化をするInitializeコンテキストの作成をします。
最大パーティクル量Capacityに100を設定します。
Set Velocity Randomブロックの設定
次にInitializeコンテキストを選択した状態でSpaceキーを押してAttribute→Set→Set Velocityを選択します。
インスペクタのRanbomをPer Componentにするとグラフ上でMinとMaxの指定が出来るようになり、この間の数値をランダムに設定出来るようになります。
MinのXを-1、Yを5、Zを-1にし、MaxのXを1、Yを10、Zを1に設定します。
Set Velocity Randomブロックはパーティクルの速度にMinとMaxの間のランダム値を設定出来ます。
Set Lifetime
Initializeコンテキストを選択した状態でSpaceキーを押しAttribute→Set→Set Lifetimeを選択します。
Lifetimeに5を入力します。
Set Lifetimeブロックはパーティクルの生存期間をLifetimeに設定出来ます(単位は秒)。
Set Size
Initializeコンテキストを選択した状態でSpaceキーを押しAttribute→Set→Set Sizeを選択します。
Sizeは1にします。
Set Sizeブロックはパーティクルのサイズを指定します。
ここまで出来たらSpawnコンテキストのSpawn EventからドラッグしてInitializeコンテキストに繋げます。
現時点では
上のようになります。
Updateコンテキストの作成
グラフ上の何もない所でSpaceキーを押しContext→Updateを選択します。
Updateコンテキストはマイフレーム実行するコンテキストです。
Gravity
Updateコンテキストを選択した状態でSpaceキーを押しForce→Gravityを選択します。
Gravityブロックはパーティクルに重力を働かせます。
重力加速度は自由に設定出来ますが、今回の場合はデフォルトの設定のままにしておきます。
Kill
Updateコンテキストを選択した状態でSpaceキーを押しKill→Kill(AABox)を選択します。
Kill(AABox)はパーティクルが衝突した時にパーティクルを消滅させる領域を設定するブロックです。
BoxでCenterとSizeを指定して領域を設定します。
今回はヒエラルキー上にCubeを作りPositionをXYZ共に0、ScaleをXは10、Yを1、Zを10として地面にしているので、Kill(AABox)のCenterとSizeを調整してCubeとサイズが合うように調整してください。
今回はCenterのXYZが0、-1、0、SizeのXYZが10、1、10としています。
上のように地面として使っているCubeとKillのサイズを合わせます。
これは地面と接触した時にパーティクルが消滅しているように見せる為にサイズを合わせましたが、位置やサイズを合わせないでも消したい領域の位置とサイズにしても問題ありません。
Add Angle.XYZ
Udpateコンテキストを選択した状態でSpaceキーを押しAttribute→Set→Add Angleを選択します。
Add Angleブロックはパーティクルの角度を足していくブロックです。
Angleに指定した角度分をパーティクルの角度に足していきます。
今回は現在のパーティクルの速度を取得しその分の角度を足していく事にします。
次にVFXのグラフ上の何もない所でSpaceキーを押し、Operator→Attribute→Get Attribute : velocityを選択します。
Get Attribute : velocityブロックはパーティクルの現在の速度を取得出来ます。
Get Attribute : velocityのvelocityからドラッグしAdd Angle.XYZに接続します。
ここまで出来たらInitializeコンテキストのParticleからドラッグしUpdateコンテキストに接続します。
ここまでのUpdateコンテキストは以下のようになります。
本当は剣が360度周りに飛び出して放射状に綺麗に動いて剣先が地面と接触するように作りたかったんですが、頭が働かなくて出来ませんでした。(´Д`)
Lit Mesh Outputコンテキストの作成
最後にパーティクル表示のコンテキストであるLit Mesh Outputコンテキストを作成します。
グラフ上の何もない所でSpaceキーを押し、Context→Lit Mesh Outputを選択します。
Meshに表示するメッシュ、Base Colorにメッシュに表示するベースカラーとなるテクスチャを設定します。
UpdateコンテキストのParticleからドラッグしLit Mesh Outputに接続します。
これで剣が飛び出して地面と接触したら消えるパーティクルのサンプルが完成しました。
Killブロックで指定した領域とパーティクルの発生位置が接触してしまっている場合は発生してすぐにパーティクルが消えてしまう為、パーティクルの発生位置とKillブロックの領域が重ならないように調整してください。
パーティクルの発生位置が変更出来ない!?という方はLit Mesh OutputをWorldに設定してしまっている可能性もあります。
Localが表示されるようにしてください。
切り替え方法はグラフ上でLocalとWorldの部分を押すかLit Mesh Outputを選択した状態でインスペクタのSpaceから変更出来ます。
LocalとWorldを切り替えるだけでパーティクルがうまく生成されなくなることがあったので、パーティクルが生成されている方は切り替えない方がいいかもしれません。
球がコライダと衝突するエフェクトの作成
Killブロックのサンプルが出来たので、次はColliderを使ったサンプルを作成していきます。
Killブロックのサンプルで作ったものを改造して作成します。
Lit Mesh Outputコンテキストの変更
まずはLit Mesh OutputのMeshをSphereにし、Base Color MapにPackage→Visual Effect Graph→TexturesのDefaultParticleを設定します。
Lit Mesh Outputコンテキストから変更した理由は単純に見た目が徐々に変わる様を確認しやすいからです。
Initializeコンテキストの変更
次はInitializeコンテキストのSet SizeブロックのSizeを0.5にします。
Updateコンテキストの変更
次にUpdateコンテキストを選択した状態でSpaceキーを押しCollision→Collider(Sphere)を選択します。
Collider(Sphere)のModeをInverted、CenterのYを3、Radiusを3にします。
ModeをInverted(反転)にするとSphere(球)の表面を反転させ通常だと球の外側を衝突判定としますが、球の内部が表面となり球内部で衝突判定されます。
Kill(AABox)ブロックのチェックボックスのチェックを外し無効にします。
これで飛び出したパーティクルの弾がSphere(球)の中に留まるようになります。
UpdateコンテキストのColliderブロックを選択した状態でシーンビューを見ると、
上のようにColliderの領域内にパーティクルが衝突して留まるのを確認出来ます。