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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:15:07