Как сделать анимацию перехода, используя плавные кривые?
Я работал над бесконечной раннер-игрой с использованием движка Unity 5, изучая некоторые примеры. Я применил действие прыжка к своему персонажу. Это работало нормально, но я хотел, чтобы это было немного идеально, поэтому я имплантировал прыжок, используя кривые с этим примером, столкнулся с этой проблемой. То есть после применения кривых для контроллера персонажа с некоторыми корректировками, теперь, когда я прыгаю, кривые начинают настраивать контроллер после того, как я коснулся платформы (земли), что делает прыжок нереальным. Я пытался добиться перехода, используя фиксированный метод обновления, поскольку игра представляет собой бесконечный раннер, который в основном обновляет все кадр за кадром, но он не работает. Как мне добиться реалистичного прыжка? ниже то, что я пытался до сих пор.
if (controller.isGrounded)
{
verticalVelocity = -0.5f; //upward thrust / jump height
if (currentBaseState.fullPathHash == locoState) // is character in moving state
{
if (Input.GetButtonDown("Jump"))
{
verticalVelocity = 18f;
anim.SetBool("Jump", true);
}
}
else if (currentBaseState.fullPathHash == jumpState) //Is character in jump state
{
if (!anim.IsInTransition(0))
{
if (useCurves)
{
controller.height = anim.GetFloat("ColliderHeight"); //get the controller height using curves
controller.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); //Get the controller Y axis using the curves (center of chr ctrlr)
}
anim.SetBool("Jump", false);
}
// Applying curves
Ray ray = new Ray(transform.position + Vector3.up, -Vector3.up);
RaycastHit hitInfo = new RaycastHit();
if (Physics.Raycast(ray, out hitInfo))
{
print(ray.ToString());
if (hitInfo.distance > 1.75f)
{
anim.MatchTarget(hitInfo.point, Quaternion.identity, AvatarTarget.Root, new MatchTargetWeightMask(new Vector3(0, 1f, 0), 0), 0.03f, 0.6f);
}
}
}
}
Результат после прикосновения к земле
Помощь будет высоко ценится
2 ответа
Ваш бит кода, который настраивает контроллер на основе кривых, находится внутри оператора if, спрашивающего, заземлен ли символ.
if (controller.isGrounded)
{
...
}
таким образом, он будет корректироваться только тогда, когда персонаж касается земли.
У вашего игрового объекта есть твёрдое тело? если нет, то попробуйте добавить и сделать жесткое тело в iskinematic, потому что, когда вы перемещаете объект с коллайдером и без твердого тела, необходимо пересчитать полные статические данные о столкновении, что очень медленно. Или, может быть, попробуйте поиграть с анимацией частоты смены кадров, не делайте ее слишком маленькой