仅适用于 4 个方向的 2D 运动 left/right

2D Movement for 4 directions only working left/right

我有问题我想让我的播放器朝 4 个方向移动:向上、向下、向左和向右...这是我的脚本

using UnityEngine;
using System.Collections;

public class MovingPlayer : MonoBehaviour {

float speed = 4f;

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

    if (Input.GetKey (KeyCode.A)) {
        transform.Translate(Vector2.right * speed * Time.deltaTime);    
    }
    else if (Input.GetKey (KeyCode.D)) {
        transform.Translate(-Vector2.right * speed * Time.deltaTime);   
    }
    else if (Input.GetKey (KeyCode.W)) {
        transform.Translate(Vector2.up * speed * Time.deltaTime);
    }
    else if (Input.GetKey (KeyCode.S)) {
        transform.Translate(-Vector2.up * speed * Time.deltaTime);  
    }
  }
}

它只对左右起作用,对上下不起作用!?

试试这个,它移动与全局坐标相关的对象:

(...)
else if (Input.GetKey (KeyCode.W)) {
        transform.Translate(0, Vector2.up * speed * Time.deltaTime, Space.World);
    }
    else if (Input.GetKey (KeyCode.S)) {
        transform.Translate(0, -Vector2.up * speed * Time.deltaTime, Space.World);
}

您的代码对所有四个方向都使用 else if。这意味着角色一次只能朝一个方向移动。如果按下 'A',则忽略所有 else 分支。如果按下 'D','W' 和 'S' 分支将被忽略。

在左右或上下切换时使用 else if 是有意义的,因为玩家一次只能在给定轴上的一个方向移动。但是如果条件:

,水平和垂直部分应该是独立的
if (Input.GetKey (KeyCode.A)) {
    transform.Translate(Vector2.right * speed * Time.deltaTime);    
}
else if (Input.GetKey (KeyCode.D)) {
    transform.Translate(-Vector2.right * speed * Time.deltaTime);   
}

if (Input.GetKey (KeyCode.W)) {
    transform.Translate(Vector2.up * speed * Time.deltaTime);
}
else if (Input.GetKey (KeyCode.S)) {
    transform.Translate(-Vector2.up * speed * Time.deltaTime);  
}

我还建议您查看统一文档中的 Input class。输入管理器允许您定义输入轴(基于键盘、鼠标或操纵杆输入),并将它们读取为 [-1, 1] 范围内的连续值。 Unity 定义了两个默认轴,称为 "Horizontal" 和 "Vertical",分别从 AD 和 WS 读取输入。要使用虚拟轴,您可以使用:

transform.Translate(Vector2.right * Input.GetAxis("Horizontal") * Time.deltaTime);
transform.Translate(Vector2.up * Input.GetAxis("Vertical") * Time.deltaTime);