#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;