【Unity】疑似的な風を作って、風でGameObjectが動いているように見せかける方法

Unity

スポンサーリンク

GameObjectが風に押されて動くような動作をさせたいと思ったが、なかなかいい方法がなかった。

結局は、風が発生していると思わせる空間を用意して、その空間に入ったGameObjectにRigidBodyのAddForceで力を加えて、あたかも風で押されているように見せかける方法しか思いつかなかった。

完成動作

※わかりやすく風が発生していると見せかけるように、パーティクルを使って葉っぱが風に飛ばされているようにした。
このパーティクルは今回の趣旨とは関係ないので、以下で作り方は載せてないです。

作り方

風で動かしたいGameObjectを作成

1.風で動かしたいGameObjectにRigidBodyをアタッチ
今回は例としてSphereにした。

風を発生させる空間(GameObject)を作成

1.空のGameObjectを作成

2.作成した空のGameObjectの名前を"Wind Space"に変更

3."Wind Space"に"Box Collider"を追加

4."Box Collider"の範囲をいい感じにする。※この範囲が疑似的な風の力を受ける範囲

緑の枠が"Box Collider"の範囲

5."Box Collider"の"Is Trigger"にチェックを入れる。
※ここにチェックを入れないと、他のGameObjectが"Box Collider"の範囲内に入れず、はじかれてしまう。

疑似的に風のように見せるスクリプトを作成

1.WindMove.csという名前のスクリプトを作成して、以下のコードを記載する。
※"OnTriggerStay"関数を使うことが肝

using UnityEngine;

public class WindMove : MonoBehaviour
{
	// x軸方向に加える風の力
	public float windX = 0f;
	// y軸方向に加える風の力
	public float windY = 0f;
	// z軸方向に加える風の力
	public float windZ = 0f;

	/// <summary>
	/// トリガーの範囲に入っている間ずっと実行される
	/// </summary>
	/// <param name="other"></param>
	private void OnTriggerStay(Collider other)
	{
		// 当たった相手のrigidbodyコンポーネントを取得
		Rigidbody otherRigidbody = other.GetComponent<Rigidbody>();

		// rigidbodyがnullではない場合(相手のGameObjectにrigidbodyが付いている場合)
		if (otherRigidbody != null)
		{
			// 相手のrigidbodyに力を加える
			otherRigidbody.AddForce(windX, windY, windZ, ForceMode.Force);
		}
	}
}

スクリプトを疑似的な風にアタッチ

1.WindMove.csを"Wind Space"にアタッチ

2."Wind X(Y,Z)"を適宜、風で飛ばしたい方向に値を変える。

完成

これでゲームを開始すると、"Wind Space"の"Box Collider"の中にいる他のGameObjectは風に押されているかのように動く。

スポンサーリンク

Unity

Posted by ton