如何用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
相关产品推荐
相关产品推荐

