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

Unity 射击游戏拖拽发射玩法的力度条实现问题求助

射击游戏力度条功能问题排查与修复

现有代码核心问题

  • 力度值计算逻辑错误:当前直接对X、Y分量单独做0下限的Clamp再相加,仅在往第一象限(右上方向)拖拽时能得到有效数值,其余方向拖拽时分量为负会被截断为0,出现力度不显示、数值完全不符合预期的问题。且分量直接相加的计算方式不符合物理合力的大小规则,会出现相同拖拽长度、不同方向得到的力度值不一样的问题。
  • 计算逻辑和实际发力逻辑不同步:当前powerDisplay的计算和已经做好区间限制的force变量完全脱节,会出现力度条显示数值和实际发射力度不一致的偏差。
  • 输出值不适合直接给UI使用:当前得到的powerDisplay是原始坐标差值,没有归一化到0-1的区间,没法直接赋值给通用的进度条UI组件。

修复后的核心代码

if (Input.GetMouseButton(0))
{
    currentPoint = cam.ScreenToWorldPoint(Input.mousePosition);
    currentPoint.z = 2;
    tl.RenderLine(startPoint, currentPoint);

    // 计算拖拽方向向量
    Vector2 dragOffset = startPoint - currentPoint;
    // 对向量整体做力度区间限制,保证不同方向相同拖拽长度力度一致
    force = Vector2.ClampMagnitude(dragOffset, minPower.magnitude, maxPower.magnitude);
    // 计算归一化的力度百分比,可直接赋值给Slider的value属性用做力度条显示
    float maxForceValue = maxPower.magnitude;
    powerDisplay = force.magnitude / maxForceValue;
    Debug.Log($"当前力度进度:{powerDisplay:P0}");
}

适配说明

如果你原来的minPower、maxPower是要单独限制X、Y轴的发力阈值,不需要统一限制向量长度,可以把Vector2.ClampMagnitude换回你原来的分量Clamp逻辑,只需要替换powerDisplay的计算逻辑即可:

force = new Vector2(Mathf.Clamp(startPoint.x - currentPoint.x, minPower.x, maxPower.x), Mathf.Clamp(startPoint.y - currentPoint.y, minPower.y, maxPower.y));
// 直接取force的模长计算即可
powerDisplay = force.magnitude / (new Vector2(maxPower.x, maxPower.y).magnitude);

内容的提问来源于stack exchange,提问作者Deepak Bohra

相关产品推荐
方舟 Agent Plan

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

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