Unity 之 转微信小游戏本地数据存储

  • 问题背景
  • 微信小游戏读写本地文件
  • WebGL平台的一些限制
  • 报错查看方法分享

问题背景

近期在将Unity转换为小游戏的时候发现在读写本地文件的时候,使用Application.persistentDataPath缓存路径来保存文件失败,原因是WebGL的平台限制。所以导致了原有读写本地文件的代码需要根据平台进行修改。

一种最简单的方式就是将原来存储到文件中的内容,在WebGL平台使用PlayerPrefs来存储。比如这样的写法:

使用PlayerPrefs的存在第一次读取慢的问题,可以使用微信小游戏的插件进行添加用到的Key。使用方式:微信小游戏 -> PlayerPrefs优化:

微信插件中覆盖Unity中的API

所以当需要存储文件很多或者数据很多的时候,我们还是希望在尽量不修改原有的读写逻辑的情况下进行完成文件的读写。所以微信给我们提供了WX.env.USER_DATA_PATH


微信小游戏读写本地文件

Unity转成微信小游戏以后File.WriteAllTextFile.ReadAllText由于路径问题不生效。

改为使用微信小游戏插件提供的路径即可,插件中的代码:

示例代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using WeChatWASM;public class SaveFile : MonoBehaviour
{// 文件类型private PlayerData m_PlayerData;// 文件名称private string fileName = "/PlayerData.txt";private void OnGUI(){if (GUI.Button(new Rect(100, 100, 200, 200), "读取文件")){LoadPlayerData();}if (GUI.Button(new Rect(100, 400, 200, 200), "写入文件")){WritePlayerData();}}/// <summary>/// 读取文件/// </summary>private void LoadPlayerData(){#if UNITY_WEBGLWXFileSystemManager fs = WX.GetFileSystemManager();// 判断是否存在目录if (fs.AccessSync(WX.env.USER_DATA_PATH + fileName).Equals("ok")){// 读取内容string playerDataString = fs.ReadFileSync(WX.env.USER_DATA_PATH + fileName, "utf-8");if (playerDataString != ""){m_PlayerData = LitJson.JsonMapper.ToObject<PlayerData>(playerDataString);}}Debug.Log($" 读取文件 姓名:{m_PlayerData.name} 年龄:{m_PlayerData.age}");
#endif}/// <summary>/// 写入文件/// </summary>private void WritePlayerData(){m_PlayerData = new PlayerData();m_PlayerData.name = "Czhenya";m_PlayerData.age = 18;Debug.Log($" 写入文件 姓名:{m_PlayerData.name} 年龄:{m_PlayerData.age}");string playerData = LitJson.JsonMapper.ToJson(m_PlayerData);
#if UNITY_WEBGLWXFileSystemManager fs = WX.GetFileSystemManager();fs.WriteFileSync(WX.env.USER_DATA_PATH + fileName, playerData, "utf-8");
#endif}
}public class PlayerData
{public string name;public int age;
}

测试结果:
不校验是否存在本地目录就进行文件读取的报错:
可以看到后面的读取和保存成功了:


PS:若只需要进行读取文件,在StreamingAssets文件夹下面的文件,在WebGL平台是可以通过UnityWebRequest来进行读取的。


WebGL平台的一些限制

