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

如何实现跨场景Muon计数器递增及游戏退出后数据持久化

实现Muon收集计数与持久化方案

核心需求

  • 玩家在关卡内触碰Muon对象时,关卡选择场景的全局Muon计数器(格式:已收集数/总数,初始0/15)同步递增
  • 收集数据需支持跨场景、跨游戏会话持久化,退出重启后无需重新收集

分步实现方案

1. 全局Muon数据管理(持久化核心)

创建单例类统一管理收集数,借助Unity的PlayerPrefs实现数据持久化,可整合现有统计脚本逻辑:

public class MuonManager : MonoBehaviour
{
    public static MuonManager Instance;
    public int TotalMuons = 15;
    private int _collectedMuons;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            LoadCollectedData();
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void LoadCollectedData()
    {
        _collectedMuons = PlayerPrefs.GetInt("CollectedMuons", 0);
    }

    public void AddCollectedMuon()
    {
        if (_collectedMuons >= TotalMuons) return;
        _collectedMuons++;
        PlayerPrefs.SetInt("CollectedMuons", _collectedMuons);
        PlayerPrefs.Save();
        UpdateCounterUI();
    }

    public int GetCollectedCount()
    {
        return _collectedMuons;
    }

    private void UpdateCounterUI()
    {
        var counter = FindObjectOfType<MuonCounterUI>();
        if (counter != null)
        {
            counter.UpdateDisplay(_collectedMuons, TotalMuons);
        }
    }
}

2. Muon触碰触发逻辑修改

调整Muon对象的触发脚本,触碰玩家时调用全局管理器的计数方法,同时销毁当前Muon:

public class MuonCollectible : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            MuonManager.Instance.AddCollectedMuon();
            Destroy(gameObject);
        }
    }
}

注意:需给玩家对象添加Player标签,且Muon与玩家的碰撞体中至少有一个勾选IsTrigger

3. 关卡选择场景计数器UI适配

修改原金币计数器脚本(或新建UI脚本),适配Muon计数的显示格式:

public class MuonCounterUI : MonoBehaviour
{
    public Text counterText;

    void Start()
    {
        UpdateDisplay(MuonManager.Instance.GetCollectedCount(), MuonManager.Instance.TotalMuons);
    }

    public void UpdateDisplay(int collected, int total)
    {
        counterText.text = $"{collected}/{total}";
    }
}

若使用C++版本计数器,核心逻辑一致:读取PlayerPrefs存储的数值,更新UI文本为已收集数/总数格式

4. 关卡内Muon防重复收集(可选)

修改关卡统计脚本,标记已收集的Muon,避免玩家重复进入同一关卡收集同一对象:

public class LevelMuonStats : MonoBehaviour
{
    public List<GameObject> levelMuons;

    void Start()
    {
        int collectedTotal = MuonManager.Instance.GetCollectedCount();
        foreach (var muon in levelMuons)
        {
            if (PlayerPrefs.GetInt($"Muon_{muon.GetInstanceID()}", 0) == 1)
            {
                Destroy(muon);
            }
        }
    }

    // 在MuonCollectible的触发方法中调用此方法
    public void MarkMuonCollected(GameObject muon)
    {
        PlayerPrefs.SetInt($"Muon_{muon.GetInstanceID()}", 1);
        PlayerPrefs.Save();
    }
}

关键注意事项

  • 确保MuonManager在游戏启动时加载(可放在初始加载场景或关卡选择场景)
  • 测试时可通过PlayerPrefs.DeleteAll()重置所有收集数据
  • 跨场景UI更新可改用UnityEvent替代FindObjectOfType,提升性能与稳定性

内容的提问来源于stack exchange,提问作者Linedol trainer channel gammin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:49:54