【问题标题】:Why the Animator Controller is vanish from the Inspector and not assigned when running the game?为什么 Animator Controller 从 Inspector 中消失并且在运行游戏时未分配?
【发布时间】:2020-04-07 23:10:58
【问题描述】:

它已在编辑器中分配,但在运行时运行游戏时,Animator 控制器已消失且不再分配。

我正在尝试一一播放Animator控制器中的所有状态动画。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEditor.Animations;

public class SwitchAnimations : MonoBehaviour
{
    public AnimatorController controller;

    private Animator animator;
    private AnimatorState[] states;

    // Use this for initialization
    void Start()
    {
        animator = GetComponent<Animator>();
        states = GetStateNames(animator);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(QueueAnim(states));
        }
    }

    private AnimatorState[] GetStateNames(Animator animator)
    {
        controller = animator ? animator.runtimeAnimatorController as AnimatorController : null;
        return controller == null ? null : controller.layers.SelectMany(l => l.stateMachine.states).Select(s => s.state).ToArray();
    }

    IEnumerator QueueAnim(params AnimatorState[] anim)
    {
        int index = 0;

        while (index < anim.Length)
        {
            if (index == anim.Length)
                index = 0;

            animator.Play(anim[index].name);

            AnimatorStateInfo si = animator.GetCurrentAnimatorStateInfo(index);
            yield return new WaitForSeconds(5);
            index++;
        }
    }
}

首先脚本中的所有变量都是私有的,而这个是静态的:

private static AnimatorController controller;

GetStateNames 方法也是静态的:

private static AnimatorState[] GetStateNames(Animator animator)

但我将控制器变量更改为公共变量而不是静态变量,因此 GetStateNames 现在不是静态的,因为脚本附加到空的 GameObject。

但是当我将 Animator Controller 分配给控制器时,它在运行游戏时消失了。

运行游戏前的截图:

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    看来您分配的是 AnimatorController 而不是 Animator。 Animator 引用/使用 AnimatorController 但不是相反。只需公开 Animator 并将其分配给 AnimatorController。

    【讨论】:

    • 我做到了,现在还有另一个问题。按下 A 时动画永远不会播放它什么都不做并抛出许多警告,例如:Invalid Layer Index '1' UnityEngine.Animator:GetCurrentAnimatorStateInfo(Int32) man warnings on layer 1 some on layer 2 4 5 7 6 and more.警告在第 47 行:AnimatorStateInfo si = animator.GetCurrentAnimatorStateInfo(index);
    • 如果我只将行更改为第 0 层:AnimatorStateInfo si = animator.GetCurrentAnimatorStateInfo(0);现在没有任何警告,但它仍然在做任何不播放状态动画的事情。 .
    • 不是 100%。分解GetStateNames。尝试像往常一样使用动画师controller,然后从那里开始。
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2013-06-25
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多