仅适用于 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);
我有问题我想让我的播放器朝 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);