Как рассчитать целевое назначение

У меня возникли проблемы с выяснением этого. То, чего я пытаюсь достичь, - это своего рода движение. Игрок бросается в цель с расстояния.

Диаграмма показывает настройки. Голубой бриллиант - это игрок, а красный - цель. Фиолетовый прямоугольник - это границы рендера целей 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 ответ

//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)

и включите цель в код, используемый для определения направления.

Кроме того, вы можете использовать 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;
}
Другие вопросы по тегам