i-school - 敵の攻撃に合わせてプレイヤーをノックバックさせる
 プレイヤーが敵から攻撃を受けた際に、ノックバック(敵の攻撃位置と反対方向、後方へ吹き飛ばされる)処理を実装していきます。


ノックバック 動画
https://gyazo.com/729f0ee19bf3e781f4cf433dd1b107e8



 新しく学習する内容になります。

・2点間の位置情報から距離と方向を算出する
・Vector3.normalized(正規化処理。速度ベクトルを算出する)
・Rigidbody.AddForceメソッドのForceMode



 設計方法としましては、プレイヤーの位置情報を、現在の位置からみて、敵の攻撃が発生した位置と反対の方向へと移動させるようにして、ノックバックを演出します。


<2点間の位置情報から距離と方向を算出する>


 このとき必要になる情報が、プレイヤーと敵との「方向」です。プレイヤーと敵とはぞれぞれ位置情報をTransform.positionとして保有していますが
どちらがどの方向を向いている、という情報はありません。そのためまずは、この「方向」を計算によって算出する必要があります。

Vector3 distination = プレイヤーの位置情報 - 敵の攻撃の位置情報;

 この計算式を使用することでプレイヤーと敵との「距離」が差分として算出されます。このとき一緒に「方向」の情報も取得できます。



 プレイヤーをノックバックで移動させる距離については、敵とプレイヤーの位置関係に関係なく一定量にしたいので、算出されたdistination変数には正規化処理を行います。
その上で、設定しているKnockbackPower変数(ノックバックさせる力)を掛け合わせて、ノックバックを発生させます。



 PlayerControllerスクリプトのOnTriggerEnterメソッドを修正していきます。なお追加する処理のみを記述していますので
ご自分のメソッドを参考に、適宜な位置にこの処理を追記してください。


PlayerController.cs

Rigidboby rb;                  // Startメソッドなどで変数には値を代入済とする

public float knockBackPower;   // ノックバックさせる力

private void OnTriggerEnter(Collider other)
{
    rb.velocity = Vector3.zero;

    // 自分の位置と接触してきたオブジェクトの位置とを計算して、距離と方向を出して正規化(速度ベクトルを算出)
    Vector3 distination = (transform.position - other.transform.position).normalized;
           
    rb.AddForce(distination * knockBackPower, ForceMode.VelocityChange);
    }
}


<Vector3.normalized(正規化処理。速度ベクトルを算出する)>


 正規化処理です。速度ベクトルを算出します。

 この処理を行わないと、遠距離からの敵の攻撃を受けた場合に、離れている距離が遠いほどノックバックする量が増えてしまいます。
正規化することによって、値は 0 、あるいは 1 という速度ベクトルに、距離と方向の情報は保ったままで変換されます。

    // 自分の位置と接触してきたオブジェクトの位置とを計算して、距離と方向を出して正規化(速度ベクトルを算出)
    Vector3 distination = (transform.position - other.transform.position).normalized;


 正規化された値を使用してAddForceメソッドを行うことによって、常に一定量のノックバックを発生させることができます。


<Rigidbody.AddForceメソッドのForceMode>


 AddForceメソッドの第2引数には、力をどのようにかけるかForceModeとして設定することができます。設定しない場合には ForceMode.Force に設定されています。
今回は ForceMode.VelocityChange という設定を行い、質量に関係なく(無視して)、瞬間的な力を加えるという、物理演算を行う処理を行っています。

    rb.AddForce(distination * knockBackPower, ForceMode.VelocityChange);


参考記事
Unity公式スクリプトAPI
ForceMode
https://docs.unity3d.com/ScriptReference/ForceMode...
Unity使い方ガイド様
リジッドボディに力を加える方法
https://unity-guide.moon-bear.com/rigidbody-addfor...