Как сделать анимацию перехода, используя плавные кривые?

Я работал над бесконечной раннер-игрой с использованием движка 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, потому что, когда вы перемещаете объект с коллайдером и без твердого тела, необходимо пересчитать полные статические данные о столкновении, что очень медленно. Или, может быть, попробуйте поиграть с анимацией частоты смены кадров, не делайте ее слишком маленькой

Другие вопросы по тегам