如何计算目标目的地

时间:2015-04-03 21:16:27

标签: unity3d position transform renderer qvector3d

我在解决这个问题时遇到了一些麻烦。我想要实现的是一种解决动作。玩家从远处刺向目标。

enter image description here

该图显示了设置。蓝色钻石是玩家,红色钻石是目标。紫色框是目标SkinnedMeshRenderer的渲染器边界。我正在使用渲染器边界,因为某些目标的网格比其他网格要大得多。目前,该玩家正在向橙色星球射击......这是不现实的。我希望他,无论目标面向什么样的方向,总是瞄准目标最近的相对于他位置的点......在图中的情况是棕色的星。这是我一直在使用的代码......

 public IEnumerator Blitz()
{
    rigidbody.velocity = Vector3.zero; //ZERO OUT THE RIGIDBODY VELOCITY TO GET READY FOR THE BLITZ
    SkinnedMeshRenderer image = target.GetComponentInChildren<SkinnedMeshRenderer>();
    Vector3 position = image.renderer.bounds.center + image.renderer.bounds.extents;
    position.y = target.transform.position.y;
    while(Vector3.Distance(transform.position, position) > 0.5f)
    {
    transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * 10);
        yield return null;
    }
    Results(); //IRRELEVANT TO THIS PROBLEM. THIS CALCULATES DAMAGE.
    Blitz.Stop(); //THE PARTICLE EFFECT ASSOCIATED WITH THE BLITZ.
    GetComponent<Animator>().SetBool(moveName, false); //TRANSITIONS OUT OF THE BLITZ ANIMATION
    GetComponent<Input>().NotAttacking(); //LET'S THE INPUT SCRIPT KNOW THE PLAYER CAN HAVE CONTROL BACK.
}

1 个答案:

答案 0 :(得分:0)

//Get the derection to tarvel in and normalize it to length of 1
Vector3 Direction = (Target - transform.position).normalized

使用Direction,你可以做很多事情。例如,您可以将方向乘以您的速度并将其添加到您的位置。

transform.position += Direction * MoveSpeed;

如果你想到达最近的点,你可以使用方便的Collider.ClosestPointOnBounds方法。

Target = TargetObject.GetComponent<Collider>().ClosestPointOnBounds(transform.position)

并将Target插入用于获取方向的代码中。

或者,您可以使用Vector3.Lerp而不获取方向,因为它只是插值。

transform.position = Vector3.Lerp(Target,transform.position,time.DeltaTime);

要在目标点停留,您可以使用到达行为。

//Declare the distance to start slowing down
float ClosingDistance = Speed * 2;
//Get the distance to the target
float Distance = (Target - transform.position).magnitude;
//Check if the player needs to slow down
if (Distance < ClosingDistance)
{
//If you're closer than the ClosingDistance, move slower
transform.position += Direction * (MoveSpeed * Distance / ClosingDistance);
}
else{
//If not, move at normal speed
transform.position += Directino * MoveSpeed;
}