【Unity】【Aseet】Exploderを使ってみた

メッシュを爆発させるアセットで有名なExploderを買ってしまいました。
Humble Unity Bundle祭りで、お財布のヒモが緩んだ隙の出来事でした。

 

f:id:s44511173:20191003122825g:plain

f:id:s44511173:20191003123013g:plain


VRイライラ棒の記事を次回から・・・と言っておきながら
まさかのアセットネタです。だって書きたかったんだもん。
しかも紹介するのが、Bundleの中身じゃないという。ナニコレ珍百景

 

Exploderとは

assetstore.unity.com

explodeとは爆発させるという意味でして。
その名の通り、メッシュを爆発させてくれるアセット(35ドル)になります。
めっちゃ楽しい。いろんなものを爆発させたくなります。危険思想ですな。

使い方

まず、Exploderを購入&ダウンロード&インポートします。
消費税はキッチリ10%取られました。9月のうちに買っておくんだった・・・。

 

f:id:s44511173:20191003124617p:plain

次に、ヒエラルキー上にExploderのPrefabを配置します。
Assets>Exploder>Prefabsに入っています。

 

f:id:s44511173:20191003125846p:plain

破壊したいオブジェクト(青)と破壊したくないオブジェクト(赤)を並べます。
スフィアと衝突したら破壊する仕組みです。
破壊したオブジェクトには「Exploder」タグをセットします。
これはアセットをインポートすると自動で追加されます。
こんなコードを書いて、スフィアにアタッチします。

[SerializeField]
private ExploderObject exploder; //インスペクタからセットしておく
private Rigidbody rigid; //キーボード操作用
private readonly string ExplodalTag = "Exploder"; //爆発させたいオブジェクトのタグ
private readonly string UseObjectTag = "UseObject";// 爆発させたくないオブジェクトのタグ

void Start()
{
    rigid = GetComponent<Rigidbody>();
}

void Update()
{
  //WASDキーで操作
    var x = Input.GetAxis("Horizontal");
    var z = Input.GetAxis("Vertical");

    rigid.AddForce(x*2, 0, z*2);
}

private void OnCollisionEnter(Collision collision) {
    if (collision.gameObject.tag == ExplodalTag) {
        // ぶつかった対象を爆発させる
        exploder.ExplodeObject(collision.gameObject);
        Debug.Log(collision.gameObject.name);
    }
    // 移動停止
    rigid.velocity = Vector3.zero;
}

これで動かした結果がこちら。

f:id:s44511173:20191003131640g:plain

・・・なんか、へん。

1回目の爆発は余韻が、破片の飛び散りがあっという間に終わってしまい
2回目の爆発はぶつかってからのタイムラグがありすぎる。
ナニコレ珍百景、アゲイン。

原因を探ってみる

OnCollisionEnterで出力しているデバッグログを見てみると、こんな感じになっていました。

f:id:s44511173:20191003133023p:plain

おふ。なにこのfragment_xxってヤツら。こんなの 配置してないんだけど!?
ナニコレ珍百景、リターンズ。

おそらくExploderが破壊したメッシュたちの破片にぶつかっていて
そいつらをも破壊しようとしているんだと思われます。なんて律儀な。

設定値を確認してみる

それって、まず最初にやることなんじゃないの・・・?

f:id:s44511173:20191003133538p:plain

まずは爆発関連から。

  • 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・・・破片の形状を選択します。

f:id:s44511173:20191003140247p:plain

次に、破片関連。

  • 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・・・破片にパーティクルを付けることができます。

以上を踏まえて

やりたいことを整理しましょう。

  1. スフィアに青いキューブがぶつかったら、その青キューブのみを爆破。
  2. スフィアに赤いキューブがぶつかったら、赤いキューブの半径2m範囲で爆破。
  3. 破片は爆破対象ではない。したがって、スフィアがぶつかっても爆発しない。
  4. 破片は床に散らばる。3秒後にフェードアウト。

設定値はコチラ!

f:id:s44511173:20191003150201p:plain

f:id:s44511173:20191003150007p:plain

 

コードは、OnCollisionEnterをこんな感じにしてみました。

private void OnCollisionEnter(Collision collision) {
    if(collision.gameObject.tag == ExplodalTag) {
        // ぶつかった対象を爆発させる
        exploder.ExplodeObject(collision.gameObject);
    } else if(collision.gameObject.tag == UseObjectTag) {
        // 自身が爆発して、周囲を巻き込む
        exploder.ExplodeRadius();
    }
    // 移動停止
    rigid.velocity = Vector3.zero;
}

直接オブジェクトを爆破したい時はExplodeObjectを、周囲を巻き込みたい時はExplodeRadiusを使います。
巻き込まれて爆破したいオブジェクトには、タグにExploderを設定しておきましょう。

実行結果

f:id:s44511173:20191003150325g:plain

やりたかったことが、できました!!

結論

  1. 爆発させたい時は、Exploderアセットを使うと便利
  2. 初期値のままだと、思うように動いてくれないので注意
  3. 面倒臭がらず、まずは取説を読もう
  4. これでVRイライラ棒で失敗した時に・・・クククッ

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