首页 > 其他分享 >Unity Webgl小游戏存取数据的解决方案

Unity Webgl小游戏存取数据的解决方案

时间:2024-09-14 16:26:06浏览次数:9  
标签:存储 PlayerScore 保存 Unity 小游戏 存取数据 UserGameData PlayerPrefs public

在Unity中,如果我们要存储数据,通常会使用以下几种方法:

1.Unity官方提供的PlayerPrefs

2.Unity官方提供的ScriptableObject

3.使用Json,XML,CSV等文件保存

4.使用数据库存储

 

而在Webgl手机小游戏中,通常会以PlayerPrefs进行保存,因为PlayerPrefs是一个极其轻量级的存储方式

可以用于存储一些小游戏的数据(只能存储int,float,string三种类型)

它主要的方法有以下这些:

 1 // 保存玩家的分数
 2 PlayerPrefs.SetInt("PlayerScore", 100);
 3 // 获取玩家的分数,默认值为0
 4 int playerScore = PlayerPrefs.GetInt("PlayerScore", 0);
 5 // 保存音量设置
 6 PlayerPrefs.SetFloat("Volume", 0.5f);
 7 // 获取音量,默认值为1.0
 8 float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
 9 // 保存玩家的名字
10 PlayerPrefs.SetString("PlayerName", "qingyuan");
11 // 获取玩家名字,默认值为"Unknown"
12 string playerName = PlayerPrefs.GetString("PlayerName", "Unknown");
13 // 删除保存的玩家分数
14 PlayerPrefs.DeleteKey("PlayerScore");
15 // 删除所有存储的数据
16 PlayerPrefs.DeleteAll();
17 // 检查是否存在“PlayerScore”
18 if (PlayerPrefs.HasKey("PlayerScore"))
19 {
20     // 存在玩家分数
21     int score = PlayerPrefs.GetInt("PlayerScore");
22 }
23 // 手动保存数据
24 PlayerPrefs.Save();

其中有一些需要注意的地方,这三组get,set方法,它们的key均为string类型,而值的类型则与方法名对应。

关于手动保存数据这个函数,通常,PlayerPrefs 在调用 Set 方法时会自动保存数据,但在某些情况下(如游戏退出前),你可以调用 PlayerPrefs.Save() 来确保数据保存。

这种保存方法的优点是轻量级,存取方便,缺点在于它的数据及其容易被修改,比如在Winodws系统下,它会将数据存储在注册表中,你可以轻而易举的查看或者修改它。

值得注意的是,如果小游戏是类似微信小程序的那种,则不能使用以下的方式进行存储,因为下面的这种方式涉及文件读写。

1 private void SaveLevelData()
2 {
3     //apk的储存方法
4     FileStream fileStream = File.Create(UserGameDataFilePath);
5     Debug.Log("当前用户数据保存路径:" + UserGameDataFilePath);
6     new BinaryFormatter().Serialize(fileStream, MultiplayerHandler.instance.UserGameData);
7     Debug.Log("UserGameData:" + MultiplayerHandler.instance.UserGameData);
8     fileStream.Close();
9 }

下面我以一个实际项目的说说类似Webgl小游戏如何存取数据:

首先,我有一个LevelData类:

 1 public class LevelData
 2 {
 3     public string levelName;
 4 
 5     public bool isCompleted;
 6 
 7     public int score;
 8 
 9     public float completionTime;
10 }

由于关卡很多,所以我还声明了一个List<LevelData> UserGameData队列:

public List<LevelData> UserGameData;

可以看出,我的LevelData类中有好几个要存储的变量,如果单纯用上述的PlayerPrefs进行get,set,那代码量就显得很多,而且读取也不好进行读取

所以我的想法是:先将整个List序列化为Json,然后使用PlayerPrefs.SetString()保存(毕竟int,float能存的,String都可以),读取的时候再使用PlayerPrefs.GetString()的读取,然后反序列化为List对象。

以下是实现的代码:

 1 public static void SaveUserData(string key, object data)
 2 {
 3     //将数据转换为json,并以UserData这个键名保存
 4     var json = JsonConvert.SerializeObject(data, Formatting.Indented);
 5     Gtools.SetString_SaveChange(key, json);
 6 }
 7 
 8 
 9 public static void LoadFromPlayerPrefs()
