Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的脚本无法在行走和跑步动画之间切换_C#_Unity3d_Animation - Fatal编程技术网

C# 我的脚本无法在行走和跑步动画之间切换

C# 我的脚本无法在行走和跑步动画之间切换,c#,unity3d,animation,C#,Unity3d,Animation,我正在编写一个脚本,在动画之间切换(查看屏幕截图以便更好地理解),虽然脚本很粗糙,但基本上可以完成这项工作。问题是,当您转到(Walk->WalkToSprint)时,WalkToSprint布尔值在应该停用时保持活动状态,这会使动画循环 void Update() { // this section is for walking and running if (Input.GetKey(KeyCode.W)) { anim.SetBool("Walk"

我正在编写一个脚本,在动画之间切换(查看屏幕截图以便更好地理解),虽然脚本很粗糙,但基本上可以完成这项工作。问题是,当您转到(Walk->WalkToSprint)时,WalkToSprint布尔值在应该停用时保持活动状态,这会使动画循环

void Update()
{
     // this section is for walking and running
    if (Input.GetKey(KeyCode.W))
    {
        anim.SetBool("Walk", true);
        anim.SetBool("SprintToWalk", true);

        if (Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetBool("WalkToSprint", true);
            anim.SetBool("Idle", true);
            anim.SetBool("SprintToWalk", false);


        }
    }
   // end section

   //this section is for sprinting then to walking
    if (Input.GetKey(KeyCode.LeftShift))
    {    
        if (Input.GetKeyDown(KeyCode.W))
        {
            anim.SetBool("Sprint", true);
            anim.SetBool("Walk", false);
            anim.SetBool("Idle", false);
            anim.SetBool("SprintToWalk", false);
        }
    }

    ///////////////////////////////////////// this section is the key up code.

    if (Input.GetKeyUp(KeyCode.W))
    {
        anim.SetBool("Walk", false);
        anim.SetBool("Sprint", false);
        anim.SetBool("Idle", false);
        anim.SetBool("WalkToSprint", true);
        anim.SetBool("SprintToWalk", false);
    }
    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        anim.SetBool("Idle", false);
        anim.SetBool("WalkToSprint", false);
        anim.SetBool("SprintToWalk", true);
    }
}
你的状态机错了

请注意,“步行到sprint”状态完全无法将动画发送到sprint状态。然而,这可能不是您的唯一问题,但这几乎肯定是无限循环问题的根源,因为状态机在处于WalkToSprint状态后不断被发送回Walk,并且永远无法达到Sprint状态


我还建议修改您的逻辑代码,因为标记为“先冲刺,然后步行”的部分要求用户开始按W键(如果他们已经在冲刺,他们就不能做这件事,因为冲刺将shift和W同时保持在向下位置,这也会调用命令告诉动画去空闲
anim.SetBool(“空闲”,true);
!)。

我的解决方案是更改冲刺的动画,这样我就可以删除WalkToSprint,这就给我留下了一个直接的机会。


我不理解你这里的代码。是有两次单独的尝试,四次,还是其他什么?@Draco18s你是指////?下面的代码,即区分键下和键上功能。哦,好的。我将上传一个截图,分隔代码的每一部分。不要发布代码截图。但是你的评论帮助我弄清楚了这一点实际上,这是一个代码块。您有两个相同的语句块:
if(W&&LeftShift)
if(LeftShift&&W)
有不同的内容。此外,您应该包括动画状态机。@Draco18s///上半部分的第一个是步行和步行跑步。另一个是短跑,然后是步行。我将在代码中添加注释并上载动画控制器的屏幕截图。@Draco28s原因是它们有两种不同的动画。WalkToSprint让动画从行走调整到运行,而sprint只是从空闲调整到运行。然后修复状态机,这样就不会有所有这些额外的转换。如果不能从
Walk
转到
sprint
,那么就不需要那个箭头。而且你的代码仍然是一个痛苦的问题wkward和几乎肯定是错的。例如,它不关心你的动画师在处理按键时目前处于什么状态。Unity有一种内置的方法来处理@Draco18s。我刚刚想出了一个我应该早点解决的方法(我想我熬夜了)。我会在回答中发布代码和屏幕截图,以防它对任何人都有帮助。
void Update()
{
    if (Input.GetKey(KeyCode.W))
    {
        anim.SetBool("Walk", true);
        if (Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetBool("Sprint", true);
            anim.SetBool("Idle", true);
        }
    }

    /////////////////////////////////////////


    if (Input.GetKeyUp(KeyCode.W))
    {
        anim.SetBool("Walk", false);
        anim.SetBool("Idle", false);
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        anim.SetBool("Sprint", false);
    }
}