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

Unity SellItem脚本积分累加异常及maxScore失效问题求助

问题分析与解决方案

核心问题

  1. 积分无法累加:每个挂载SellItem脚本的物品都维护独立的score变量,售卖不同物品时,各自脚本仅更新自身的score,而非全局共享的积分值,导致积分看起来被覆盖。
  2. maxScore功能失效:每个脚本的maxScore独立且初始值仅为10,即便累加也会被当前脚本的maxScore限制,无法实现全局最大积分控制。

修复方案

采用全局共享的积分管理机制,通过单例类实现更规范的全局状态管理:

步骤1:创建全局积分管理器

新建ScoreManager.cs脚本,统一处理积分存储与UI更新:

using UnityEngine;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance; // 单例实例
    public TextMeshProUGUI scoreText; 
    public int maxScore = 100; // 全局最大积分
    private int currentScore = 0;

    private void Awake()
    {
        // 确保全局仅存在一个实例
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
        UpdateScoreUI();
    }

    // 外部调用的积分增加方法
    public void AddScore(int value)
    {
        currentScore = Mathf.Min(currentScore + value, maxScore);
        UpdateScoreUI();
    }

    private void UpdateScoreUI()
    {
        if (scoreText != null)
        {
            scoreText.text = "Score: " + currentScore;
        }
    }
}

步骤2:修改原SellItem脚本

移除原脚本中独立的积分相关变量,改为调用全局管理器的方法:

using UnityEngine;

public class SellItem : MonoBehaviour
{
    public GameObject itemToSell;
    public int scoreValue = 10; // 当前物品的积分值
    private UnityEngine.Object explosion;

    private void Start()
    {
        explosion = Resources.Load("explosion");
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.E) && IsCursorOverObject(itemToSell))
        {
            SellObject();
        }
    }

    private bool IsCursorOverObject(GameObject obj)
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit))
        {
            return hit.transform.gameObject == obj;
        }
        return false;
    }

    private void SellObject()
    {
        GameObject explosionRef = (GameObject)Instantiate(explosion);
        explosionRef.transform.position = transform.position;

        Destroy(itemToSell);
        // 调用全局管理器增加积分
        ScoreManager.Instance.AddScore(scoreValue);
    }
}

步骤3:场景配置

  1. 在场景中创建空物体并命名为ScoreManager,挂载ScoreManager.cs脚本。
  2. 将UI的scoreText拖入ScoreManager组件的对应字段。
  3. 根据需求设置maxScore数值。
  4. 为每个可售卖物品的SellItem组件,正确配置itemToSell和scoreValue。

关键说明

  • 单例模式确保全局只有一个积分管理器实例,所有物品的积分操作共享同一状态。
  • 分离积分管理与物品售卖逻辑,代码结构更清晰,后续扩展积分消耗、排行榜等功能更便捷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:21