Передвижение и поворот игрока на сфере по направлению в Unity (без RigidBody и Raycast)

Я столкнулся с задачей по перемещению и вращению игрока с помощью джойстика на сфере(планете). Суть заключается в том, чтобы юнит(вообще они будут по группам) передвигался на этой самой сфере в определённом направлении и смотрел в ту же сторону.

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

Вот основные два метода для получения позиции (Vector3) и поворота (Quaternion):

private Quaternion GetRotationForBody(PlanetBody planetBody)
{
    var bodyTransform = planetBody.Transform;

    var up = bodyTransform.up;

    var rotation = bodyTransform.rotation;

    var gravityUp = (bodyTransform.position - _transform.position).normalized;

    var targetRotation = Quaternion.FromToRotation(up, gravityUp) * rotation;

    rotation = targetRotation;

    return rotation;
}

private Vector3 GetSmoothPositionForBody(PlanetBody planetBody)
{
    var bodyTransform = planetBody.Transform;

    var bodyPosition = bodyTransform.position;

    var targetPosition = GetPositionForPoint(bodyPosition, planetBody.PlanetOffset);

    var position = bodyPosition;

    position = Vector3.Slerp(position, targetPosition, 
planetBody.GravityMoveSpeed * Time.deltaTime);

    return position;
}

public Vector3 GetPositionForPoint(Vector3 point, float offset)
{
    var planetPosition = _transform.position;

    var gravityUp = (point - planetPosition).normalized;

    return planetPosition + gravityUp * (_planetRadius * offset);
}

Их я ставил в Update для позиции и вращении любого юнита, а дальше двигал по направлению в зависимости от текущего поворота:

public void MoveBodyToDirection(PlanetBody body, Vector3 direction)
{
    var targetDirection = body.Transform.TransformDirection(direction).normalized;

    var positionWithOffset = body.Transform.position + targetDirection * (body.MoveDirectionSpeed * Time.deltaTime);

    body.transform.position = GetPositionForPoint(positionWithOffset, body.PlanetOffset);
}

А чтобы игрок смотрел в сторону направления, добавил дочерний объект, который будет просто локально вращаться в зависимости от направления движения(по коду там совсем не интересно, да и не нужно тут)

И всё вроде бы хорошо, но в момент различных движений, к примеру, по кругу тело начинает крутить в произвольном направлении, что нарушает восприятие от управления(в начале сторонний объект на планете мы видим перпендикулярным к нам, а дальше игрока как будто заносит, хотя двигается и смотрит он корректно), но само управление шабашит нормально.

Так и не поняв что я сделал не так, начал смотреть следующий способ со сферической системой координат и пришёл к неутешительному выводу, что там именно с вращением объекта и передвижением(по крайней мере, удобным) по направлению ничего не выйдет.

Может у кого есть советы по этому вопросу или хотя бы в какое направление мне нужно двигаться?(застрял уже как 3 дня на этом)


Ответы (0 шт):