【Unity】引数つきコルーチンを使って、あるコンポーネントのプロパティを数秒無効にする方法

Unity

スポンサーリンク

引数つきのコルーチン(Coroutin)を使って当たった相手のRigidBodyコンポーネントのuseGravityプロパティを指定した秒数無効にする方法を紹介します。

完成動作

作り方

1.シーンに各オブジェクトを配置

1-1.以下のように床(Cube)を斜めにして、Sphere(赤)が転がっていく先に、Cylinder(青)があるようにします。
流れとしては、RigidbodyコンポーネントをアタッチしたSphere(赤)が転がって、Cylinder(青)に当たると、指定した秒数、Sphere(赤)のRigidbodyコンポーネントのuseGravityプロパティを無効にして、無重力状態にするという感じです。

1-2.Sphere(赤)にRigidbodyコンポーネントをアタッチしておく

2. 2-1.当たった相手のコンポーネントのプロパティを指定した秒数無効にするスクリプトを作成

2-1.Coroutine.csという名前のスクリプトを作成して、以下のコードを記載する。

using System.Collections;
using UnityEngine;

public class Coroutine : MonoBehaviour
{
	/// <summary>
	/// 衝突した時
	/// </summary>
	/// <param name="collision"></param>
	private void OnCollisionEnter(Collision collision)
	{
		// 衝突した相手にPlayerタグが付いているとき
		if (collision.gameObject.tag == "Player")
		{
			// ChangeUseGravityコルーチンをスタートする
			StartCoroutine(ChangeUseGravity(collision.gameObject, 2.0f));
		}
	}

	/// <summary>
	/// RigidbodyコンポーネントのuseGravityプロパティを
	/// 指定した秒数無効にする。
	/// </summary>
	/// <param name="lGameObject">useGravityを無効にしたいGameObject</param>
	/// <param name="seconds">無効にする秒数</param>
	/// <returns></returns>
	IEnumerator ChangeUseGravity(GameObject lGameObject, float seconds)
	{
		// useGravityを無効にする
		lGameObject.GetComponent<Rigidbody>().useGravity = false;

		// 指定された秒数待つ
		yield return new WaitForSeconds(seconds);

		// useGravityを有効にする
		lGameObject.GetComponent<Rigidbody>().useGravity = true;
	}
}

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

3-1.Coroutineスクリプトを相手のコンポーネントのプロパティを無効にさせたいGameObjectにアタッチ(今回はCylinder(青))

4.コンポーネントのプロパティを無効にさせたいGameObjectに"Player"タグを付与

4-1.Sphere(赤)に"Player"タグをつける。

完成

これでゲームをスタートして、Sphere(赤)がCylinder(青)に当たるとSphere(赤)が数秒間無重力状態になって、数秒間経過したら重力に従って落ちます。

Unity

Posted by ton