我正在构建一个自上而下的射击游戏,因此我将相机放在我的播放器和地图上方。这是我在播放器控制器脚本中编写的用于移动的代码:
public class playerMovement : MonoBehaviour {
public float speed;
private Camera mainCamera;
void Start () {
mainCamera = FindObjectOfType<Camera>();
}
// Update is called once per frame
void Update () {
// player movement
transform.Translate(speed * Input.GetAxis("Horizontal") * Time.deltaTime, 0f, speed * Input.GetAxis("Vertical") * Time.deltaTime);
// Camera Ray casting
Ray cameraRay = mainCamera.ScreenPointToRay(Input.mousePosition);
Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
float rayLength;
if (groundPlane.Raycast(cameraRay, out rayLength)) {
Vector3 look = cameraRay.GetPoint(rayLength);
Debug.DrawLine(cameraRay.origin, look, Color.red);
transform.LookAt(new Vector3(look.x, transform.position.y, look.z));
}
}
}
我希望能够使用WASD键移动播放器,并按照鼠标所在的方向旋转,但是我不希望播放器的旋转改变键的方向,I如果按下W键无论玩家面对哪个方向,都需要玩家向前移动。
但由于某种原因,我的代码会让玩家向前移动,具体取决于我不想要的方式。
我该如何解决这个问题?
答案 0 :(得分:2)
问题是你的transform.Translate调用是在&#34; self&#34;空间。前向,后向,左,右都是相对于变换面向的方向。这就是为什么你的玩家相对于面向方向移动的原因。
如果你想翻译相对于&#34;全球&#34;或者&#34;世界&#34;空间,你必须添加一个额外的参数。
// player movement
transform.Translate(speed * Input.GetAxis("Horizontal") * Time.deltaTime,
0f,
speed * Input.GetAxis("Vertical") * Time.deltaTime,
Space.World);
注意最后的Space.World
参数,以设置世界坐标系。
您可以在Unity文档中找到更多内容:https://docs.unity3d.com/ScriptReference/Transform.Translate.html
答案 1 :(得分:0)
您需要查看局部坐标系和全局坐标系之间的区别。
现在您的WASD键正在根据全局坐标移动玩家角色,并且您希望WASD移动取决于玩家的方向,因此您需要使用本地坐标系。
http://wiki.unity3d.com/index.php?title=Converting_Between_Coordinate_Systems