如何在Unity中使用WASD移动2D对象

时间:2017-10-15 22:59:51

标签: c# unity3d monodevelop unity3d-2dtools

下面的代码仅适用于水平移动。垂直运动也不应该起作用吗?我刚刚开始使用基本的2D Unity编程:

public class Player : MonoBehaviour {

    //These fields will be exposed to Unity so the dev can set the parameters there
    [SerializeField] private float speed = 1f;
    [SerializeField] private float upY;
    [SerializeField] private float downY;
    [SerializeField] private float leftX;
    [SerializeField] private float rightX;

    private Transform _transformY;
    private Transform _transformX;
    private Vector2 _currentPosY;
    private Vector2 _currentPosX;

    // Use this for initialization
    void Start () {
        _transformY = gameObject.GetComponent<Transform> ();
        _currentPosY = _transformY.position;        

        _transformX = gameObject.GetComponent<Transform> ();
        _currentPosX = _transformX.position;
    }

    // Update is called once per frame
    void Update () {
        _currentPosY = _transformY.position;
        _currentPosX = _transformX.position;

        float userInputV = Input.GetAxis ("Vertical");
        float userInputH = Input.GetAxis ("Horizontal");

        if (userInputV < 0) 
            _currentPosY -= new Vector2 (0, speed);     

        if (userInputV > 0)
            _currentPosY += new Vector2 (0, speed);

        if (userInputH < 0)
            _currentPosX -= new Vector2 (speed, 0);

        if (userInputH > 0)
            _currentPosX += new Vector2 (speed, 0);

        CheckBoundary ();

        _transformY.position = _currentPosY;
        _transformX.position = _currentPosX;
    }

    private void CheckBoundary(){
        if (_currentPosY.y < upY)
            _currentPosY.y = upY;

        if (_currentPosY.y > downY)
            _currentPosY.y = downY;

        if (_currentPosX.x < leftX)
            _currentPosX.x = leftX;

        if (_currentPosX.x > rightX)
            _currentPosX.x = rightX;
    }
}

如果我删除/注释掉_currentPosX及其相关代码,则我的垂直移动有效。但是,如果我删除/注释掉_currentPosY及其相关代码,那么我的水平移动就可以了。

但是我怎么会在同时让他们上班的时候遇到麻烦呢?我想我只是错过了一些东西,但我无法弄明白,因为我只是一个初学者。

感谢无论谁提出建议。

编辑:进一步澄清......

我编写了一个简单的2D游戏,让玩家使用WASD键在4个方向上移动。

W = move up
A = move left
S = move down
D = move right

我的主要问题是我可以让两个键仅在一个轴上工作:A和D用于水平,而W和S根本不用于垂直移动,反之亦然。

2 个答案:

答案 0 :(得分:3)

您不需要那些if语句。只需使用+=将输入附加到当前变换位置。

在没有Rigidbody的情况下移动:

public float speed = 100;
public Transform obj;

public void Update()
{
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");

    Vector3 tempVect = new Vector3(h, v, 0);
    tempVect = tempVect.normalized * speed * Time.deltaTime;

    obj.transform.position += tempVect;
}

使用Rigidbody2D移动对象:

public float speed = 100;
public Rigidbody2D rb;

public void Update()
{
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");

    Vector3 tempVect = new Vector3(h, v, 0);
    tempVect = tempVect.normalized * speed * Time.deltaTime;
    rb.MovePosition(rb.transform.position + tempVect);
}

如果您希望稍后能够检测到collison,我建议使用第二个代码并移动Rigidbody。

注意

您必须指定对象移动到编辑器中的obj插槽。如果使用第二个代码,请将带有Rigidbody2D的对象分配到编辑器中的rb插槽。

答案 1 :(得分:0)

尝试将Vector2函数中的值0更改为当前的x / y位置...我的项目遇到了类似的问题

if (userInputV < 0) 
        _currentPosY -= new Vector2 (/*current position*/, speed);