Unity から WeChat ミニゲームへのローカル データ ストレージ
問題の背景
最近、Unity を小さなゲームに変換するときに、WebGL のプラットフォームの制限により、ローカル ファイルを読み書きするときにキャッシュApplication.persistentDataPath
パスを使用してファイルを保存できないことがわかりました。したがって、ローカル ファイルを読み書きするための元のコードは、プラットフォームに応じて変更する必要があります。
最も簡単な方法の 1 つは、PlayerPrefs
元々ファイルに保存されていたコンテンツを保存し、それを WebGL プラットフォームで使用することです。たとえば、次のように書きます。
PlayerPrefs
初めて読むのが遅い問題がありますが、WeChat Mini Game のプラグインを使用して、使用済みのキーを追加できます。使い方: WeChat Mini Game -> PlayerPrefs 最適化:
したがって、保存するファイルやデータが多い場合でも、元の読み書きロジックをできるだけ変更せずに、ファイルの読み書きを完了することを望んでいます。そのため、WeChat が提供してくれましたWX.env.USER_DATA_PATH
。
ローカルファイルを読み書きするWeChatミニゲーム
Unity が WeChat ミニゲームに変換された後File.WriteAllText
、File.ReadAllText
パスの問題により有効になりません。
代わりに、WeChat ミニゲーム プラグインによって提供されるパスを使用します。プラグインのコード:
サンプルコードは次のとおりです。
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_WEBGL
WXFileSystemManager 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_WEBGL
WXFileSystemManager 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 フォルダーの下のファイルをUnityWebRequest
WebGL プラットフォームで読み取ることができます。
WebGL プラットフォームのいくつかの制限
プラットフォームの制限により、WebGL では一部の機能がサポートされていません。
- JavaScript はマルチスレッドをサポートしていないため、マルチスレッドをサポートしていません。そのため、System.Threading 名前空間でクラスを使用しないでください。
- System.Net の下のすべてのタイプ、System.Net.Sockets の下の一部のタイプ、および UnityEngine.Network を含む、Socket を直接使用することはできません. WebGL プラットフォームでネットワーク機能を使用する必要がある場合は、ベースの WWW または UnityWebRequest を使用できます。 HTTP プロトコルで高いリアルタイム パフォーマンスが必要な場合は、WebSocket または WebRTC を選択できます。
- WebGL 1.0 は OpenGL ES 2.0 に基づいており、WebGL 2.0 は OpenGL ES 3.0 に基づいているため、対応する制限があります。
- WebGL は AOT (事前、つまり静的コンパイル プラットフォームであるため、System.Reflection.Emit の下の型はコード生成に使用できません。IL2CPP と iOS についても同様です。
メソッド共有の表示エラー
ミニゲームに切り替えた後、デバッグモードをオンにすると、電話でエラーログを確認できます. エラーログは次のとおりです.
例外がスローされました: Runtiseerror: null 関数または関数シグネチャが一致しません。Rurtimcerror : null 関数または関数シグネチャの不一致
ミニ プログラム エラー null 関数または関数シグネチャの不一致ランタイム エラー: null 関数または関数シグネチャの不一致
これら 2 つのエラーの段落は、同じ問題によって引き起こされます。この種のエラー レポートを初めて見たときは、どこから始めればよいか分からず途方に暮れました. 2 行下を調べたところ、自分で書いた関数 ( class のメソッド ) が見つかりましScreenRatiosFilter
たFit
。エラー報告の方法は既に見つけたので、以下の問題について話す必要はありません。
これを見たので、秘密を教えましょう : エラーが報告された場所が本当にわかりません.また、エディターで再現することもできません. ログを作成し、エラーを再現してください.特定のエラーを見つけることができます. 間違った行数が報告されました.
私も奇妙な問題に遭遇したので、それをまとめて記録します。ゲーム ロジックの一部はミニ ゲームのエラーを報告するだけで、エディターやその他の部分は問題ありません。あとでtry...catch
キャプチャーを1回追加して、それ以外の加工は一切しておらず、使いやすいとわかったのですが…