如何让GameObject的移动不受自身旋转影响?
解决俯视角游戏WASD方向不受自身旋转影响的问题
你的问题出在移动时使用了物体自身的局部空间,导致旋转后WASD对应的移动方向跟着改变。要让WASD始终对应固定的世界/相机视角方向,只需要修改移动逻辑,强制使用世界空间进行位移即可。
核心修改思路
默认情况下transform.Translate()使用Space.Self(自身局部空间),物体旋转后局部空间的"前/后/左/右"会跟着旋转。我们只需要在调用Translate时指定Space.World,或者基于相机视角计算世界空间的移动方向,就能让WASD保持固定方向。
方案1:固定世界空间方向(适合相机固定的俯视角)
如果你的相机是固定朝向(比如始终正对着地面,Y轴向下),直接修改移动代码即可:
var dir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); // 强制使用世界空间移动,忽略自身旋转 transform.Translate(dir * _speed * Time.deltaTime, Space.World); // 以下是你原来的朝向鼠标代码,保留不变 GameObjectPosition = Camera.main.WorldToScreenPoint(transform.position); MousePosition = Input.mousePosition; float ObjectToMouseX = GameObjectPosition.x - MousePosition.x; float ObjectToMouseY = GameObjectPosition.y - MousePosition.y; float GameOjectAngle = -90-(float)Mathf.Atan2(ObjectToMouseY, ObjectToMouseX)*(180/Mathf.PI); Vector3 GameObjectRotation = new Vector3(0, GameOjectAngle, 0); transform.eulerAngles = GameObjectRotation;
方案2:基于相机视角的方向(适合可旋转的相机)
如果相机可以旋转(比如玩家能拖动视角),需要基于相机的当前视角计算移动方向,确保WASD始终对应相机画面的"上/下/左/右":
// 获取WASD输入 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 获取相机的水平方向(忽略Y轴,保持在地面平面) Vector3 cameraRight = Camera.main.transform.right; cameraRight.y = 0; cameraRight.Normalize(); Vector3 cameraForward = Camera.main.transform.forward; cameraForward.y = 0; cameraForward.Normalize(); // 组合成相机视角下的移动方向 Vector3 moveDir = cameraRight * horizontal + cameraForward * vertical; if (moveDir.magnitude > 1) moveDir.Normalize(); // 避免斜向移动速度过快 // 沿世界空间移动 transform.Translate(moveDir * _speed * Time.deltaTime, Space.World); // 保留原来的朝向鼠标代码 GameObjectPosition = Camera.main.WorldToScreenPoint(transform.position); MousePosition = Input.mousePosition; float ObjectToMouseX = GameObjectPosition.x - MousePosition.x; float ObjectToMouseY = GameObjectPosition.y - MousePosition.y; float GameOjectAngle = -90-(float)Mathf.Atan2(ObjectToMouseY, ObjectToMouseX)*(180/Mathf.PI); Vector3 GameObjectRotation = new Vector3(0, GameOjectAngle, 0); transform.eulerAngles = GameObjectRotation;
原理说明
Space.World参数让Translate()直接使用世界坐标系的方向,完全不受物体自身旋转的影响。- 方案2中基于相机的
right和forward计算方向,能保证WASD始终对应玩家当前看到的画面方向,即使相机旋转也不会错乱。
内容的提问来源于stack exchange,提问作者HarryMA
相关产品推荐
相关产品推荐

