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

Unity关卡切换时分数被覆盖而非累加的问题求助

问题修复:分数累加功能实现

问题场景

玩家进入关卡收集燃油罐,交付燃油至大油箱后加载下一关,当前收集的燃油需清零;但第二关交付燃油时,总分数被覆盖而非累加,需实现分数持续累加的功能。

原代码问题分析

  1. 总分采用直接赋值(score = collectedfuel)而非累加逻辑,导致每次交付都会覆盖之前的累计分数
  2. 关卡切换后未重置fuelDelivered状态,可能引发异常跳转
  3. 新关卡加载后未重新获取GasTransfer和LevelLoader组件引用
  4. 交付完成后未清零当前收集的collectedfuel,影响下一关的收集计数逻辑

修改后的完整代码

using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager instance;

    // 脚本引用
    GasTransfer gt;
    LevelLoader levelLoader;
    // UI文本引用
    public Text ScoreText;
    public Text StoredFuel;
    // 数据变量
    public int collectedfuel = 0;
    private int totalScore; // 存储累计总分,变量名更清晰
    public int storedFuel;
    public bool fuelDelivered;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != null)
            Destroy(gameObject);
    }

    private void Start()
    {
        // 初始化组件引用与状态
        RefreshComponentReferences();
        fuelDelivered = false;
        UpdateScoreUI();
    }

    // 统一获取组件引用的方法
    private void RefreshComponentReferences()
    {
        gt = FindObjectOfType<GasTransfer>();
        levelLoader = FindObjectOfType<LevelLoader>();
    }

    // 关卡加载完成后重置状态与引用
    private void OnLevelWasLoaded(int level)
    {
        RefreshComponentReferences();
        fuelDelivered = false;
        collectedfuel = 0; // 新关卡开始时清零当前收集的燃油
        UpdateScoreUI();
    }

    private void Update()
    {
        // 更新当前收集燃油的UI显示
        ScoreText.text = collectedfuel.ToString();

        if (Input.GetKey(KeyCode.F) && gt.isAtpump && !fuelDelivered)
        {
            // 累加当前收集的燃油到总分
            totalScore += collectedfuel;
            storedFuel = collectedfuel;
            // 更新累计分数UI
            StoredFuel.text = totalScore.ToString();
            fuelDelivered = true;
            // 清零当前收集的燃油,为下一关做准备
            collectedfuel = 0;
        }
         
        if (fuelDelivered)
        {
            gt.pressF.SetActive(false);
            levelLoader.LoadNextLevel();
        }
    }

    public void AddFuel() 
    {
        collectedfuel += 5;
    }

    public void RemoveFuel()
    {
        collectedfuel -= 5;
        if(collectedfuel < 0)
           collectedfuel = 0;
    }

    // 统一更新UI的方法,避免重复代码
    private void UpdateScoreUI()
    {
        ScoreText.text = collectedfuel.ToString();
        StoredFuel.text = totalScore.ToString();
    }
}

关键修改说明

  • 将原score变量重命名为totalScore,明确其存储累计总分的作用
  • 交付燃油时使用totalScore += collectedfuel实现分数累加,替代原有的直接赋值逻辑
  • 添加OnLevelWasLoaded方法,在关卡加载完成后自动重置collectedfuel和fuelDelivered状态,同时重新获取组件引用
  • 新增RefreshComponentReferences方法统一管理组件引用的获取,减少重复代码
  • 在交付判断条件中加入!fuelDelivered,防止重复触发交付逻辑
  • 新增UpdateScoreUI方法统一处理UI更新,确保显示状态正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:34:56