由于平台限制,有些功能在 WebGL 上是不支持的:

  • 不支持多线程,因为 JavaScript 不支持多线程,所以 System.Threading 命名空间下的类不要使用;
  • 不能直接使用 Socket,包括 System.Net下的任何类型,以及 System.Net.Sockets 下的部分类型,以及 UnityEngine.Network,如果需要在 WebGL 平台使用网络功能,可以使用 WWW或者 UnityWebRequest这些都是基于 Http协议的实现,如要需要高实时性,可以选择 WebSockets或者 WebRTC;
  • WebGL 1.0是基于 OpenGL ES 2.0,WebGL 2.0基于 OpenGL ES 3.0,所以存在相应的限制;
  • WebGL 是 AOT(ahead of time,即静态编译平台,因此不能使用 System.Reflection.Emit 下的类型进行代码生成,IL2CPP和 iOS 也是如此。

报错查看方法分享

转小游戏后可以通过打开调试模式在手机上看到报错日志,报错日志如下:

exception thrown : Runtiseerror : null function orfunction signature ismatch . Rurtimcerror : nullfunction or function signature mismatch

Mini Progran Error null function or function signature mismatchRuntimeerror: null function or function signaturemismatc

这两段报错是同一个问题触发的。第一次看到这种报错一脸茫然不知从何下手,再往下看两行就发现了我自己写的函数:ScreenRatiosFilter类中的Fit方法。都定位到报错方法了,之后的问题就不用我再说了吧。

既然你都看到这里了,还是告诉你一下秘诀吧:实在判断不出来是哪里报的错,而在编辑器又复现不出来,补日志,然后复现一下错误,这样就可以定位到具体报错行数了。

还遇到过一个奇怪的问题,一并记录一下。希望对你有所启发:一段游戏逻辑只在小游戏中报错,编辑器和其他端都没问题。后来加了一个try...catch捕获了一次,没做其他任何处理,然后竟然好用了…

Unity 之 转微信小游戏本地数据存储方法分享相关推荐

  1. LayaAir 绘制微信小游戏开放数据域画面

    LayaAir 绘制微信小游戏开放数据域画面 请大家关注我的微博:@NormanLin_BadPixel坏像素 之前写过用cocosCreator绘制微信小游戏子域的教程,保持整体思路不变,现在再写一 ...

  2. 微信小游戏跳一跳作弊方法

    微信小游戏跳一跳作弊方法 本实现方法代码来源:https://zhuanlan.zhihu.com/p/32473340 原理粗解 微信小游戏跳一跳,本质上时一个半离线游戏,它的与服务器的通信其实是在 ...

  3. 微信小游戏本地解析二维码

    最近公司需要在为微信小游戏内解析一个二维码,从而获取二维码的数据来做相关处理,但是二维码处理方面,小游戏是不支持,为了开发只能自己来解决这个问题.解决方案有两种,第一种是将二维码上传到服务器,后台解析 ...

  4. creator 微信小游戏存取数据

    本人小白,这是自我总结,不管对错,欢迎大神评论纠错 creator 2.0.9版本,在做微信小游戏是,用cc.sys.localStorage.getItem读数据会有问题, 我本来想的读取金币数,因 ...

  5. 微信小游戏|开放数据域的写与读

    本文来自Cocos官方论坛,感谢「达闻西」的分享! 1. 引言 本来是自己写的笔记,想想还是发出来把,能让不少新手少走弯路,毕竟自己也是摸索了好久!以图片的形式,让大家更直观点! 微信小游戏API官方 ...

  6. unity转微信小游戏及接api方法

    1.首先要下载unity转微信小游戏的插件,下载地址:​​​https://res.wx.qq.com/wechatgame/product/webpack/userupload/wasm_plugi ...

  7. Unity导出到微信小游戏

    1,首先下载官方的导出插件: ​​​https://res.wx.qq.com/wechatgame/product/webpack/userupload/wasm_plugin/minigame.2 ...

  8. 解决cocos creator微信小游戏本地缓存文件超过限制问题

    cocos creator微信小游戏开发,如果游戏包内资源超过包体大小限制,那么可以通过远程加载的方式加载资源(代码脚本文件除外). 小游戏在迭代过程中因为缓存资源的积累,在加载资源的时候会出现超过缓 ...

  9. 2018微信公开课:微信小游戏的精华内容要点分享!

    导语:本篇汇总了上午的微信公开课和下午的小游戏分论坛上,嘉宾分享的微信小游戏相关内容要点. 今天,在2018微信公开课上,微信小游戏无疑成为了最重要的热点之一. 4000多人聚集在广州保利世贸博览馆, ...

最新文章

  1. 分布式ID(唯一性)的生成方法汇总
  2. C# Json 序列化与反序列化二
  3. 简明python教程在线-Python简明教程
  4. java:volatile,instanceof,strictfp关键字
  5. pytorch 笔记 :实现Dropout
  6. request的生命周期
  7. Java黑皮书课后题第8章:8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的。编写一个方法,如果m1和m2相同的话,返回true
  8. 4键电子手表说明书_家有破壁机的要收藏,教你4道早餐食谱,细腻香甜,比喝豆浆舒服...
  9. java 加法 溢出_StackOverflow热帖:Java整数相加溢出怎么办?Java8一步搞定~
  10. 项目分享 | 好牛X的开源项目,看完忍不住分享(高手作品分享)
  11. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择
  12. 《Python学习手册》(三)
  13. 训练自己的数据_YOLOv3训练自己的数据集(以口罩检测数据集为例)
  14. Leetcode. 回文字符串的分割和最少分割数
  15. js高级学习笔记(b站尚硅谷)-3-对象
  16. 使用EXCEL进行线性回归
  17. 蓝桥杯单片机学习之数码管
  18. wx小程序 解决子组件样式不起效
  19. 1688api 图片搜索功能 item_search_img-按图搜索1688商品(拍立淘)
  20. amaze ui html5前端开源框架使用

热门文章

  1. 抖音被曝变相降薪,这波终究是利好卷王了?
  2. 节约用水|减少零用,保护环境
  3. 2.4 隐函数和参数方程的导数 相关变化率
  4. matlab水仙花,matlab水仙花数示例
  5. Mac实用技巧 |如何使用Mac系统中自带的预览工具将图片变成黑白色?
  6. android银行卡匹配、详情展开动画、仿爱奇艺视频拖拽、扫码识别手机号等源码
  7. 64位win7搭建php mysql_在64位Win7系统中配置Apache+MySQL+PHP环境的方法
  8. 为什么说HTC U11选择百度DuerOS是最聪明的做法
  9. CString与Byte数组的相互转化
  10. HTML/CSS/JS总结