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

2021年7月17日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軸方向に加える風の力
    [SerializeField]
    private float windX = 0f;

	// y軸方向に加える風の力
	[SerializeField]
	private float windY = 0f;

	// z軸方向に加える風の力
	[SerializeField]
	private float windZ = 0f;

	/// <summary>
	/// Is Triggerにチェックが入ったコライダーの範囲内に入っている間に繰り返し実行される関数
	/// </summary>
	/// <param name="other"></param>
	private void OnTriggerStay(Collider other)
	{
		// 当たった相手のrigidbodyコンポーネントを取得
		Rigidbody otherRigidbody = other.gameObject.GetComponent<Rigidbody>();

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

}

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

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

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

完成

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

Unity

Posted by ton