如何解决这个统一的2D侧滑车运动/动画问题

时间:2019-02-07 17:24:10

标签: unity3d 2d

因此,我正在统一创建自己的第一款游戏,目前正在从事从左到右的移动。

  • 我向左移动,放开左箭头按钮->空闲动画。

  • 按向右箭头,字符向右移动,放开->空闲。

问题是我必须等待空闲的动画才能按下以选择另一个方向。当我同时按下向左键和向右键时,角色不会移动。

我想做的是fe:

  • 向左按下->字符向左移动,然后

  • 同时按向右->字符向右。

因此需要能够同时按下按钮,并且最后按下的键指示运动/动画。

动画代码:

if (Input.GetKeyDown(KeyCode.LeftArrow)) 
{
    this.GetComponent<Animator>().SetInteger("pallotila", 1);
}

if (Input.GetKeyUp(KeyCode.LeftArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 0);
}

if (Input.GetKeyDown(KeyCode.RightArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 2);
}

if (Input.GetKeyUp(KeyCode.RightArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 0);
}

玩家移动代码:

if (Input.GetKey(KeyCode.LeftArrow))
{
    this.transform.position += Vector3.left * this.nopeus * Time.deltaTime;
    this.transform.rotation = this.vasemmalle;
}

if (Input.GetKey(KeyCode.RightArrow))
{
    this.transform.position += Vector3.right * this.nopeus * Time.deltaTime;
    this.transform.rotation = this.oikealle;
}

2 个答案:

答案 0 :(得分:0)

请注意,您永远都不应在GetComponent中使用Update,最好再做一次并重用引用。

//Here you store the Animator reference
private Animator animator;

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

我还将使用switch来定义应该为哪个按钮执行的操作,以避免一遍又一遍地重复相同的代码。

private void SetLastPressed(KeyCode code)
{
    int value = 0;
    switch (code)
    {
        case KeyCode.None:
            value = 0;
            break;

        case KeyCode.LeftArrow:
            value = 1;
            break;

        case KeyCode.RightArrow:
            value = 2;
            break;
    }

    animator.SetInteger("pallotila", value);
    lastPressed = code;
}

只需存储并检查最后按下的按钮,然后使用if-else进行输入检查。

// Here you store the last pressed key
private KeyCode lastPressed = KeyCode.None;

private void Update()
{

    if (lastPressed != KeyCode.LeftArrow && Input.GetKeyDown(KeyCode.LeftArrow))
    {
        SetLastPressed(KeyCode.LeftArrow);
    }
    else if (lastPressed != KeyCode.RightArrow && Input.GetKeyDown(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.RightArrow);
    }

    // If none of the keys is pressed reset
    else if (lastPressed != KeyCode.None && !Input.GetKey(KeyCode.LeftArrow) && !Input.GetKey(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.None);
    }

    // And if only one of them is released but the other one still pressed
    //go on using that still pressed key again
    else if (lastPressed != KeyCode.LeftArrow && Input.GetKeyUp(KeyCode.RightArrow) &&
             Input.GetKey(KeyCode.LeftArrow))
    {
        SetLastPressed(KeyCode.LeftArrow);
    }
    else if (lastPressed != KeyCode.RightArrow && Input.GetKeyUp(KeyCode.LeftArrow) &&
             Input.GetKey(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.RightArrow);
    }

对于移动,您还可以简单地重用lastPresses

    if(lastPressed == KeyCode.LeftArrow)
    {
        transform.position += Vector3.left * nopeus * Time.deltaTime;
        transform.rotation = vasemmalle;
    }
    else if (lastPressed == KeyCode.RightArrow)
    {
        transform.position += Vector3.right * nopeus * Time.deltaTime;
        transform.rotation = oikealle;
    }

此外,您可以/应该使用List<KeyCode>来存储最后的印刷机。每次按钮按下时,将按钮添加到列表末尾;每当按钮升起时,将其从列表中删除

result =>最后按下的按钮始终是列表中的最后一个按钮。

这使得返回上一个按钮的方式更加简单和灵活,而无需添加/更改太多的代码行,例如

private List<KeyCode> lastPresses = new List<KeyCode>();
private KeyCode lastPressed = KeyCode.None;

private Animator animator;

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

private void SetLastPressed(KeyCode code)
{
    int value = 0;
    switch (code)
    {
        case KeyCode.None:
            value = 0;
            break;

        case KeyCode.LeftArrow:
            value = 1;
            break;

        case KeyCode.RightArrow:
            value = 2;
            break;
    }

    animator.SetInteger("pallotila", value);
    lastPressed = code;
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        if (!lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Add(KeyCode.LeftArrow);
    }
    else if (Input.GetKeyUp(KeyCode.LeftArrow))
    {
        if (lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Remove(KeyCode.LeftArrow);
    }

    if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        if (!lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Add(KeyCode.RightArrow);
    }
    else if (Input.GetKeyUp(KeyCode.RightArrow))
    {
        if (lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Remove(KeyCode.RightArrow);
    }

    var currentCode = lastPresses.Count > 0 ? lastPresses[lastPresses.Count - 1] : KeyCode.None;

    if (currentCode != lastPressed) SetLastPressed(currentCode);

    if (lastPressed == KeyCode.LeftArrow)
    {
        transform.position += Vector3.left * nopeus * Time.deltaTime;
        transform.rotation = vasemmalle;
    }
    else if (lastPressed == KeyCode.RightArrow)
    {
        transform.position += Vector3.right * nopeus * Time.deltaTime;
        transform.rotation = oikealle;
    }
}

答案 1 :(得分:0)

您可以将“值”变量更改为

    animator.SetInteger("pallotila", 0);
    break;

的位置
value = 0;
break;

或更改

int value;

int value = 0;

在@derHugo的代码中