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

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。

修复步骤

  1. 修正if条件,明确判断余数是否等于0,将条件改为logic.speedPoints % 10 == 0
  2. 添加一个私有变量记录上一次触发加速时的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:26:16