我正在 Build 一个自上而下的射手,所以我把我的相机放在我的播放器和 Map 上方 . 这是我在播放器控制器脚本中编写的用于移动的代码:
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键移动播放器并按照鼠标所在的方向旋转,但是我不希望播放器的旋转改变键的方向,我需要播放器移动如果按下W键,无论玩家面对哪个方向,都可以转发 .
但是由于某种原因,我的代码会让玩家向前移动,具体取决于我不想要的方式 .
我怎样才能解决这个问题?
2 回答
问题是你的transform.Translate调用是在“自我”空间 . 前向,后向,左,右都是相对于变换面向的方向 . 这就是为什么你的球员相对于面向方向移动的原因 .
如果要相对于“全局”或“世界”空间进行转换,则必须添加其他参数 .
请注意最后的
Space.World
参数,以设置世界坐标系 . 您可以在Unity文档中找到更多信息:https://docs.unity3d.com/ScriptReference/Transform.Translate.html您需要查看局部坐标系和全局坐标系之间的区别 .
现在您的WASD键正在根据全局坐标移动玩家角色,并且您希望WASD移动取决于玩家的方向,因此您需要使用本地坐标系 .
http://wiki.unity3d.com/index.php?title=Converting_Between_Coordinate_Systems