Menu
CoddyTech

ノックバック

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を設定するプレイヤーは、次のステップでノックバックの効果を失います。そのため、このようなスクリプトでは、ヒット後しばらく速度を変更しないようにするか、力を使ってプレイヤーを動かす必要があります。

challenge icon

チャレンジ

中級

プレイヤーは衝撃波を放つことができます。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 をプレイヤーから遠ざける
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

物理演算とゲームプレイのすべてのレッスン