Контроль персонажа по 3-м точкам Unity
Имеется такой метод контроля персонажем который крутится в апдейте в бесконечном раннере:
private void PlayerMovement()
{
moveVector = Vector3.zero;
moveVector.z = variableJoystick.Horizontal * moveHorizontalSpeed; // был moveVectorZ
moveVector.y = gravityForce;
moveVector.x -= moveVectorX;
characterController.Move(moveVector * Time.deltaTime);
characterController.center = new Vector3(0, 0.85f, -0.3f);
}
По Х координате задается дефолтное ускорение вперед, по Y кастомная гравитация и Z - горизонтальное управление с помощью джойстика. Проблема в том, что нужно переписать данный метод так, чтобы оставить управление джойстиком, но чтобы при свайпах игрок оказывался в нужной координате. Проблема: При использовании метода описаного ниже персонаж не останавливается на нужной координате, а продолжает движение и как переписать данный код, чтобы было дефолтное управление в бесконечном раннере - свайпами.
private void CoordinatesMovement()
{
float leftPos = -2.3f;
float rightPos = 5.3f;
float centerPos = 2.0f;
if (variableJoystick.Horizontal < 0)
{
moveVectorZ = Mathf.Lerp(transform.position.z, leftPos, Time.deltaTime);
}
else if (variableJoystick.Horizontal > 0)
{
moveVectorZ = Mathf.Lerp(transform.position.z, rightPos, Time.deltaTime);
}
else if(variableJoystick.Horizontal == 0)
{
moveVectorZ = 0;
}
else
{
moveVectorZ = Mathf.Lerp(transform.position.z, centerPos, Time.deltaTime);
}
}
P.S.>> Использование линейной интерполяции - это тестовый вариант.
Ответы (1 шт):
Автор решения: Honey Cake
→ Ссылка
private void PlayerMovement()
{
moveVector = Vector3.zero;
moveVector.y = gravityForce;
moveVector.x -= moveVectorX;
float input = variableJoystick.Horizontal;
if (Mathf.Abs(input) > .1f)
{
if (!didChangeLastFrame)
{
didChangeLastFrame = true;
laneNumber += (int) Mathf.Sign(input);
laneNumber = Mathf.Clamp(laneNumber, 0, lanesCount);
}
if (laneNumber == 0)
{
animator.SetTrigger(IsIdleB);
animator.SetTrigger(IsFly);
}
if (laneNumber == 2)
{
animator.SetTrigger(IsIdleC);
animator.SetTrigger(IsFly);
}
}
else
{
didChangeLastFrame = false;
}
characterController.Move(moveVector * Time.deltaTime);
Vector3 newPos = transform.position;
newPos.z = Mathf.Lerp(newPos.z, firstLanePos + (laneNumber * laneDistance), Time.deltaTime * sideSpeed);
transform.position = newPos;
characterController.center = new Vector3(0, 0.85f, -0.3f);
}