如何实现跨场景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
相关产品推荐
相关产品推荐

