ノックバック
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 54/63。
ノックバックとは、あなたに当たったものから弾き飛ばされることです。ぶつけた側から当たったものへ向かう線に沿って、一度だけ衝撃を与えます。このバンパーにぶつかったものはすべてノックバックします。
[SerializeField] private float power = 8f;
void OnCollisionEnter(Collision collision)
{
Vector3 away = collision.transform.position - transform.position;
away.y = 0f;
collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}collision.transform.position - transform.positionは、バンパーからぶつかってきたものへ向かうベクトルです。蹴りが水平になるように、そのyは0に設定されます。また、normalizedによって、2つの中心間の距離にかかわらず同じ大きさになります。ForceMode.Impulseは一度だけ加える衝撃です。速度を質量で割ったpowerの分だけ一度に変化させるので、質量2のボールは質量1のボールの半分の速さで飛んでいきます。デフォルトのForceMode.Forceは各ステップで加えることを想定しており、1ステップ分、つまり50分の1の力を与えます。
速度が上書きされない間だけ、蹴りの効果は続きます。FixedUpdateで毎ステップ、矢印キーからrb.linearVelocityを設定するプレイヤーは、次のステップでノックバックの効果を失います。そのため、このようなスクリプトでは、ヒット後しばらく速度を変更しないようにするか、力を使ってプレイヤーを動かす必要があります。
チャレンジ
中級プレイヤーは衝撃波を放つことができます。Player に Shockwave スクリプトを追加します。Inspector で radius(4)、power(6)、lift(2)を設定します。Player スクリプトは準備済みです。矢印キーでプレイヤーを移動できます。
- Space キーを押したとき、
Physics.OverlapSphereを使って、プレイヤーからradius以内にあるすべてのコライダーを見つけます。 - プレイヤー自身を除き、Rigidbody を持つものにはそれぞれインパルスを加えます。地面に沿ってプレイヤーから真っすぐ離れる方向に
powerを、上方向にliftを加えます。 - 地面など、Rigidbody を持たないコライダーには何もしません。
Play を押し、木箱の間を歩いて Space キーを押したら、Check を押します。
自分で試してみよう
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// Space を押したとき: radius 内のすべての Rigidbody をプレイヤーから遠ざける
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。