Unity3D行星重力游戏:实现角色朝向移动方向并整合至移动代码
实现行星重力游戏中角色朝向移动方向的功能
嘿,我来帮你把角色朝向移动方向的功能整合到现有代码里!考虑到你的游戏带行星重力机制,我们得额外处理角色的「向上」方向(始终背离行星中心),避免旋转后角色姿态怪异,同时确保移动方向严格贴合行星表面的切线平面。
修改后的完整代码
using UnityEngine; public class PlayerMovementScript : MonoBehaviour { public float moveSpeed; public Transform planet; // 拖拽你的行星对象到这个字段(推荐做法) private Vector3 moveDirection; private Vector3 upDirection; // 角色的"向上"方向(始终背离行星中心) void Start() { // 可选:如果没手动拖拽行星,自动查找带"Planet"标签的对象 if (planet == null) { planet = GameObject.FindWithTag("Planet")?.transform; if (planet == null) { Debug.LogError("没有找到行星对象!请给行星添加\"Planet\"标签或手动拖拽到字段中"); } } } void Update() { if (planet == null) return; // 计算角色的向上方向(确保始终"站"在行星表面) upDirection = (transform.position - planet.position).normalized; // 获取玩家的输入向量 Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized; // 将输入向量转换为世界空间方向,并投影到行星表面的切线平面 // 这样移动只会在行星表面进行,不会往行星中心/外偏移 Vector3 worldSpaceInput = transform.TransformDirection(input); moveDirection = Vector3.ProjectOnPlane(worldSpaceInput, upDirection).normalized; // 只有当有有效移动输入时,才旋转角色朝向移动方向 if (moveDirection.magnitude > 0.1f) { // 计算目标旋转:朝向移动方向,同时保持up方向为背离行星的方向 Quaternion targetRotation = Quaternion.LookRotation(moveDirection, upDirection); // 平滑旋转,调整10f可以改变旋转速度(数值越大转得越快) transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * 10f); } } void FixedUpdate() { if (planet == null || moveDirection.magnitude < 0.1f) return; Rigidbody rb = GetComponent<Rigidbody>(); // 使用处理后的moveDirection进行移动(已经是世界空间的切线方向) rb.MovePosition(rb.position + moveDirection * moveSpeed * Time.deltaTime); } }
关键改动说明
- 行星向上方向处理:通过
transform.position - planet.position计算出背离行星中心的方向,确保角色无论在行星哪个位置,都能保持正确的站立姿态,旋转时不会出现倒悬或偏移。 - 切线平面投影:用
Vector3.ProjectOnPlane把输入方向投影到垂直于向上方向的平面,彻底避免移动时角色往行星内部钻或向外飘的问题。 - 平滑旋转逻辑:使用
Quaternion.Lerp实现自然的旋转过渡,你可以根据游戏手感调整Time.deltaTime * 10f中的数值,数值越大旋转越灵敏。 - 空输入判断:只有当移动输入的强度超过0.1f(过滤输入死区)时才触发旋转,避免角色在静止时出现不必要的晃动。
额外提示
- 记得给你的行星对象添加
Planet标签(或者手动拖拽到脚本的planet字段),这样脚本才能正确获取行星的位置。 - 如果你的行星重力是通过自定义脚本实现的,确保这个朝向逻辑和重力逻辑的方向保持一致,避免出现冲突。
内容的提问来源于stack exchange,提问作者Caden Serrato
相关产品推荐
相关产品推荐

