You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:10:29