为什么在为角色创建新的动画控制器时角色不能正确行走?
Why when creating new animator controller for the character the character is not walking right?
我创建了一个名为 SoldierController 的新控制器,并将其拖到 Inspector 中 Animator 组件下的角色 Controller 中。
也取消选中应用根运动
然后在第三人称角色上附加了一个新脚本,称为脚本士兵。
然后我设置动画控制器我添加到它的两个新状态:步行和空闲。
HumanoidIdle 和 HumanoidWalk。
然后我做了默认启动状态将是空闲。设置状态机默认状态。
然后我做了一个从步行到空闲的过渡。这样当我按下 W 它开始走一点然后它继续移动角色但没有行走动画。
如果我删除此过渡并从空闲过渡到行走,那么当我按下 W 时它会行走,但如果我离开 W 键并且它处于空闲状态,那么在 2-3 秒后角色将在我的位置行走意味着它会在不移动的情况下动画行走,并且我不会按任何东西它在空闲时自动启动。
这个角色有另一个动画师控制器,但我创建了一个新控制器并且只使用了这个新控制器。
和脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Soldier : MonoBehaviour
{
private bool _isWalking = false;
private Animator anim;
// Use this for initialization
void Start ()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update ()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
transform.Rotate(0, x, 0);
if (Input.GetKey("w"))
{
if (!_isWalking)
{
_isWalking = true;
anim.Play("Walk");
}
var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
transform.Translate(0, 0, z); // Only move when "w" is pressed.
}
else
{
if (_isWalking)
{
anim.Play("Idle");
}
_isWalking = false;
}
}
}
首先,您混合了两种方法。您正在播放代码中的动画,并在动画师中分配过渡。他们会发生冲突。您可以通过代码完成整个动画控制,也可以按照以下步骤操作:
1. 使用转换在动画器 window 中制作一个有限状态机。
2. 为这些转换添加参数(bool、int 等)
3. 改变代码anim.SetBool("walk", true) 中的参数值来控制动画。
另外,不要忘记将空闲或行走动画的环绕模式设置为循环。否则,他们将播放一次然后停止。
我创建了一个名为 SoldierController 的新控制器,并将其拖到 Inspector 中 Animator 组件下的角色 Controller 中。
也取消选中应用根运动
然后在第三人称角色上附加了一个新脚本,称为脚本士兵。
然后我设置动画控制器我添加到它的两个新状态:步行和空闲。 HumanoidIdle 和 HumanoidWalk。
然后我做了默认启动状态将是空闲。设置状态机默认状态。
然后我做了一个从步行到空闲的过渡。这样当我按下 W 它开始走一点然后它继续移动角色但没有行走动画。
如果我删除此过渡并从空闲过渡到行走,那么当我按下 W 时它会行走,但如果我离开 W 键并且它处于空闲状态,那么在 2-3 秒后角色将在我的位置行走意味着它会在不移动的情况下动画行走,并且我不会按任何东西它在空闲时自动启动。
这个角色有另一个动画师控制器,但我创建了一个新控制器并且只使用了这个新控制器。
和脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Soldier : MonoBehaviour
{
private bool _isWalking = false;
private Animator anim;
// Use this for initialization
void Start ()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update ()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
transform.Rotate(0, x, 0);
if (Input.GetKey("w"))
{
if (!_isWalking)
{
_isWalking = true;
anim.Play("Walk");
}
var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
transform.Translate(0, 0, z); // Only move when "w" is pressed.
}
else
{
if (_isWalking)
{
anim.Play("Idle");
}
_isWalking = false;
}
}
}
首先,您混合了两种方法。您正在播放代码中的动画,并在动画师中分配过渡。他们会发生冲突。您可以通过代码完成整个动画控制,也可以按照以下步骤操作: 1. 使用转换在动画器 window 中制作一个有限状态机。 2. 为这些转换添加参数(bool、int 等) 3. 改变代码anim.SetBool("walk", true) 中的参数值来控制动画。
另外,不要忘记将空闲或行走动画的环绕模式设置为循环。否则,他们将播放一次然后停止。