Menu
CoddyTech

保存一个数字

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 22 课,共 60 课。

游戏开始时,每个字段都会使用默认值。收集了 40 颗宝石的玩家退出游戏,第二天再回来时会发现宝石数量变成了 0,因为退出会结束游戏,也会结束游戏中的一切。PlayerPrefs 会在不同游戏之间,将少量值保存在玩家的设备上。每个值都会使用一个键来保存,这个键是你选择的字符串,可以使用 SetInt、SetFloat 或 SetString:

PlayerPrefs.SetString("PlayerName", "Robin");
PlayerPrefs.SetInt("LevelReached", 4);
PlayerPrefs.SetFloat("HoursPlayed", 2.5f);
PlayerPrefs.Save();

要读取一个值,请使用相同的键调用类型相同的 Get。如果某个键从未保存过,读取结果会是 0、0 或空字符串,因此在玩家第一次游戏时,这条问候语会显示空名称和等级 0:

void Start()
{
    string player = PlayerPrefs.GetString("PlayerName");
    int level = PlayerPrefs.GetInt("LevelReached");
    Debug.Log(player + " is on level " + level);
}

键区分大小写:GetInt("levelreached") 会读取一个从未保存过的键,并返回 0。一个键只能保存一种类型,因此读取时要使用与保存时的 Set 相匹配的 Get。值发生变化时就保存,不要只在游戏结束时保存。Unity 会在游戏正常退出时将 PlayerPrefs 写入磁盘,而 PlayerPrefs.Save() 会立即写入,因此即使发生崩溃,也不会丢失这些值。static 字段也无法绕过这一点:它只会在游戏运行期间存在,而退出游戏也会结束这一切。

challenge icon

挑战

中等

让跳跃次数成为终身累计总数,并在不同游戏之间保存。

  1. 在 Update() 中的 jumps++; 之后,添加 PlayerPrefs.SetInt("TotalJumps", jumps); 和 PlayerPrefs.Save();。
  2. 在 Start() 中的 ShowJumps(); 上方加载它:jumps = PlayerPrefs.GetInt("TotalJumps");。

点击 Play 并跳跃,然后点击 Stop,再点击 Play:计数会接着累加。然后点击“检查”。

亲手试试

using UnityEngine;
using TMPro;

public class JumpCounter : MonoBehaviour
{
    public TMP_Text jumpsText;
    public float hop = 5f;
    private Rigidbody rb;
    private int jumps;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        ShowJumps();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.linearVelocity = Vector3.up * hop;
            jumps++;
            ShowJumps();
        }
    }

    void ShowJumps()
    {
        jumpsText.text = "Jumps: " + jumps;
    }
}

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器