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

Unity 2D:基于PlayerPrefs的高分系统实现求助

我来帮你一步步解决这两个问题,先搞定角色死亡后分数继续下降的bug,再实现用PlayerPrefs保存高分的功能:

一、修复角色死亡后分数持续下降的问题

核心问题是你的分数减少逻辑没有判断角色是否存活,所以死亡后还在持续执行。我们可以加一个存活状态标记,只有角色活着的时候才更新分数:

using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour
{
    public int currentScore = 500000; // 用整数更贴合分数场景,避免浮点误差
    public Text currentScoreText; // 可选:显示当前分数的文本组件
    private bool isPlayerAlive = true;

    void Start()
    {
        // 每秒调用一次减分方法,比Update里用Time.deltaTime更精准
        InvokeRepeating(nameof(DecreaseScorePerSecond), 1f, 1f);
    }

    void DecreaseScorePerSecond()
    {
        if (isPlayerAlive)
        {
            currentScore -= 150;
            // 防止分数变成负数
            currentScore = Mathf.Max(currentScore, 0);
            // 更新当前分数显示(如果需要的话)
            if (currentScoreText != null)
            {
                currentScoreText.text = currentScore.ToString("N0");
            }
        }
    }

    // 角色死亡时调用这个方法
    public void OnPlayerDeath()
    {
        isPlayerAlive = false;
        CancelInvoke(nameof(DecreaseScorePerSecond)); // 停止减分逻辑
        // 触发高分检查与保存
        CheckAndSaveHighScore();
    }
}

记得在你的角色死亡逻辑脚本里,找到ScoreManager组件并调用OnPlayerDeath(),比如:

// 假设这是角色的死亡处理脚本
public void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Enemy"))
    {
        GetComponent<ScoreManager>().OnPlayerDeath();
        // 其他死亡逻辑:播放动画、暂停游戏等
    }
}
二、用PlayerPrefs实现高分保存功能

PlayerPrefs是Unity自带的轻量级本地存储工具,非常适合保存这种简单的数值。我们只需要在角色死亡时对比当前分数和存储的高分,更新并保存,再在游戏启动时加载显示:

在上面的ScoreManager里添加以下代码:

public Text kmHighscore; // 你的高分显示文本组件

void Start()
{
    InvokeRepeating(nameof(DecreaseScorePerSecond), 1f, 1f);
    // 游戏启动时加载并显示历史高分
    LoadAndDisplayHighScore();
}

private void CheckAndSaveHighScore()
{
    // 获取存储的高分,第一次玩时默认值为0
    int savedHighScore = PlayerPrefs.GetInt("GameHighScore", 0);

    if (currentScore > savedHighScore)
    {
        // 更新存储的高分
        PlayerPrefs.SetInt("GameHighScore", currentScore);
        PlayerPrefs.Save(); // 强制写入本地,避免数据丢失
        // 实时更新高分显示
        kmHighscore.text = currentScore.ToString("N0");
    }
}

private void LoadAndDisplayHighScore()
{
    int savedHighScore = PlayerPrefs.GetInt("GameHighScore", 0);
    kmHighscore.text = savedHighScore.ToString("N0");
}

关键说明:

  • PlayerPrefs.GetInt("GameHighScore", 0):第二个参数是默认值,当本地没有存储过高分时,会返回0
  • 每次修改PlayerPrefs后必须调用PlayerPrefs.Save(),确保数据立即写入本地文件
  • 如果需要清除测试的高分,可以在Unity编辑器的Edit > Clear PlayerPrefs选项中清除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:39:50