【问题标题】:How to move a sprite with the WASD keys in a 2D game?如何在 2D 游戏中使用 WASD 键移动精灵?
【发布时间】:2019-09-27 01:06:42
【问题描述】:

我希望我的精灵向上或向下或向左或向右移动,我不想要任何其他移动,例如西北或东南;它需要向上、向下、向右或向左。互联网上有类似的帖子,但我想知道为什么我的不工作。它不会在游戏中启动任何动作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{

    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


    // Update is called once per frame
    void Update()
    {

        Vector3 move = transform.position;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move.z += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move.x -= speed * Time.deltaTime; 
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move.x += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move.y -= speed * Time.deltaTime;
        }

      transform.position = move; 
    }
}

对于我正在寻找的东西,我认为我不需要像大多数人在他们的运动中包含的刚体。我仍然是初学者,因此深入解释为什么我的代码不起作用以及我可以做些什么来修复它会很有帮助。谢谢。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    在您的情况下,每次if 语句通过时,move 都会增加。有两种方法可以禁用双面移动:或者在每个if 中重写move,或者在第一个if 传递后退出表单函数。

    您的脚本中还有另一个问题:您需要更新 A/D 按钮的 x 轴和 W/S 的 z 轴。

    例如:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        public Sprite Up;
        public Sprite Down;
        public Sprite Right;
        public Sprite Left;
        public float speed;
    
    
        // Update is called once per frame
        void Update()
        {
            Vector3 move;
    
            if (Input.GetKey(KeyCode.W))
            {
                GetComponent<SpriteRenderer>().sprite = Up;
                move = new Vector3(-speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.A))
            {
                GetComponent<SpriteRenderer>().sprite = Left;
                move = new Vector3(0, 0, speed * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.D))
            {
                GetComponent<SpriteRenderer>().sprite = Right;
                move = new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.S))
            {
                GetComponent<SpriteRenderer>().sprite = Down;
                move = new Vector3(0, 0, -speed * Time.deltaTime);
            }
    
            transform.position += move;
        }
    }
    

    【讨论】:

    • 感谢您的解释;对我的代码进行了一些调整,现在它可以工作了!
    【解决方案2】:

    首先,您应该缓存 SpriteRenderer,在这里您最多可以调用 4 次 GetComponent 来进行移动。

    然后,您不想直接设置对象的位置,而是移动它。你可以做 transform.Translate(move),或者 transform.position += move;

    edit :您可能应该根据最终动作分配精灵。在这里,您将每次都覆盖它,因为您的 ifs 不是排他性的

    【讨论】:

      【解决方案3】:

      解决方案:

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class PlayerMovement : MonoBehaviour
      {
      
          public Sprite Up;
          public Sprite Down;
          public Sprite Right;
          public Sprite Left;
          public float speed;
      
      
      
          // Update is called once per frame
          void Update()
          {
      
              Vector3 move;
      
              if (Input.GetKey(KeyCode.W))
              {
                  GetComponent<SpriteRenderer>().sprite = Up;
                  move = new Vector2(0, speed * Time.deltaTime);
      
                  transform.position += move;
              }
              if (Input.GetKey(KeyCode.A))
              {
                  GetComponent<SpriteRenderer>().sprite = Left;
                  move = new Vector2(speed * Time.deltaTime, 0);
      
                  transform.position -= move;
              }
              if (Input.GetKey(KeyCode.D))
              {
                  GetComponent<SpriteRenderer>().sprite = Right;
                  move = new Vector2(speed * Time.deltaTime, 0);
      
                  transform.position += move;
              }
              if (Input.GetKey(KeyCode.S))
              {
                  GetComponent<SpriteRenderer>().sprite = Down;
                  move = new Vector2(0,speed * Time.deltaTime);
      
                  transform.position -= move;
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        相关资源
        最近更新 更多