如何才能一一播放多个动画?

时间:2018-12-27 10:14:13

标签: c# unity3d

我有一个带有动画控制器的角色。 我从Mixamo.com下载了12个fbx动画文件,这是Pro Magic Pack。

问题是我应该将每个动画一个一个地拖到动画控制器,然后在每个动画状态之间添加过渡吗?或制作混合树?

这是我现在正在使用的脚本,我希望索引2(动画师2)中的动画师在“空闲”之后开始在他身上播放所有12种动画。

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;
    public bool slowDown = false;

    private bool endRot = false;
    private Vector3 center;

    // Use this for initialization
    void Start()
    {
        center = target.GetComponent<Renderer>().bounds.center;

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

        for(int i = 0; i < animators.Length; i++)
        {
            animators[2].transform.position = Vector3.MoveTowards(animators[2].transform.position, center, 0);
        }

        if (slowDown)
        {
            if (distanceFromTarget < 10)
            {
                float speed = (distanceFromTarget / 10) / 1;
                for (int i = 0; i < animators.Length; i++)
                {
                    animators[i].SetFloat("Walking Speed", speed);
                }
            }
        }

        if (distanceFromTarget < 5f)
        {
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetBool("Idle", true);
            }

            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.up, angleThisFrame);
                animators[1].transform.Rotate(Vector3.down, angleThisFrame);

                // We end if we rotated the remaining amount.
                endRot = (angleThisFrame == angleToGoal);
            }
            {
                animators[0].SetBool("Rifle Aiming Idle", true);
                animators[1].SetBool("Rifle Aiming Idle", true);
            }
        }
    }
}

如果我在动画控制器中拥有所有动画,那么可以说它们添加了过渡效果,如何在脚本中循环播放它们并使其一一运行?

更新:

这是我要从脚本中逐个播放的动画文件的屏幕截图:从站立1H施法咒语01到站立2H魔法攻击05:

Animation files

下一个屏幕快照是当前的动画控制器,具有我已经拥有的状态和一些参数:从“行走”到“空闲”(从“ HumanoidWalk”到“ HumanoidIdle”),我希望如果它处于“空闲”状态,然后开始播放所有动画文件:

States animator controller

因此,在脚本中,动画师2中的角色处于空闲状态后,然后开始在此动画师(动画师2)上播放动画

但这是硬盘上的动画文件。我应该先将它们添加到动画师吗?在每个动画之间进行过渡?以及动画师2处于空闲状态时如何在脚本中一一运行它们?

0 个答案:

没有答案