【Unity】プレイヤーを跳ね返すブロック(GameObject)を作る

Unity

スポンサーリンク

当たるとプレイヤーを跳ね返すブロック(GameObject)を作る方法を紹介します。
コルーチンも使用します。

完成動作

作り方は以下から。

プレイヤーを跳ね返すブロック(GameObject)を作成

1.例としてCubeを設置します。名前はBouncePlayerにします。※わかりやすいようにMaterialで赤色を付けています。

プレイヤーが当たったら音が出る跳ね返るスクリプトを作成

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

using UnityEngine;

// Rigidbodyがアタッチされていない場合はアタッチする
[RequireComponent(typeof(Rigidbody))]
public class BouncePlayer : MonoBehaviour
{
	[SerializeField]
	[Tooltip("跳ね返すときの速さ")]
	private float bounceSpeed = 30.0f;

	[SerializeField]
	[Tooltip("跳ね返す単位ベクトルにかける倍数")]
	private float bounceVectorMultiple = 2f;

	/// <summary>
	/// 衝突した時
	/// </summary>
	/// <param name="collision"></param>
	private void OnCollisionEnter(Collision collision)
	{
		// 当たった相手に"Player"タグが付いている場合
		if (collision.gameObject.tag == "Player")
		{
			// 衝突した面の、接触した点における法線ベクトルを取得
			Vector3 normal = collision.contacts[0].normal;
			// 衝突した速度ベクトルを単位ベクトルにする
			Vector3 velocity = collision.rigidbody.velocity.normalized;
			// x,z方向に対して逆向きの法線ベクトルを取得
			velocity += new Vector3(-normal.x * bounceVectorMultiple, 0f, -normal.z * bounceVectorMultiple);
			// 取得した法線ベクトルに跳ね返す速さをかけて、跳ね返す
			collision.rigidbody.AddForce(velocity * bounceSpeed, ForceMode.Impulse);
		}
	}
}

スクリプトをプレイヤーを跳ね返させたいGameObjectにアタッチ

1.BouncePlayer.cs跳ね返させたいGameObject(BouncePlayerオブジェクト)にアタッチする。

プレイヤーを跳ね返させたいGameObjectに衝突した時に一時的にキー入力を不可にするスクリプトを作成

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

using System.Collections;
using UnityChan;
using UnityEngine;

public class DisableKeyInput : MonoBehaviour
{
	[SerializeField]
	[Tooltip("キー入力を無効にする秒数")]
	private float disableKeyInputSeconds = 1.0f;

	/// <summary>
	/// 衝突した時
	/// </summary>
	/// <param name="collision"></param>
	private void OnCollisionEnter(Collision collision)
	{
		// 当たった相手に"Bounce"タグが付いている場合
		if (collision.gameObject.tag == "Bounce")
		{
			// コルーチンを開始
			StartCoroutine("DisableKeyInputCoroutine");
		}
	}

	private IEnumerator DisableKeyInputCoroutine()
	{
		// unitychanの移動用のキー入力のコンポーネントを無効にする(有効のままだと跳ね返らない)
		// ※ 独自の移動用のキー入力コンポーネントを使用している場合はそれを無効にする
		this.gameObject.GetComponent<UnityChanControlScriptWithRgidBody>().enabled = false;
		// アニメーターを無効にする(跳ね返された時にアニメーターは動き続けて違和感があるため)
		this.gameObject.GetComponent<Animator>().enabled = false;

		// 指定した秒数待つ
		yield return new WaitForSeconds(disableKeyInputSeconds);

		// キー入力のコンポーネントを有効に戻す
		this.gameObject.GetComponent<UnityChanControlScriptWithRgidBody>().enabled = true;
		// アニメーターを有効に戻す
		this.gameObject.GetComponent<Animator>().enabled = true;
	}
}

スクリプトをプレイヤーアタッチ

プレイヤーを跳ね返させたいGameObjectのTagに"Bounce"を設定

1.プレイヤーを跳ね返させたいGameObject(BouncePlayerオブジェクト)のTagに"Bounce"を設定
※Tagの一覧にBounceはデフォルトでないので、"Add Tag"から作成する

1.DisableKeyInput.csをプレイヤー(ここではunitychanオブジェクト)にアタッチする。

プレイヤーオブジェクトのTagに"Player"を設定

1.プレイヤーオブジェクト(今回はunitychan)のTagに"Player"を設定

完成

これでプレイヤーを跳ね返させたいGameObject(BouncePlayerオブジェクト)にプレイヤーがぶつかると、跳ね返る。

補足

1.跳ね返る力を変えたい場合

BouncePlayerオブジェクトの以下の"Bounce Speed"や"Bounce Vector Multiple"の数値を変更する。

2.跳ね返った時のプレイヤーのキー入力無効の時間を変えたい場合

unitychanオブジェクトの以下の"Disable Key Input Seconds"の値を変える(単位は"秒")

Unity

Posted by ton