2017-10-15 231 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