当たるとプレイヤーを跳ね返すブロック(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”の値を変える(単位は”秒”)

コメント