在Unity 2D TopDown游戏中击退玩家

时间:2017-04-02 13:17:49

标签: c# unity3d

当某些东西击中玩家,可能是敌人或尖刺等时,我希望他在敌人的反方向上被击倒。

所以我已经得到了:

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

1 个答案:

答案 0 :(得分:2)

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

要理解为什么它必须通读。

有三点:E,P,K(Enemy,Player,Knockback)

一个标量数字:a(这个数值越大,你的回击就越多)

现在从你的照片中:

PK = EP*a

将向量扩展到两点之间的距离:

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

计算K的位置:

K = P + (P-E)*a

但是有一个问题。 (感谢Rotem)使用这个公式:

  

你会期待更接近对手的更大回击。

我们不希望击退取决于P和E之间的距离。

  

要消除对前者的依赖性,请在乘以

之前对矢量进行标准化

所以我们添加.normalized只使用(P-E)的方向而不是原始向量