10 {
11     var json = Gtools.GetString_SaveChange("UserData");
12     List<LevelData> dataList = JsonConvert.DeserializeObject<List<LevelData>>(json);
13     if (dataList != null && dataList.Count > 0)
14     {
15         MultiplayerHandler.instance.UserGameData = dataList;
16     }
17 }

最后就只需要在需要存取的地方,调用这两个静态函数就可以了

 

标签:存储,PlayerScore,保存,Unity,小游戏,存取数据,UserGameData,PlayerPrefs,public
From: https://www.cnblogs.com/qingyuan0213/p/18414023

相关文章

  • 【Unity】创建动态的Tooltip
    需求说明文字内容动态变化;根据文字的内容自适应宽高;跟随鼠标移动;可以隐藏和展示;鼠标到达窗口边缘,tooltip停靠边缘可见;成果展示Scene部分查看UI相机和Canvas的设置注意将文字放在最左下角脚本部分TooltipScreenSpaceUI脚本绑定至TooltipScreenSpaceUI物体public......
  • Unity网络编程(1)线程
    引入:网络编程基础认识1.了解操作系统的分时操作:操作系统将时间划分为很多个片段,尽可能均匀地分配给正在执行的线程获得时间片的进程得以运行,其他则在等待CPU在这些进程上来回切换,频密,让人感觉多个进程在同时执行2.概念认识:(1)进程是程序的边界,程序与程序间以进程为隔离 ......
  • Unity人工智能分析话语,及自动学习而产生智能回答:游戏、源码、教程(三合一),完全免费,完全
    Unity人工智能分析话语,及自动学习而产生智能回答:游戏、源码、教程(三合一),完全免费,完全开源。2024年9月13日,自动学习的问答程序开发完成,并通过测试。游戏、源码、教程的三合一,我放到了夸克网盘:https://pan.quark.cn/s/7a753bcef090我不想和任何人说话,任何人不要跟我说话。游戏......
  • Dev-C++小游戏大全(第三期)
    1.魔法世界#include<iostream>#include<string>#include<windows.h>#include<conio.h>#include<fstream>#include<ctime>#include<time.h>#include<stdio.h>usingnamespacestd;intD_Of_C,OK,ane,xy,D......
  • 常用的Unity输入方法
    以下是一些常用的Unity输入方法的总结。1.Input.GetKeyDown(KeyCodekey)返回值:bool。如果用户在上一帧没有按下指定的键,但在当前帧按下了,则返回true;否则返回false。例子:if(Input.GetKeyDown(KeyCode.Space)){Debug.Log("空格键被按下!");}2.Input.GetKey(......
  • Unity实现自己的协程系统(协程有顺序)
    你的类可以在不继承Mono的脚本使用协程,但本质仍然需要借助其他Mono对象的Update来调度        实现了一个有执行顺序的协程的调度器,用于在Unity中管理多个协程的执行。通过ICoroutineNodeOrder和ICoroutineWaitCondition两个接口,可以定义每个协程的执行状态、......
  • Unity Apple Vision Pro 开发(九):空间锚点
    XR开发者社区链接:SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子课程试看:https://www.bilibili.com/video/BV1JFHgegEb2课程完整版,答疑仅社区成员可见,可以通过文章开头的链接加入社区。空间锚点可以把虚拟物体固定在现实中的一个特定区域,锚定......
  • uniapp js 划消小游戏 2.0
    1.效果图  代码:game.vue  <template> <viewclass="wrap">  <!--<imgclass="imgBG"src="@/static/image/hxBG.png"alt=""/>-->  <imageclass="imgBG"mode="aspectFill&q......
  • Unity中的协程
    函数IEnumeratorA(){yieldreturnCurrent;//下一帧执行}开启StartCoroutine()参数可以为函数和函数名字符串,但是字符串的运行开销比较大。协程原理常见用法如果Current是null,就相当于什么也不做。在下一次游戏循环中,就会调用MoveNext。所以yieldreturnnull就起......
  • 【Unity精品源码】Auto Chess: 自走棋策略游戏开发框架
    ......