2017-10-15 488 views
1

我的代码仅适用于水平移动。垂直运动不应该工作吗?我刚开始学习基本的2D统一规划:如何在Unity中使用WASD移动2D对象

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不工作在所有的垂直运动,反之亦然。

+0

你能描述一下你的控制吗? WASD用于什么? – Programmer

+0

只是在2D游戏画面(精灵)中向上,向下,向左,向右移动 – 5120bee

+0

对象是否具有rigidbody2d? – Programmer

回答

2

您不需要这些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); 
} 

我建议使用第二码和移动刚体,如果你希望能够以后检测科里森。

注意

你必须将物体移动到在编辑器中obj插槽。如果使用第二个代码,请将编号为Rigidbody2D的对象分配给编辑器中的rb插槽。

+0

什么Time.deltaTime做,我还可以使用我的CheckBoundary();防止玩家离开相机屏幕视图边界的功能? – 5120bee

+0

它确保每个设备/计算机上的移动速度都是相同的。有些设备比其他设备更快。如果没有这些,那么玩家就会因为他们的角色会变得更快而与快速的电脑进行对抗,这是不公平的。至于你的第二个问题,是的。如果你不能做到这一点,那就创造一个关于限制玩家移动到一些边界的新问题。 – Programmer