Unity如何跨脚本使用PlayerPrefs实现最高分达50时停用面板
问题原因
现有代码无法生效的核心问题:
- 仅判断
PlayerPrefs中是否存在最高分键,未实际读取分数值和50的阈值做比较,只要曾经存过任意分数都会触发面板停用逻辑 - 用
GetComponent<Score>()获取引用要求两个脚本必须挂载在同一个GameObject上,否则会返回空引用导致逻辑失效 - 仅在
OpenPanel1被手动调用时执行一次判断,游戏启动、分数动态增长的过程中不会自动校验状态 - 未覆盖「当前实时分数达到50就停用面板」的需求,仅做了最高分相关判断
修改方案
直接替换PanelDeactivator脚本为以下代码:
using UnityEngine; public class PanelDeactivator : MonoBehaviour { [SerializeField] private GameObject _firePanel; [SerializeField] private GameObject _snowPanel; [SerializeField] private GameObject _transparentPanel; [SerializeField] private Score _scoreScript; [SerializeField] private int triggerScore = 50; private int cachedHighScore; void Start() { cachedHighScore = PlayerPrefs.GetInt("Highest Score: ", 0); UpdatePanelState(); } void Update() { if (_scoreScript == null) return; cachedHighScore = PlayerPrefs.GetInt("Highest Score: ", 0); if (cachedHighScore >= triggerScore || _scoreScript._scoreNumber >= triggerScore) { UpdatePanelState(); } } private void UpdatePanelState() { bool shouldDisable = cachedHighScore >= triggerScore || (_scoreScript != null && _scoreScript._scoreNumber >= triggerScore); if (!shouldDisable) return; _firePanel.SetActive(false); _snowPanel.SetActive(false); _transparentPanel.SetActive(false); // 触发后关闭脚本节省性能 enabled = false; } public void OpenPanel1() { UpdatePanelState(); } }
配置说明
- 在Inspector面板中将挂载了
Score脚本的对象直接拖到_scoreScript字段,不要依赖自动获取组件,避免空引用 triggerScore字段默认值为50,可直接在Inspector中调整,无需修改代码- 若要降低性能开销,可删除
Update中的检测逻辑,在Score脚本的OnTriggerEnter2D方法中更新完分数后,加一行FindObjectOfType<PanelDeactivator>()?.UpdatePanelState(),仅在分数变化时触发校验 - 如需保证最高分写入不丢失,可在
Score脚本的PlayerPrefs.SetInt方法后加PlayerPrefs.Save()强制立刻落盘
内容的提问来源于stack exchange,提问作者blanshar33
相关产品推荐
相关产品推荐

