Есть ли способ изменить аниматор IK SetLookAtWeight медленно плавно?

#c# #unity3d

#c# #unity3d

Вопрос:

 using UnityEngine;
using System;
using System.Collections;

[RequireComponent(typeof(Animator))]

public class IKControl : MonoBehaviour
{

    protected Animator animator;

    public bool ikActive = false;
    public Transform headObj = null;
    public Transform lookObj = null;

    private bool changeWeight = false;
    private float t = 0;
    private float value = 0;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    //a callback for calculating IK
    void OnAnimatorIK()
    {
        if (animator)
        {

            //if the IK is active, set the position and rotation directly to the goal. 
            if (ikActive)
            {
                changeWeight = false;

                // Set the look target position, if one has been assigned
                if (lookObj != null)
                {
                    animator.SetLookAtWeight(1, 1, 1, 1, 1);
                    animator.SetLookAtPosition(lookObj.position);
                }
            }

            //if the IK is not active, set the position and rotation of the hand and head back to the original position
            else
            {
                changeWeight = true;
            }
        }
    }

    private void Update()
    {
        if(changeWeight == true)
        {
            t  = Time.deltaTime / 5f;
            value = Mathf.Lerp(1f, 0f, t);

            animator.SetLookAtWeight(value);
        }
    }
}
  

Я пытаюсь использовать флаг и в обновлении медленно изменять значение, чтобы SetLookAtWeight занял в этом случае 5 секунд только для тестирования.

Но значение SetLookAtWeight похоже на переход от 1 к 0, а не на медленное изменение от 1 к 0. Когда я запускаю игру и устанавливаю для флага bool ikActive значение false, голова игрока просто сразу переключается из режима просмотра в режим ожидания.

И я хочу, чтобы он медленно переходил в режим ожидания.

Ответ №1:

Вы никогда не сбрасываете свое t значение. После 5 секунд игрового процесса оно будет больше 1, и поэтому Lerp всегда будет возвращать максимальное значение.

Попробуйте добавить эту строку в начало вашего if (ikActive) блока t = 0f;