新手游戏开发求助:如何让Rigidbody沿相机朝向移动?
新手游戏开发求助:如何让Rigidbody沿相机朝向移动?
嘿,作为刚入门游戏开发(甚至连编码都是新手)的小伙伴,我太懂你这种“知道哪里有问题但不知道怎么改”的挠头感了!你的核心问题其实很明确:现在的移动是基于世界坐标系的X/Z轴(不管镜头朝哪,按W都是往世界Z轴正方向走),而不是跟着相机的朝向走。不用重写整个代码,只要改移动逻辑那几行就行,来一步步看:
问题根源
你当前创建的movement是直接用moveValue.x(世界右方向)和moveValue.y(世界前方向)拼出来的Vector3,完全没考虑相机的旋转角度,所以镜头转了之后,移动方向自然和镜头对着的地方不一致。
解决步骤(只改移动部分代码)
把你Update函数里的移动代码段(从Vector2 moveValueraw = ...到body.AddForce(movement);)替换成下面的代码就行,我会每一步解释:
// Moving the player on the X and Z axis Vector2 moveValueraw = moveAction.ReadValue<Vector2>(); // 保留你的移动幅度放大逻辑 Vector2 moveValue = moveValueraw * 5f; // 关键修改:获取相机的水平朝向(忽略Y轴,保持水平移动) // 相机的forward是镜头正前方,把Y轴设为0就只保留水平方向,归一化防止斜向移动速度变快 Vector3 camForward = Vector3.Scale(cam.forward, new Vector3(1, 0, 1)).normalized; // 相机的right是镜头正右方,同样处理Y轴 Vector3 camRight = Vector3.Scale(cam.right, new Vector3(1, 0, 1)).normalized; // 计算基于相机朝向的最终移动方向:前后用相机前方向,左右用相机右方向 Vector3 movement = camForward * moveValue.y + camRight * moveValue.x; // Apply changes body.AddForce(movement); // End of Movement
为什么这样改?
cam.forward是相机的正前方,但默认包含Y轴(比如镜头抬头时前方向会向上),用Vector3.Scale把Y轴清零,就得到了水平的相机前方向cam.right同理,是相机的水平右方向- 最后把前后移动(moveValue.y)和左右移动(moveValue.x)分别映射到这两个方向,相加就是玩家应该移动的正确方向
额外的小提醒(可选,不想改可以忽略)
- 物理逻辑建议放在
FixedUpdate里处理,比如把AddForce的代码移到FixedUpdate,因为Update是每帧调用,FixedUpdate是固定时间步调用,更适合物理操作 - 你当前的相机旋转逻辑直接用欧拉角可能会有“万向锁”问题,而且没有限制抬头低头的角度(比如转成倒立),可以后续改成累计角度再用Quaternion.Euler来设置旋转,比如:
不过这是额外优化,先解决你的核心移动问题就好!// 在Start里初始化camx为0而不是cam.rotation.x camx = 0f; // Update里的旋转逻辑 Vector2 lookValueraw = lookAction.ReadValue<Vector2>(); camx += lookValueraw.x * sensitivity * Time.deltaTime; camy += lookValueraw.y * sensitivity * Time.deltaTime; // 限制X轴旋转(-90到90度,防止倒立) camy = Mathf.Clamp(camy, -90f, 90f); // 玩家绕Y轴转(左右看),相机绕X轴转(上下看) player.rotation = Quaternion.Euler(0, camx, 0); cam.localRotation = Quaternion.Euler(-camy, 0, 0);
内容来源于stack exchange
相关产品推荐
相关产品推荐

