using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorController : MonoBehaviour
{
    public Animator[] animators;
    public Transform target;
    public float speed = 1f;
    public float rotationSpeed;

    private bool endRot = false;

    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < animators.Length; i++)
        {
            animators[i].SetFloat("Walking Speed", speed);
        }
    }

    // Update is called once per frame
    void Update()
    {
        float distanceFromTarget = Vector3.Distance(animators[2].transform.position, target.position);
        if (distanceFromTarget < 15)
        {
            float speed = (distanceFromTarget / 15) / 1;
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetFloat("Walking Speed", speed);
            }
        }

        if (distanceFromTarget < 2f)
        {
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetFloat("Walking Speed", 0);
            }

            if (animators[0].transform.localRotation.y != 0 && endRot == false)
            {
                animators[0].transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
                animators[1].transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);
            }

            if (animators[0].transform.localRotation.y == 0)
                endRot = true;
        }
    }
}


两个字符均以欧拉角localRotation(0f, 180f, 0f)开头。
我希望它们在Y上旋转到0,然后停止。尝试使用标志,但我猜比较浮点数是错误的。我应该使用StartCoroutine吗?

我试图使用时间轴制作动画剪辑,但是一旦创建了新的动画轨道并出于某种原因将一个角色拖入其中,它就会更改角色位置,并且武器没有固定在他身上。不知道为什么在时间轴上会发生这种情况。

最佳答案

您需要限制旋转,以免在单个旋转框架内出现过冲。这是一种方法。

设置目标轮播:

Quaternion goalRotation = Quaternion.Euler(0f,0f,0f); // or Quaternion.identity


查找第一个变换的旋转角度与旋转角度的距离:

float angleToGoal = Quaternion.Angle(goalRotation, animators[0].transform.localRotation);


确定哪个较小:由速度*增量时间给定的角度或为找出应将此框架旋转多远的角度所剩余的角度。这是重要的夹紧部分:

float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);


然后,旋转该数量。如果确实按angleToGoal旋转,则设置endRot = true;

可能看起来像这样:

if (distanceFromTarget < 2f)
{
    for (int i = 0; i < animators.Length; i++)
    {
        animators[i].SetFloat("Walking Speed", 0);
    }

    if (!endRot)
    {
        Quaternion goalRotation = Quaternion.Euler(0f,0f,0f);
        float angleToGoal = Quaternion.Angle(
                goalRotation,
                animators[0].transform.localRotation);
        float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);

        // use axis of Vector3.down to keep angles positive for ease of use
        animators[0].transform.Rotate(Vector3.down, angleThisFrame);
        animators[1].transform.Rotate(Vector3.up, angleThisFrame);

        // We end if we rotated the remaining amount.
        endRot = (angleThisFrame == angleToGoal);
    }
}

10-04 23:04
查看更多