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

C#报错CS1525: Invalid expression term '-=' 错误原因排查

CS1525错误原因

这个报错和-=运算符本身合法性无关,是语法使用错误:-=是复合赋值运算符,只能作用于已经完成声明的变量,你写的float attackCD -= time.DeltaTime;在语句开头加了float关键字,相当于要在这行重新声明一个同名新变量,而C#不允许在变量声明语句中直接使用-=做初始化赋值,因此触发编译错误。

除了直接导致编译失败的语法问题,你的代码还有3个会导致功能完全异常的逻辑bug:

  • 冷却判定逻辑写反:初始attackCD值为0.2,你设置的触发条件是attackCD < 0,初始状态下冷却值大于0,永远无法进入攻击触发分支;且攻击触发后没有重置冷却的逻辑,就算数值跑对也只能触发一次。
  • 变量作用域错误:你在if代码块内部写int animation = 2;、int animation = 1;,相当于在if的局部作用域下声明了全新的animation变量,和外部控制动画状态的全局animation变量完全独立,赋值不会修改外部状态,动画切换永远不会生效。
  • 分支判断逻辑错误:两个动画判断用了独立的if而非else if,当animation值为1进入第一个分支修改局部变量为2后,会立刻命中第二个if分支,同一帧内同时触发两段动画播放。
修正后参考代码

注意冷却、动画状态变量需要声明在帧循环方法外部,避免每帧重置:

// 类字段,声明在Update等帧更新方法外部
float attackCD = 0.2f;
int animationState = 1;

void Update()
{
    // 每帧递减冷却,不要加float重复声明变量
    attackCD -= Time.DeltaTime;

    // 示例:按下鼠标左键且冷却结束时触发攻击,输入判断根据你的项目逻辑调整
    if (Input.GetMouseButtonDown(0) && attackCD <= 0)
    {
        if (animationState == 1)
        {
            Player.Play("SwordSwing", 0, 0.0f);
            animationState = 2;
        }
        else if (animationState == 2)
        {
            Player.Play("SwordSwing2", 0, 0.0f);
            animationState = 1;
        }
        // 触发攻击后重置冷却
        attackCD = 0.2f;
    }
}

额外注意:如果你用的是Unity引擎,时间类的正确写法是Time.deltaTime(小写d),写Time.DeltaTime也会触发编译错误,注意API大小写匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:45:39