如何根据物体的角度移动物体(二维)?



我正在研究一些统一的细节,最终我陷入了死胡同。首先,我想知道,是否有该功能,但是如何根据物体正在观察的角度增加物体的速度。请你用例子来演示,因为到目前为止我的想法很沉闷。我尝试使用数学来执行此功能(可能是一个坏主意(,因为我很想知道这种情况在数学实践中是如何工作的,并开发了一些关于它的理论:

首先我想,在90 度角下,一举,只有Y轴增加,所以X 轴保持在 0。因此,要找出给定角度下 X 和 Y 的确切变化,您所要做的就是找到角度割线并增加它,还是在另一个点?可能我的想法是错误的,我是三角学的"新手",但我想知道我错了什么,如果我错了,思考什么是正确的。

如果我说错了很多话,请告诉我,因为我知道我需要学习更多:)

下面是我创建的函数的代码,它最初只是让我的角色在 Y 轴上旋转,所以只需增加或减少速度值。所以我添加了一个方法,根据物体正在看的视角生成一个随机角度,所以我只使用了不同的象限。

void invertMove()
{
if(!inverse)
{
float tempRot = Random.Range(180f, 360f);
zombieSpeed = -0.01f;
zombieBody.SetRotation(tempRot);
inverse = true;
}
else
{
float tempRot = Random.Range(0f, 180f);
zombieSpeed = 0.01f;
zombieBody.SetRotation(tempRot);
inverse = false;
}
}

我们不知道zombieSpeed做什么,但假设您在这里谈论Rigidbody2D.SetRotation您可能想分配一个新的velocity

velocity在全球空间。您不能使用例如transform.right作为新方向,因为transform尚未更新..只有zombieBody是..但是您可以使用Rigidbody2D.GetRelativeVector在旋转后设置新的局部方向

给定在局部空间中relativeVector向量rigidBody获取全局空间向量

// or Vector2.up depending on your setup
zombieBody.velocity = zombieBody.GetRelativeVector(Vector2.right * 0.01f);

因此,根据您的需求,您不会在正速度和负速度之间产生差异,而是保持0.01f并使用

  • 用于创建新的完全随机的二反应

    void newRandomDirection()
    float newRot = Random.Range(0f, 360f);
    zombieBody.SetRotation(newRot);
    zombieBody.velocity = zombieBody.GetRelativeVector(Vector2.right * 0.01f);
    }
    
  • 对于实际反转方向,您可以简单地做

    void invertMove()
    {
    var newRot = zombieBody.rotation + 180f;
    // optionally you can always fix it to a value 0-360 but that's not really required
    //if(newRot > 360f)
    //{
    //    newRot -= 360f;
    //}
    zombieBody.SetRotation(newRot);
    zombieBody.velocity = zombieBody.GetRelativeVector(Vector2.right * 0.01f);
    }
    
  • 或者,如果您想要的是获得一个新的随机方向,介于 -90(== +270( 到 90 度之间,我宁愿使用

    void invertMoveHemiSphere()
    {
    var newRot = zombieBody.rotation + Random.Range(90f, 270f);
    // optionally you can always fix it to a value 0-360 but that's not really required
    //if(newRot < 0f)
    //{
    //    newRot += 360f;
    //} 
    //else if(newRot > 360f)
    //{
    //    newRot -= 360f;
    //}
    zombieBody.SetRotation(newRot);
    zombieBody.velocity = zombieBody.GetRelativeVector(Vector2.right * 0.01f);
    }
    
  • 或坚持你到目前为止所做的事情

    void invertMove()
    {
    inverse = !inverse;
    float newRot = inverse? Random.Range(0f, 180f) : Random.Range(180f, 360f);
    zombieBody.SetRotation(newRot);
    zombieBody.velocity = zombieBody.GetRelativeVector(Vector2.right * 0.01f);   
    }
    

最新更新