2017-04-02 41 views
0

何かがプレーヤー、多分敵やスパイクなどに当たったとき、私は彼を敵の反対方向にノックバックしてもらいたい。Unity 2Dトップダウンゲームでプレーヤーをノックする

public void ChangeHealth(float healthToAdd, Vector2 objectPosition) // Change the players health, objectPosition = enemies position or something else 
    { 
     if (healthToAdd < 0) // incoming damage 
     { 
      // ... other stuff 

      Knockback(objectPosition); 
     } 

     // ... other stuff 
    } 

    void Knockback(Vector2 objectPosition) // Knockback routine 
    { 
     Vector2 knockbackPosition = new Vector2(,); // calculation is missing here! Calculate the new position by the knockback direction 

     rigid.MovePosition(Vector2.MoveTowards(playerPos, knockbackPosition, 2 * Time.deltaTime)); // the knock back 
    } 

    private void Update() // !! TEST !! 
    { 
     if (Input.GetKeyDown(KeyCode.E)) // TEST routine 
     { 
      ChangeHealth(-7, new Vector2(10,10)); // decrease players health by 7 and knock him back 
     } 
    } 

をそして、何が不足しています:

は、私はすでに得たので、私はこの絵のような計算を探しています

Vector2 knockbackPosition = new Vector2(,); 

表示されます。

enter image description here

答えて

2
Vector2 knockbackPosition = 
    transform.position + (transform.position - objectPosition).normalized *a 

なぜ読まなければならないのか理解してください。

3点あります:E、P、K(敵は、プレイヤー、ノックバックは)

そして、もう一つのスカラー数:


(この値が大きいほど、より多くのノックバックは、あなたが持っているでしょう)

​​

は、2点間の距離にベクトルを展開します:あなたの写真から今

(K-P) = (P-E)*a

Kの位置を計算:

K = P + (P-E)*a

一つの問題はしかしあります。 (Rotemのおかげで)この公式は次のようになります。

あなたはもっと近い相手からより大きなノックバックを期待できます。

私たちはノックバックは、元の依存関係を削除

を掛ける前にベクトルを正規化するにはPとE.

間の距離に依存したくありません

だから我々は.normalizedではなく、その元のベクトルの(PE)のちょうど方向を使用するために追加

+0

現在の方法は、ノックバックベクトルの長さが2人のプレーヤー*と*の間の距離に依存するということです。これは対比的に直感的です。なぜなら、もしあなたがもっと近い相手からより大きなノックバックを期待しているからです。距離の依存関係を取り除くには、 'a 'を乗算する前に差分ベクトルを正規化します。 – Rotem

+0

ありがとう@Rotem私はほとんどそれを逃した。 – Bijan

+0

これはかなりうまくいった、ありがとう! :) – Question3r

関連する問題