如何在点击鼠标时让2D Rigidbody平滑移动到鼠标位置
解决Unity 2D刚体朝向鼠标位置施加力的平滑移动问题
我来帮你搞定这个鼠标控制2D刚体移动的问题!先梳理下你当前代码里的核心问题,再直接上可运行的解决方案:
你的现有代码里有几个关键误区:
- 直接用
GameObject.Find("Camera")效率极低,且场景多相机时容易出错,改用Camera.main更稳妥(记得给主相机打上MainCamera标签) Input.mousePosition是屏幕像素坐标,不是游戏世界坐标,直接用它计算方向完全不对- 每帧重复查找
room组件会拖慢性能,应该提前缓存
下面是修正后的完整代码,我会逐行解释关键逻辑:
// 提前缓存常用组件,避免每帧重复查找 private Camera mainCamera; private room playerRoom; private Rigidbody2D rb; void Start() { mainCamera = Camera.main; // 假设这个脚本挂在玩家物体上,若不是请自行调整获取刚体的方式 rb = GetComponent<Rigidbody2D>(); // 缓存room组件,只查找一次 playerRoom = mainCamera.GetComponent<room>(); } void Update() { Vector2 mousePos = Input.mousePosition; if (playerRoom.playerNum == 1) { if (Input.GetMouseButtonDown(0)) { // 关键步骤1:把屏幕鼠标坐标转换成游戏世界坐标 // 正交相机需要设置Z值(取相机到物体的距离,这里用相机负Z值即可) Vector3 worldMousePos = mainCamera.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -mainCamera.transform.position.z)); Vector2 targetPos = new Vector2(worldMousePos.x, worldMousePos.y); // 关键步骤2:计算刚体到鼠标位置的方向向量,归一化后保证方向稳定 Vector2 moveDirection = (targetPos - rb.position).normalized; // 关键步骤3:施加平滑移动的力,力的大小可根据需求调整 float forceMagnitude = 500f; rb.AddForce(moveDirection * forceMagnitude, ForceMode2D.Force); } } }
核心细节说明:
- 坐标转换:
ScreenToWorldPoint必须传入Z值,因为屏幕坐标是2D的,要对应到3D世界的Z平面,正交相机下用-mainCamera.transform.position.z就能得到正确的世界位置 - 方向归一化:如果不归一化,鼠标离刚体越远,施加的力就越大,移动速度会忽快忽慢;归一化后力的大小只由你设置的
forceMagnitude控制 - 力的模式:
ForceMode2D.Force是基于帧率的平滑力,适合持续移动;如果需要瞬间爆发的移动效果,可以改用ForceMode2D.Impulse - 组件缓存:把
Camera、Rigidbody2D、room组件在Start里缓存,避免每帧调用Find或GetComponent,大幅提升性能
如果还是没效果,可以检查这几点:
- 玩家物体上是否确实挂了
Rigidbody2D组件,且没有勾选Kinematic(运动学刚体不会受外力影响) - 主相机是否正确设置了
MainCamera标签,否则Camera.main会返回null - 根据物体质量调整
forceMagnitude的数值,找到适合你游戏的力度
内容的提问来源于stack exchange,提问作者ArdenyUser
相关产品推荐
相关产品推荐

