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

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(过滤输入死区)时才触发旋转,避免角色在静止时出现不必要的晃动。

额外提示

  1. 记得给你的行星对象添加Planet标签(或者手动拖拽到脚本的planet字段),这样脚本才能正确获取行星的位置。
  2. 如果你的行星重力是通过自定义脚本实现的,确保这个朝向逻辑和重力逻辑的方向保持一致,避免出现冲突。

内容的提问来源于stack exchange,提问作者Caden Serrato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:48