(この記事の使用環境: Unity5.4.2f2 Personal、Windows10


前回記事の続きです。
前回記事の時点では爆発に巻き込まれた骸骨さんが無反応でしたが、今回は爆発をくらって死に、吹っ飛ぶようにします。
全画面キャプチャ 20170110 222430

こんな感じ。プレイヤーが紫色のスイッチ板(=起爆スイッチ)を踏むと骸骨さんを閉じ込めた室内で爆発が起こり(ここまで前回と同じ)、骸骨さんは爆発を食らって死に、吹っ飛びます。


では今回の解説。

まずは爆発エフェクトのほうから。爆発エフェクトを構成するParticleSystemのうちのひとつ(「Shower」)のインスペクタで、Collisionの下の「Send Collision Message」にチェックを入れます。
BlogPaint

次に、爆発で吹っ飛ぶ骸骨さん側のスクリプトのほう(該当箇所のみ)。Send Collision Messageを有効にしたパーティクルとの衝突判定をOnParticleCollisionで拾います。

    // --- パーティクルと衝突したら吹っ飛ぶ ----------------------------------------------------------
    private void OnParticleCollision (GameObject other)
    {
        Debug.Log ("爆発をくらわせた!");

        if (_state != eState.Dead)                      // 死んでいないなら、まずは死ぬ
        {
            _currentlife = 0;
            nav.speed = 0f;
            nav.Stop ();
            anim.SetTrigger ("Died");
            anim.speed = 5f;
            _state = eState.Dead;
        }

        rb.AddForce (Random.onUnitSphere * 10000f);      // 爆風で吹っ飛ぶ処理
    }


爆発エフェクトにあたって、もしまだ死んでいなければ一連の死に処理を行い、爆風を受けるためにRigidbodyのIsKinematicをfalseにし(つまり物理演算で動くようにし)、爆風の力を加えています。
今回は単純化のため、爆風の力を骸骨さん側のスクリプトの中に直接書き入れています。力の加えられる方向はRandom.onUnitSphereを使ってランダムにしてみました。爆発の火花の小片が当たるたびにこの力が加えられます。


骸骨さんに付けているRigidbodyはIsKinematic = true(つまり物理演算無効) をデフォ値にしておき、爆死して爆風を受ける直前にIsKinematic = false(つまり物理演算有効)にしています。骸骨さんは生存時はNavMeshAgentで動いているため、このようにして物理演算と同時に働くのを極力避けるようにしています。
爆死した後、床を無駄に滑ったり回ったりしないよう、DragとAngular Dragには適当な値を設定しておきます(動作確認しながら調整します)。
全画面キャプチャ 20170110 234513

本当はもっと骸骨さんがボロ雑巾のように四肢を投げ出し宙を舞うようにしたかったのですが、今の自分のスキルでは実現できませんでした。
(追記: こちらの記事で実現できました)

今回は以上です。