如何在Unity中使用C#脚本更改动画师变量?

时间:2019-07-09 15:41:12

标签: c# unity3d

在学习游戏开发的过程中,我决定自己做一个游戏。但是,当我通过“ 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键时,将播放动画。

1 个答案:

答案 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