在学习游戏开发的过程中,我决定自己做一个游戏。但是,当我通过“ Animator”选项卡将动画放在模型上时,我偶然发现了一个问题。 我在动画器中创建了一个类型为“ float”的参数,其中,如果速度大于或小于值x,它将播放特定的动画。但是,为了实例化步行/跑步速度,我使用了位于“检查器”选项卡中的字段。 问题在于,由于初始化速度始终不为0,因此动画师会使用插入的值并播放步行动画,尽管实际上没有按下任何键!
我已经尝试了在线上找到的各种东西,例如使用动画上的“参数”复选框或使用不同的代码行,例如“ animator.SetFloat(“ Speed”,(speed));“在我的脚本上,但这些都没有解决。
// Update is called once per frame
void Update()
{
//animator.SetFloat("Speed", Mathf.Abs(speed));
animator.SetFloat("Speed", (speed));
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 moveDirection = new Vector3(horizontal, 0f, vertical) * speed * Time.deltaTime;
transform.Translate(moveDirection);
我希望输出如下: 当不按任何键时,将播放空闲动画。 按下WASD键时,将播放步行动画。 按下Shift + WASD键时,将播放动画。
答案 0 :(得分:0)
在您描述的情况下,您可能会考虑完全不使用转换,而是通过使用animator.Play
甚至是animator.CrossFade
进行转换的代码来完成所有操作
public class ExampleEditor : MonoBehaviour
{
private Animator animator;
private void Update()
{
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
animator.Play("Running");
return;
}
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D))
{
animator.Play("Walking");
return;
}
animator.Play("Idle");
}
}
或者如果您想使用参数,则可以改用诸如
public class ExampleEditor : MonoBehaviour
{
private Animator animator;
private void Update()
{
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
animator.SetBool("Running", true);
return;
}
animator.SetBool("Running", false);
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D))
{
animator.SetBool("Walking", true);
return;
}
animator.SetBool("Walking", false);
}
}
并具有类似
的转换条件IDLE -> Running if Running=true
IDLE -> Walking if Running=false && Walking=true
Running -> Walking if Walking=true && Running=false
Running -> IDLE if Walking=false && Running=false
Walking -> Running if Running=true
Walking -> IDLE if Walking=false