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

Unity赛车游戏中漂移分数(Drift Score)计算与重置异常问题:主分数随漂移再次触发时被重置的修复方法

修复漂移分数累加时mainScore被重置的问题

看起来你已经把基础框架搭起来了,但核心逻辑里有几个小问题导致了mainScore被意外重置。让我帮你拆解一下问题,然后一步步修复:

问题根源分析

  • 错误的赋值逻辑:在CarDrift方法里,你每帧都执行mainScore = driftScore;——这是把mainScore直接替换成当前的updatingScore,而不是累加。而且当再次触发漂移时,updatingScore一开始是0,所以mainScore直接被设为0了。
  • 过早的分数重置:你在漂移开始时就启动了ScoreReset协程,不管漂移是否还在持续,2秒后就会重置分数。这不仅会打断漂移过程中的分数累加,还可能导致后续逻辑混乱。
  • 漂移结束的判断冗余:else if(carController.instance.driftingNow == false)里的instance是多余的,直接用carController.driftingNow就可以了,而且应该改成普通的else(因为前面已经判断了carController不为null,且漂移状态只有true/false两种)。

修复后的完整代码

我调整了逻辑,让分数只在漂移结束时才累加到mainScore,并且重置updatingScore:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class ScoreManager : MonoBehaviour
{
    public int mainScore;
    public int updatingScore;
    private int driftScore;
    public Text updatingScoreText;
    public Text mainScoreText;
    private GameManager gameManager;
    private RCC_CarControllerV3 carController;
    // 新增变量跟踪上一帧的漂移状态,避免重复触发逻辑
    private bool wasDrifting = false;

    private void Awake()
    {
        gameManager = GetComponent<GameManager>();
        updatingScoreText.DOFade(0, 0);
    }

    private void Start()
    {
        mainScore = 0;
        driftScore = 0;
        updatingScore = 0;
        // 初始化分数显示
        UpdateScore();
    }

    private void Update()
    {
        if(carController == null)
            carController = FindObjectOfType<RCC_CarControllerV3>();
        
        if (carController != null)
        {
            CheckDriftState();
        }
        UpdateScore();
    }

    void UpdateScore()
    {
        mainScoreText.text = mainScore.ToString();
        updatingScoreText.text = updatingScore.ToString();
    }

    void ResetScore()
    {
        updatingScore = 0;
        driftScore = 0;
        updatingScoreText.text = updatingScore.ToString();
    }

    void CheckDriftState()
    {
        bool isDriftingNow = carController.driftingNow;

        // 漂移开始时:显示分数文本
        if (isDriftingNow && !wasDrifting)
        {
            updatingScoreText.DOFade(1, 2f);
            wasDrifting = true;
        }
        // 漂移进行中:持续累加分数
        else if (isDriftingNow && wasDrifting)
        {
            updatingScore++;
            driftScore = updatingScore;
        }
        // 漂移结束时:累加分数到mainScore,重置updatingScore并隐藏文本
        else if (!isDriftingNow && wasDrifting)
        {
            updatingScoreText.DOFade(0, 2f);
            // 核心修正:累加而非赋值
            mainScore += driftScore;
            ResetScore();
            wasDrifting = false;
        }
    }
}

关键修改点说明

  • 新增wasDrifting变量:用来精准捕捉漂移的开始和结束时刻,避免每帧重复执行相同逻辑。
  • 拆分漂移状态逻辑:把漂移分为「开始」「进行中」「结束」三个阶段,分别处理:
    • 开始时只做显示初始化
    • 进行中只累加分数
    • 结束时才将漂移分数累加到mainScore,然后重置updatingScore
  • 移除错误的赋值和协程:删掉了mainScore = driftScore;和StartCoroutine(ScoreReset());,改用漂移结束事件触发分数累加和重置,逻辑更清晰可靠。
  • 优化代码结构:把分数更新和漂移状态检查的逻辑拆分,代码可读性更强。

这样修改后,你就能实现需求:漂移时updatingScore持续增加,漂移结束时将updatingScore加到mainScore,然后重置updatingScore为0,而且再次漂移时mainScore不会被重置了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:12:32