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