使用AddForce在与敌人接触后击退玩家

本文关键字:玩家 接触 敌人 AddForce 使用 | 更新日期: 2023-09-27 18:00:43

我正在制作我的第一款Unity游戏。它仍然是原型,无论如何都会非常简单,由一个立方体作为玩家和球体作为敌人组成。

我正试图用AddForce编写一个代码,当玩家与敌人接触时,将其朝着敌人相反的方向打一段相当长的弧线,但我对如何使用AddForce仍然有着原始的理解,似乎根本无法向任何方向施加力。玩家只是穿过敌人。

这是我唯一能一起报废的东西,但显然不够:

if (other.gameObject.tag == "Enemy") 
        {
            playerDead = true;
            Rigidbody rigidbody = other.GetComponent<Rigidbody> ();
            rigidbody.AddForce (transform.forward * 100);
        }

如果有帮助的话,我可以发布一张截图。

使用AddForce在与敌人接触后击退玩家

根据两个单元的位置,使用更为定制的方向,而不是transform.forward

public float speed = 100;
if (other.gameObject.tag == "Enemy") 
{
    playerDead = true;
    Vector3 direction = (transform.position - other.transform.position).normalized;
    other.GetComponent<Rigidbody>().AddForce (direction * speed);
}

编辑:您必须确保刚体位于调用OnCollisionEnter函数的游戏对象上,它不能仅位于碰撞中涉及的任何对象上。

我不能发表评论,所以我必须做出回答。

你显然设置了isTrigger。确保关闭isTrigger,否则你的玩家将穿过敌人的对撞机。

[SerializeField]
private float speed = 100;
private bool playerDead;
OnCollisionEnter(Collision collision)
{

   if(collision.gameObject.tag == "Enemy")
   {
   playerDead = true;
   Vector3 direction = (transform.position - collision.transform.position).normalized;
   collision.GetComponent<Rigidbody>().AddForce (direction * speed,0,0);
   //AddForce is a vector3 apparently and requires (x,y,z)
   // Also note that I'm getting errors with the "collision.GetComponent<>"
  // You're going to want to remove "collision"
 // I think the smarter approach maybe to declare a public Rigidbody variable ( Up Top )
    [SerializeField]
    private Rigidbody playerRidg;
    playerRidg = GetComponent<Rigidbody>().AddForce(direction * speed,0,0);
   }
}

我的解决方案使用coroutine,它切换一个bool"尖峰":

玩家碰撞:

private void OnTriggerEnter2D(Collider2D collision){
if (collision.gameObject.tag == "Spike" )
        {           
          
            StartCoroutine(Knockback());
            
        }
}

推论:

IEnumerator Knockback()
    {
        spikes = true;
        yield return new WaitForSecondsRealtime(0.3f);
        spikes = false;
    }

只要尖刺是真的,玩家就会被移动

void FixedUpdate()
    {
        
        if (spikes ==true)
        {
            Vector2 NewPosition = new Vector2(10.0f, 10.0f);
            moveCharacter(NewPosition);
        }
        
    }