[Unity] Rigidbodyが風を受けるようにする

前回の記事で空気抵抗を独自に実装する方法を紹介しました。
今回はこの応用として風に煽られてオブジェクトが移動する動作を実現する方法を紹介したいと思います。

・風オブジェクトの実装
フィールド上に風を発生させるスクリプトを実装し、これをゲームオブジェクトにアタッチして風オブジェクトとします。
この時、局所的に風を発生させることを考慮してコライダーに接触するオブジェクトに対して風力を加えます。
そのため、風オブジェクトにはコライダーもアタッチしておきます。
風力を与える対象のオブジェクトはRigidbodyがアタッチされているものとします。

風を発生させるスクリプトは以下のようになります。

using UnityEngine;
using System.Collections;

public class Wind : MonoBehaviour {
    public float coefficient;   // 空気抵抗係数
    public Vector3 velocity;    // 風速

	void OnTriggerStay(Collider col) {
        if ( col.rigidbody == null ) {
            return;
        }

        // 相対速度計算
        var relativeVelocity = velocity - col.rigidbody.velocity;

	    // 空気抵抗を与える
        col.rigidbody.AddForce(coefficient * relativeVelocity);
	}
}

風オブジェクトの作成手順は下記の通りです。

 1.新規ゲームオブジェクト作成

 2.Rigidbodyをアタッチ・設定

 3.コライダーをアタッチ・設定、Is Triggerにチェックを入れる

 4.スクリプトをアタッチ

 5.空気抵抗係数(Coefficient)、風速(Velocity)の設定

Coefficient=3、Velocity=(0,5,5)と設定すれば、以下のようにオブジェクトが風力を受けて前方上に飛ばされるようになります。

wind-demo

風オブジェクトのコライダーはSphereColliderとしてその領域を半透明で表示しています。

今回は風速が固定です。
すなわち常に同じ向き・大きさです。

この風速を放射状に設定すればヘリコプター効果や爆風などを再現できます。
他にも活用できる場面は色々あるのではないかと思います。