Передвижение и поворот игрока на сфере по направлению в 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 дня на этом)