【问题标题】:Unity2D: Moving player using UI buttons - Smooth animationUnity2D:使用 UI 按钮移动播放器 - 平滑动画
【发布时间】:2018-09-10 02:15:28
【问题描述】:

我有两个 UI 按钮,用于控制玩家的移动(左右),而不是使用按钮脚本组件,我决定使用事件触发脚本组件;一个点向下事件来移动我的播放器和一个点向上事件来停止我的播放器的移动。我的问题:我创建了一个行走动画(在我的动画师中),当用户按住左或右按钮时将播放该动画,动画很流畅(这是我喜欢的)但是如果玩家要点击按钮一次(而不是点击并按住按钮)动画不播放并且移动不移动或者动画太快并且移动非常短。我想要做的:我想保持玩家的运动方式,但我也希望在用户点击一次时为玩家提供流畅的动画和运动。

这是我的脚本:

public bool movingLeft = false;
public bool movingRight = false;

public float speed = 2f;

public Vector3 moveDirectionLeft = Vector3.left;
public Vector3 moveDirectionRight = Vector3.right;


 void Start () {
    movingLeft = false;
    movingRight = false;

  }

 void Update () {
     if (movingLeft == true) {                      // LEFT BUTTON //
        WalkAnim.SetBool ("WalkLeft", true);// walk left
            transform.Translate (moveDirectionLeft * speed * Time.deltaTime);
     }  else if (movingLeft == false) {
           speed = 0;
           WalkAnim.SetBool ("WalkLeft", false); // goes back to idle
     }


     if (movingRight == true) {                         // RIGHT BUTTON //
        WalkAnim.SetBool ("WalkRight", true); // walks right
            transform.Translate (moveDirectionRight * speed * Time.deltaTime);
     }  else if (movingLeft == false) {
           speed = 0;
           WalkAnim.SetBool ("WalkRight", false); // goes back to idle
     }
 }


public void limitLD() { // UI Button Event trigger - pointUp
    movingLeft = false;
}

public void limitRD() { // UI Button Event trigger - pointUp
    movingRight = false;
}


public void MoveLeft() { // UI Button Event trigger - pointDown
        movingLeft = true;
        movingRight = false;
}

public void MoveRight() { // UI Button Event trigger - pointDown
        movingLeft = false;
        movingRight = true;
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    由于您的if...else 语句而出现此问题。例如,如果您单击Right 按钮,则会调用void MoveRight()。它设置了movingRight = truemovingLeft = false

    因此,在您的 Update() 函数中,首先运行 else if (movingLeft == false) 并将您的速度设置为 0 并将您的动画设置为空闲。第二个if (movingRight == true) 运行。但是因为 speed = 0animation = idleUpdate() 函数调用每一帧,什么都没有发生。

    您可以将脚本更改为:

    public bool movingLeft = false;
    public bool movingRight = false;
    
    public float speed = 2f;
    
    public Vector3 moveDirectionLeft = Vector3.left;
    public Vector3 moveDirectionRight = Vector3.right;
    
    
    void Start()
    {
        movingLeft = false;
        movingRight = false;
    }
    
    void Update() 
    {
        if (movingLeft == true)
        {                      // LEFT BUTTON //
           WalkAnim.SetBool("WalkLeft", true);// walk left
           transform.Translate(moveDirectionLeft * speed * Time.deltaTime);
        }
        else if (movingRight == true)
        {                         // RIGHT BUTTON //
           WalkAnim.SetBool("WalkRight", true); // walks right
           transform.Translate(moveDirectionRight * speed * Time.deltaTime);
        }
        else
        {
           WalkAnim.SetBool("WalkLeft", false);
           WalkAnim.SetBool("WalkRight", false);
        }
    }
    
    public void limitLD()
    { // UI Button Event trigger - pointUp
        movingLeft = false;
    }
    
    public void limitRD()
    { // UI Button Event trigger - pointUp
        movingRight = false;
    }
    
    public void MoveLeft()
    { // UI Button Event trigger - pointDown
        movingLeft = true;
        movingRight = false;
    }
    
    public void MoveRight()
    { // UI Button Event trigger - pointDown
        movingLeft = false;
        movingRight = true;
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      相关资源
      最近更新 更多