当某些东西击中玩家,可能是敌人或尖刺等时,我希望他在敌人的反方向上被击倒。
所以我已经得到了:
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( , );
我正在寻找这张图片显示的计算:
答案 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)的方向而不是原始向量