Unity 5.1动画控制器无法过渡

3
我已经创建了一个名为“Player”的Animator Controller,并将其分配给我的人形化身的Animator字段,以及具有适当转换的简单动画状态。请参见附加的两个图像。
我已将包含以下代码的脚本附加到我的化身游戏对象中,但我想知道我缺少什么或做错了什么,导致从Idle到Walk的转换没有发生,即使我可以看到当我按W键时速度变量增加。
请问有人能帮我理解这个问题吗?
using UnityEngine;
using System.Collections;

public class CharAnim : MonoBehaviour
{
    private Animator animator;
    float speed;

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

    void Update()
    {    
      animator.SetFloat( "speed", Input.GetAxis("Vertical") );

      if ( Input.GetKeyDown( KeyCode.W ) && ( speed > 0.5f ) ) 
      {
          animator.SetTrigger("Walk");
      }
      else 
      {
          animator.SetTrigger("Idle");
      }
    }
}

x

enter image description here

enter image description here

2个回答

2
你代码中的问题是,当你按下键时,animator.SetTrigger("Walk"); 在单个帧中被调用,而 animator.SetTrigger("Idle"); 在其余的帧中被调用。
尝试将 Input.GetKeyDown(KeyCode.W) 更改为 Input.GetKey(KeyCode.W)。前者仅在按下键时返回 true,而后者在释放键之前一直返回 true。像这样:
void Update ()
{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}

顺便说一下,在Animator中不需要使用speed变量来触发走路动画,因为你已经在使用W键来实现了。

Animator setup

空闲 -> 行走 图片描述 行走 -> 空闲 图片描述

此外,如果您没有使用它们,请从动画器中删除AnyState和Entry。我个人更喜欢手动设置每个状态及其转换。 - Nimesh
你是说如果不在播放时最大化,转换就能正常工作? - Nimesh
绝对的...我提交了一个错误报告。当你有时间的时候,请尝试一下,并看看是否能够复现这个场景。以下是我的错误报告描述: - user285372
我开始创建一个空的动画控制器,打开它的选项卡,创建最简单的单状态Idle动画,并定义vSpeed和hSpeed与箭头键一起使用。甚至没有转换 - 只有这个基本场景。我一遍又一遍地检查,确保当我按播放时,状态动画进度条显示它正在运行。我还检查箭头键,看看速度变量是否上下移动。一切都正常工作,反复进行,直到我点击“最大化播放”然后所有东西都停止工作:动画状态不显示进度条,箭头键不注册等等... - user285372
我看到你的评论后尝试了同样的事情,但对我来说运行良好。我也不知道为什么。 - Nimesh
显示剩余3条评论

-2
{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");
    }
    else            
        animator.SetTrigger("Idle");
}{
    if(Input.GetKey(KeyCode.W))
    {
        animator.SetTrigger("Walk");

仅提供代码答案是不被鼓励的。请添加一些解释,说明如何解决问题,或者这与现有答案有何不同。来自审核 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接