実現したいこと
UnityのWebGLゲームで、データの保存をするために、Jsonファイルでデータの書き込み、読み込みをしたいです。
前提
Unity2022.3.52f1でWebGLのゲームを作っています。
途中でやめても前のデータが保存され、続きからできるようにしたいです。
WebGLでJsonでデータを読み込むには、Resources.Loadを使うという方法がネットに書かれていたので、
Assetsフォルダ直下のResourcesフォルダにJsonファイルを保存するべく、ネット上にあげられていたのを、ほぼそのまま使わせていただき下記のようにコードを書きました。
発生している問題・エラーメッセージ
Jsonファイルがかなり遅れてしか作られないです。
そのためゲームを開始しても読み込むJsonファイルがないためエラーとなり止まってしまいます。
なぜかゲームを終了して、しばらく(2分くらい?)たったあと、再びResourcesフォルダを見てみるとJsonファイルができています。
ファイルの保存後にDebug.Logでjsonを見てみると、値は出てくるのでjsonには変換できてるのかな?と思います。
ちなみにその遅れてできたJsonファイルを使い、読み込みのほうはできます。
遅延なくJsonファイルを作成したいです。
該当のソースコード
<保存したいゲームデータがあるscript>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class ChClass
{
public int stageIndex ; public int stageDebt ; public int lifeCounts ; /// <summary> /// オブジェクトからJSONに変換 /// </summary> /// <returns>JSON文字列</returns> public string ToJson() { return JsonUtility.ToJson(this); } /// <summary> /// JSONからオブジェクトに変換 /// </summary> /// <param name="jsonStr">JSON文字列</param> /// <returns>変換後のオブジェクト</returns> public SaveData FromJson(string jsonStr) { return JsonUtility.FromJson<SaveData>(jsonStr); }
}
<Jsonデータの変換をするscript>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class JsonTest : MonoBehaviour
{
/// <summary> /// セーブ処理 /// </summary> /// <param name="data">セーブデータ</param> /// <param name="filePath">ファイルパス</param> public static void SaveJsonData(ChClass data, string filePath) { //playerデータをJSONに変換 string json = JsonUtility.ToJson(data); // jsonとして変換 StreamWriter wr = new StreamWriter(filePath, false); // ファイル書き込み指定 wr.WriteLine(json); // json変換した情報を書き込み wr.Close(); } /// <summary> /// ロード処理 /// </summary> /// <param name="filePath">ファイルパス</param> /// <returns>ロードしたデータ</returns> public static ChClass LoadJsonData(string filePath) { TextAsset jsonLoad = Resources.Load<TextAsset>("ChClass");//TextAsset形式でResources直下のJSONを読み込む ChClass ch1 = JsonUtility.FromJson<ChClass>(jsonLoad.text);//読み込んだJSONからChClassを作成 Debug.Log("ロードした!" + jsonLoad); return ch1; }
}
<保存、読み込みの命令をするscript>
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class JsonManager : MonoBehaviour
{
[SerializeField] StartSceneController startSceneController;
[SerializeField] GameController gameController;
[SerializeField] ScoreSceneManager scoreSceneManager;
[SerializeField] JsonTest jsonTest;
string filePath;
// Start is called before the first frame update
void Awake()
{
if (UnityEngine.Device.SystemInfo.deviceType == DeviceType.Handheld)
{
filePath = Application.persistentDataPath + "/" + ".savedata.json";
} else { filePath = $"Assets/Resources/ChClass.json"; } } void Start() { ChClass ch = new ChClass(); //JSONファイルがあればロード, なければ初期化関数へ if (FindJsonfile()) { ch=JsonTest.LoadJsonData(filePath); } else { Initialize(ch); } } // Update is called once per frame void Update() { } public void Initialize(ChClass ch) { ch.stageIndex = 0; ch.stageDebt = 100000000; ch.lifeCounts = 3; JsonTest.SaveJsonData(ch, filePath); } //JSONファイルの有無を判定するための関数 public bool FindJsonfile() { string[] assets = AssetDatabase.FindAssets(filePath); Debug.Log(assets.Length); if (assets.Length != 0) { string[] paths = assets.Select(guid => AssetDatabase.GUIDToAssetPath(guid)).ToArray(); Debug.Log($"検索結果:\n{string.Join("\n", paths)}"); return true; } else { Debug.Log("Jsonファイルがなかった"); return false; } }

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/04/21 02:48
2025/04/21 03:03
2025/04/21 03:15