Unity 2D游戏如何实现朝鼠标方向施加AddForce力的功能
问题原因分析
- 逻辑时机错误:现有代码在鼠标按下瞬间就施力,不符合「拖拽释放后再施力」的需求
- 向量计算错误:Y轴分量错误减去了
rb.transform.position.x而非Y轴坐标,导致方向计算完全错乱,这也是点击下半部分始终向下施力的核心原因 - 没有存储拖拽状态:无法正确对应拖拽动作的起止时机
修复后的实现方案
// 自行在Inspector面板调整力的大小乘数 public float multiplier = 10f; // 2D相机引用,提前赋值或者在Awake中获取 public Camera cam; public Rigidbody2D rb; // 标记是否处于拖拽状态 private bool isDragging = false; private void Update() { // 鼠标按下时标记拖拽开始 if (Input.GetMouseButtonDown(0)) { isDragging = true; } // 鼠标抬起时计算方向施力 if (Input.GetMouseButtonUp(0) && isDragging) { isDragging = false; // 转换屏幕坐标到世界坐标,2D场景下固定Z轴为0避免计算偏差 Vector3 mouseWorldPos = cam.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = 0; // 正确计算鼠标位置相对于玩家的方向向量 Vector2 forceDir = new Vector2( mouseWorldPos.x - rb.transform.position.x, mouseWorldPos.y - rb.transform.position.y ); // 可选:归一化方向向量,让力的大小只和multiplier有关,不受拖拽距离影响 // forceDir = forceDir.normalized; // 对玩家施力 rb.AddForce(forceDir * multiplier); Debug.Log("施加力的方向:" + forceDir); } }
注意事项
- 如果想让轻推的力度和拖拽距离正相关,删除归一化代码的注释即可;如果想任意距离拖拽力度一致,保留归一化逻辑
- 要确认
cam是渲染玩家所在2D平面的正交相机,避免坐标转换出现偏差 - 如果玩家挂载了动态父物体,统一用世界坐标计算方向即可,不要使用本地坐标
内容的提问来源于stack exchange,提问作者josh beyer
相关产品推荐
相关产品推荐

