Unity3D布尔值使用问题:蹲下时无法禁用玩家冲刺功能
问题分析与修复方案
你的核心问题出在isCrouching = !isCrouching;这行代码上——它会在每一帧都翻转isCrouching的状态,导致这个布尔值在true和false之间疯狂切换,完全无法正确反映玩家是否处于蹲伏状态,自然让canDash的逻辑彻底失效。
下面是修正后的完整代码,同时保留你原本的平滑蹲伏过渡效果:
bool canDash = true; bool isCrouching = false; bool isCeilingAbove; // 基于Physics.CheckSphere和GameObject的检测结果 // 补全你原代码中应该存在的变量(方便参考) CharacterController cc; float startHeight; float crouchHeight; Vector3 startCenter; Vector3 crouchCenter; float currentCrouchAmount = 0f; float currentCrouchVelocity = 0f; float dashCooldown; void Update() { dashCooldown -= Time.deltaTime; if (isCeilingAbove) { // 有天花板时强制退出蹲伏 currentCrouchAmount = 0f; isCrouching = false; } else { // 平滑过渡蹲伏状态 float crouchTargetValue = Input.GetKey(KeyCode.LeftControl) ? 1f : 0f; currentCrouchAmount = Mathf.SmoothDamp(currentCrouchAmount, crouchTargetValue, ref currentCrouchVelocity, 0.25f); // 应用CharacterController的高度和中心变化 cc.height = Mathf.Lerp(startHeight, crouchHeight, currentCrouchAmount); cc.center = Vector3.Lerp(startCenter, crouchCenter, currentCrouchAmount); // 根据当前蹲伏进度判断是否处于蹲伏状态 // 用0.5作为阈值,过渡到一半以上时判定为蹲伏,可根据手感调整 isCrouching = currentCrouchAmount > 0.5f; } // 控制冲刺权限:蹲伏或头顶有天花板时禁止冲刺 canDash = !isCrouching && !isCeilingAbove; // 冲刺逻辑合并简化 if (canDash && Input.GetKey(KeyCode.V) && dashCooldown <= 0) { StartCoroutine(Dash()); } } IEnumerator Dash() { // 示例:重置冷却时间,替换为你的冲刺逻辑 dashCooldown = 2f; // ... 其他冲刺相关代码 yield return null; }
关键修改说明:
- 删掉了疯狂翻转isCrouching的错误代码,改为基于实际蹲伏进度
currentCrouchAmount判断状态,避免逻辑混乱 - 统一了canDash的判断逻辑,确保只有玩家既不蹲伏、头顶也无障碍物时才允许冲刺
- 合并了分散的条件判断,让代码逻辑更清晰
你的基础蹲伏代码之所以能正常工作,是因为它直接同步输入状态与isCrouching、canDash,没有平滑过渡的中间状态;而平滑过渡版本必须基于实际的蹲伏进度判断,不能直接用输入状态赋值。
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

