Unity 2D拖拽功能如何添加速度以实现物体扔掷抛掷效果
问题根源
你当前的拖拽逻辑直接修改transform.position,该操作属于直接覆盖物体的位置,不会被Unity物理引擎识别为运动位移,因此Rigidbody2D不会生成对应的运动速度,松开鼠标时物体速度为0,就会直接下落。
代码修改步骤
- 新增速度计算相关变量
在类的变量定义部分新增以下内容:
private Vector2 lastFramePos; private Vector2 throwSpeed; // 可在Inspector面板调整扔掷力度大小 public float throwForceMultiplier = 12f;
- 初始化位置记录
在OnMouseDown方法中,设置isDragging = true后新增一行代码,记录拖拽起始位置:
lastFramePos = transform.position;
- 修改拖拽阶段的位移逻辑,计算瞬时速度
将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); } }
- 松开鼠标时给物体施加扔掷速度
在OnMouseUp方法中,设置rb.gravityScale = 1f后新增一行代码,赋值速度给刚体:
rb.velocity = throwSpeed * throwForceMultiplier;
补充说明
- 操作带Rigidbody组件的物体时,避免直接修改transform属性,优先使用Rigidbody提供的移动方法,否则会出现物理计算异常的问题
- 可根据游戏实际手感调整
throwForceMultiplier的数值,数值越大扔掷力度越强 - 调整
Lerp方法的第三个参数的系数可修改拖拽跟随的灵敏度,系数越大跟随越跟手,越小越有拖拽的沉重感 - 你代码中已经提前获取了Rigidbody2D组件赋值给rb变量,后续可以直接用rb操作,不需要重复调用GetComponent,减少性能开销
内容的提问来源于stack exchange,提问作者Dr. Unventor
相关产品推荐
相关产品推荐

