【Unity】【Aseet】Exploderを使ってみた
メッシュを爆発させるアセットで有名なExploderを買ってしまいました。
Humble Unity Bundle祭りで、お財布のヒモが緩んだ隙の出来事でした。
VRイライラ棒の記事を次回から・・・と言っておきながら
まさかのアセットネタです。だって書きたかったんだもん。
しかも紹介するのが、Bundleの中身じゃないという。ナニコレ珍百景。
Exploderとは
explodeとは爆発させるという意味でして。
その名の通り、メッシュを爆発させてくれるアセット(35ドル)になります。
めっちゃ楽しい。いろんなものを爆発させたくなります。危険思想ですな。
使い方
まず、Exploderを購入&ダウンロード&インポートします。
消費税はキッチリ10%取られました。9月のうちに買っておくんだった・・・。
次に、ヒエラルキー上にExploderのPrefabを配置します。
Assets>Exploder>Prefabsに入っています。
破壊したいオブジェクト(青)と破壊したくないオブジェクト(赤)を並べます。
スフィアと衝突したら破壊する仕組みです。
破壊したオブジェクトには「Exploder」タグをセットします。
これはアセットをインポートすると自動で追加されます。
こんなコードを書いて、スフィアにアタッチします。
これで動かした結果がこちら。
・・・なんか、へん。
1回目の爆発は余韻が、破片の飛び散りがあっという間に終わってしまい
2回目の爆発はぶつかってからのタイムラグがありすぎる。
ナニコレ珍百景、アゲイン。
原因を探ってみる
OnCollisionEnterで出力しているデバッグログを見てみると、こんな感じになっていました。
おふ。なにこのfragment_xxってヤツら。こんなの 配置してないんだけど!?
ナニコレ珍百景、リターンズ。
おそらくExploderが破壊したメッシュたちの破片にぶつかっていて
そいつらをも破壊しようとしているんだと思われます。なんて律儀な。
設定値を確認してみる
それって、まず最初にやることなんじゃないの・・・?
まずは爆発関連から。
- Radius・・・爆発判定の半径。後ほど記述しますが、オブジェクトを爆発させることの他に、自身を爆破して周囲を巻き込むことができます。その巻き込む半径になります。
- Force・・・爆発力
- Target Fragments・・・爆発させた後の破片の数。初期値が100になっていまして、これだとめっちゃ重たくなるw
- Use Force Vector・・・爆破した破片の飛び散る方向をセット(ONにすると、XYZ入力ボックスが出てくる)
- Ignore Tag・・・爆破したいオブジェクトの判定に、タグを使いたくないときにONにします。その場合、爆破したいオブジェクトにはExplodableスクリプトをアタッチする必要があります。
- Explode Self・・・爆破させた後、自身を非アクティブにします。
- Hide Self・・・爆破させた後、自身を非表示にします。
- Delete Original Object・・・爆破したオブジェクトをdeleteします。オフの場合は、非アクティブになります。
- Uniform Distribution・・・デフォルトでは、Exploderの中心から近い位置にあるオブジェクトは、多くの破片になります。遠いオブジェクトは、少ない破片になります。このオプションをオンにすると、オブジェクトの中心からの距離に関係なく、オブジェクトごとに均等にフラグメントの数が作成されます。
- Split Mesh Islands・・・同じメッシュの非接続部分を分離して破片にします。
- Disable Triangulation・・・???
- Use 2D Physics・・・2Dに適応する際、ONにします。
- Use Cube Radius・・・爆破範囲をスフィアではなく、キューブに設定します。
- Multi-Threading・・・使用するスレッド数を設定します(最大3)
- Cutting Plane Angle・・・破片の形状を選択します。
次に、破片関連。
- Pool Size・・・破片オブジェクトはプールされているのですが、その上限数を設定します。TargetFragmentより大きくしないと、例外が発生します。
- Explodable Fragment・・・破片を爆破対象とするかどうか、です。これをオフっておけば、爆破した破片にあたって爆破して、さらにその破片を爆破して・・・っていう永久ループを免れます!!
- Layer・・・破片オブジェクトのレイヤーを設定します。
- Mesh Colliders・・・破片のコライダをメッシュコライダにします。重たいので、非推奨とのこと。
- Disable Colliders・・・オンにすると、破片にコライダが適応されません。
- Max Velocity・・・破片の最大速度を設定します。
- Max Angular Velocity・・・破片の最大角速度を設定します。
- Inherit Parent Physics・・・親オブジェクトの物理プロパティを継承します。
- Mass・・・破片の重量を設定します。
- Use Gravity・・・オンにすると、重力がかかります。
- Angular Velocity・・・破片オブジェクトの角速度を設定します。MaxAngularVecocityで設定した以上にはならないっぽい。(設定自体はできます)
- Random Angular Velocity・・・角速度をランダムにします。オフの場合、自身でセットした値にすべてのオブジェクトが回転します。
- Freeze Position・・・オンにすると、面白いことになりますw
- Freeze Rotation・・・回転しない軸を設定します。
- Material・・・破片のマテリアルを設定します。設定しない場合は、爆破されたオブジェクトのマテリアルが適応されます。
- Fragment Deactivation・・・破片の無効化を設定します。Never/Outside Of Camera/Timeoutから選択します。
- Fragment Particles・・・破片にパーティクルを付けることができます。
以上を踏まえて
やりたいことを整理しましょう。
- スフィアに青いキューブがぶつかったら、その青キューブのみを爆破。
- スフィアに赤いキューブがぶつかったら、赤いキューブの半径2m範囲で爆破。
- 破片は爆破対象ではない。したがって、スフィアがぶつかっても爆発しない。
- 破片は床に散らばる。3秒後にフェードアウト。
設定値はコチラ!
コードは、OnCollisionEnterをこんな感じにしてみました。
直接オブジェクトを爆破したい時はExplodeObjectを、周囲を巻き込みたい時はExplodeRadiusを使います。
巻き込まれて爆破したいオブジェクトには、タグにExploderを設定しておきましょう。
実行結果
やりたかったことが、できました!!
結論
↑↑↑ ぜひ遊んでみてください!↑↑↑