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

如何用Rigidbody2D实现游戏对象跟随鼠标位置移动?

用Rigidbody2D实现2D鼠标跟随的几种方案

核心注意事项

  • 所有物理相关操作**必须在FixedUpdate()**中执行,不要用Update(),避免物理帧和逻辑帧不同步导致抖动
  • 先把玩家对象的Rigidbody2D组件的gravityScale设为0,防止重力干扰移动
  • 若不需要旋转,可勾选Rigidbody2D的Freeze Rotation Z选项

方案1:瞬间到位(和transform直接赋值手感一致)

用Rigidbody2D.MovePosition()方法直接将刚体移动到目标位置,适合需要精确对齐的场景:

using UnityEngine;

public class MouseFollowRB : MonoBehaviour
{
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        // 将鼠标屏幕坐标转换为世界坐标(2D平面)
        Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // 移动刚体到目标位置
        rb.MovePosition(mouseWorldPos);
    }
}

方案2:平滑缓动跟随(带加速度/减速,手感更自然)

通过计算当前位置与鼠标位置的差值,设置刚体的velocity实现平滑移动,可通过调整moveSpeed控制移动快慢:

using UnityEngine;

public class SmoothMouseFollowRB : MonoBehaviour
{
    private Rigidbody2D rb;
    public float moveSpeed = 8f; // 控制移动速度

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // 计算目标方向向量
        Vector2 moveDir = mouseWorldPos - rb.position;
        // 归一化方向后乘以速度,设置刚体速度
        rb.velocity = moveDir.normalized * moveSpeed;
    }
}

如果需要更细腻的缓动效果(比如接近目标时减速),可以用插值计算:

void FixedUpdate()
{
    Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    // 用Lerp实现平滑插值,0.1f是缓动系数,值越大越接近瞬间到位
    Vector2 targetPos = Vector2.Lerp(rb.position, mouseWorldPos, 0.1f);
    rb.MovePosition(targetPos);
}

方案3:用AddForce实现物理驱动的跟随

适合需要模拟真实物理手感(比如有惯性)的场景,可通过forceMultiplier调整力度:

using UnityEngine;

public class PhysicsMouseFollowRB : MonoBehaviour
{
    private Rigidbody2D rb;
    public float forceMultiplier = 5f;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 moveDir = mouseWorldPos - rb.position;
        // 添加方向力
        rb.AddForce(moveDir.normalized * forceMultiplier);
        // 可选:限制最大速度,防止刚体无限加速
        if (rb.velocity.magnitude > 10f)
        {
            rb.velocity = rb.velocity.normalized * 10f;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:29