【问题标题】:Knocking back the Player in a Unity 2D TopDown Game在 Unity 2D 自上而下游戏中击退玩家
【发布时间】:2017-04-02 13:17:48
【问题描述】:

当有东西击中玩家时,可能是敌人或尖刺等,我希望他被击退到敌人的相反方向。

所以我已经得到了什么:

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( , );

我正在寻找像这张图片显示的计算:

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:
    Vector2 knockbackPosition = 
        transform.position + (transform.position - objectPosition).normalized *a
    

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

    共有三点:E,P,K(敌人、玩家、击退)

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


    现在看你的照片:

    PK = EP*a

    将向量展开为两点之间的距离:

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

    计算K的位置:

    K = P + (P-E)*a

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

    你会期望距离较近的对手有更大的击退。

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

    要消除对前者的依赖,请在乘以 a 之前对向量进行归一化

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

    【讨论】:

    • 您目前的方式是,击退向量的长度取决于两个玩家之间的距离变量a。这是违反直觉的,因为如果有的话,您会期望 更接近 的对手会产生更大的击退。要消除对距离的依赖,请在乘以 a 之前对差异向量进行归一化。
    • 谢谢@Rotem 我差点错过了。
    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多