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
相关产品推荐
相关产品推荐

