c# - Unity定期设置PlayerPrefs数据

标签 c# unity-game-engine coroutine

我使用 PlayerPerfabs 来存储玩家数据,例如玩家已解锁的级别以及在游戏过程中获得的分数,并且我希望在游戏过程中定期更新 PlayerPerfabs 数据(例如每 5 秒),所以我创建了一个名为ApplicationModel 保存全局数据,例如积分玩家获取级别信息等。

public ApplicationModel: MonoBehaviour{
    public static int point {get;set;}

    //try to load the PlayerPerfabs when start game.
    static ApplicationModel(){
        if(PlayerPerfabs.HasKey("point")){
            point = PlayerPerfabs.GetInt("point");
        }else{
            point = 0;
        }

    }

    //coroutine to set the data to PlayerPerfabs
    IEnumerator Save()
    {
        while (true)
       {
          Debug.Log("setting playerperfab ....");
          yield return new WaitForSeconds(5f);
          ApplicationModel.RestorePerfab();
       }
    }

    public static void RestorePerfab(){
         PlayerPerfabs.SetInt("point", point);
    }
    private void Start(){
      StartCoroutine(Save());
    }

}

但是根据控制台日志,协程从未执行(因为从未打印日志)。

也许是因为我没有将此脚本附加到游戏对象,但是一旦我将其附加到游戏对象,那么当场景发生变化或该游戏对象被破坏时,定期保存就会结束,对吧?那么如何做到这一点呢?

最佳答案

如果您希望它工作,您需要创建一个 GameObject,然后将此脚本附加到它。如果您要更改场景并希望它继续工作,您可以在该 GameObject 上调用 DontDestroyOnLoad,并且当您切换场景时它不会被破坏。

关于c# - Unity定期设置PlayerPrefs数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43359096/

相关文章:

c# - 使用 Crypto-JS 和 C# 解密的 AES 加密 - 避免 "Padding is invalid and cannot be removed."

c# - 在 C# + PHP 中使用命名管道进行进程间通信

javascript - Tornado WebSocketHandler 可以异步接收消息吗?

architecture - "coroutine"和 "thread"之间的区别?

c# - 如何在 xamarin.forms.maps iOS c# 中单击时更改图钉图标

c# - 我的 Windows 窗体应用程序在关闭后仍在作为任务运行

android - Unity 初学者 - 点击/点击多次触发

c# - 如何检查旋转方向是否不为0且与上一次旋转方向不同?

unity-game-engine - 粒子从一个角度看是黑色的,从另一个角度看是法线的

parsing - 将子例程放入解析器的优雅方法是什么?