Unity中if语句用%运算符触发CS0029错误的解决方法
问题修复方案
错误原因
CS0029错误的本质是:C#要求if语句的条件必须是布尔值(true/false),但你写的logic.speedPoints % 10返回的是整数类型的余数(比如10%10=0,11%10=1),无法直接转换为布尔值,所以触发类型不匹配错误。
此外,原代码还有逻辑漏洞:如果只判断余数为0,Update函数每帧都会执行这个判断,会导致moveSpeed在speedPoints为10的所有帧里持续累加,而不是只在speedPoints首次达到10的倍数时加1。
修复步骤
- 修正
if条件,明确判断余数是否等于0,将条件改为logic.speedPoints % 10 == 0 - 添加一个私有变量记录上一次触发加速时的
speedPoints值,避免重复触发
修复后的完整代码
PipeMoveScript
using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; public class PipeMoveScript : MonoBehaviour { public float moveSpeed = 1; public float deadZone = -45; public bird_script bird; public LogicScript logic; // 新增:记录上一次触发加速的speedPoints值 private int lastTriggeredSpeedPoints = 0; void Start() { bird = GameObject.FindGameObjectWithTag("Bird").GetComponent<bird_script>(); logic = GameObject.FindGameObjectWithTag("Logic").GetComponent<LogicScript>(); } void Update() { // 修正条件:判断余数为0,且当前speedPoints未触发过加速 if (logic.speedPoints % 10 == 0 && logic.speedPoints != lastTriggeredSpeedPoints) { moveSpeed += 1; // 更新触发记录,避免重复累加 lastTriggeredSpeedPoints = logic.speedPoints; } if (bird.birdIsAlive == true) { transform.position += (Vector3.left * moveSpeed) * Time.deltaTime; } if (transform.position.x < deadZone) { Destroy(gameObject); } } }
关键修改点说明
- 新增
lastTriggeredSpeedPoints变量:用于记录已经触发过加速的speedPoints值,确保每个10的倍数只触发一次加速 - 修改
if条件:同时判断余数为0和当前值未被触发过,既解决类型错误,又修复重复累加的逻辑问题 - 简化赋值语句:将
moveSpeed = moveSpeed +1替换为更简洁的moveSpeed +=1,效果完全一致
内容的提问来源于stack exchange,提问作者Andrea Colombo
相关产品推荐
相关产品推荐

