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

Unity 2D拖拽功能如何添加速度以实现物体扔掷抛掷效果

问题根源

你当前的拖拽逻辑直接修改transform.position,该操作属于直接覆盖物体的位置,不会被Unity物理引擎识别为运动位移,因此Rigidbody2D不会生成对应的运动速度,松开鼠标时物体速度为0,就会直接下落。


代码修改步骤

  1. 新增速度计算相关变量
    在类的变量定义部分新增以下内容:
private Vector2 lastFramePos;
private Vector2 throwSpeed;
// 可在Inspector面板调整扔掷力度大小
public float throwForceMultiplier = 12f;
  1. 初始化位置记录
    在OnMouseDown方法中,设置isDragging = true后新增一行代码,记录拖拽起始位置:
lastFramePos = transform.position;
  1. 修改拖拽阶段的位移逻辑,计算瞬时速度
    将FixedUpdate中拖拽部分的逻辑替换为以下内容:
if(isDragging)
{
    Vector2 targetPos = new Vector2(mousePos.x, mousePos.y);
    // 用Rigidbody提供的MovePosition方法移动,符合物理引擎规则
    rb.MovePosition(Vector2.Lerp(transform.position, targetPos, 15f * Time.fixedDeltaTime));
    // 计算当前拖拽的瞬时速度
    throwSpeed = (targetPos - lastFramePos) / Time.fixedDeltaTime;
    lastFramePos = targetPos;

    if (Input.GetAxis("Mouse ScrollWheel") > 0f )
    {
        transform.Rotate(0, 0, 10f);
    }
    else if (Input.GetAxis("Mouse ScrollWheel") < 0f )
    {
        transform.Rotate(0, 0, -10f);
    }
}
  1. 松开鼠标时给物体施加扔掷速度
    在OnMouseUp方法中,设置rb.gravityScale = 1f后新增一行代码,赋值速度给刚体:
rb.velocity = throwSpeed * throwForceMultiplier;

补充说明

  • 操作带Rigidbody组件的物体时,避免直接修改transform属性,优先使用Rigidbody提供的移动方法,否则会出现物理计算异常的问题
  • 可根据游戏实际手感调整throwForceMultiplier的数值,数值越大扔掷力度越强
  • 调整Lerp方法的第三个参数的系数可修改拖拽跟随的灵敏度,系数越大跟随越跟手,越小越有拖拽的沉重感
  • 你代码中已经提前获取了Rigidbody2D组件赋值给rb变量,后续可以直接用rb操作,不需要重复调用GetComponent,减少性能开销

内容的提问来源于stack exchange,提问作者Dr. Unventor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:54:06