Q&A
セーブをしたあと、一度ゲームを終了して実行し直し、セーブ済みの箇所に上書き保存を試みると以下のエラーが出て操作が効かなくなってしまいます。
発生している問題・エラーメッセージ
IOException: Sharing violation on path D:\Users\2012011\Documents\OverWrite\Assets\Data2.json System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <695d1cc93cca45069c528c15c9fdd749>:0) System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) (at <695d1cc93cca45069c528c15c9fdd749>:0) (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare) SaveDataManager.Save (System.Int32 dataNumber) (at Assets/Scripts/Save/SaveDataManager.cs:63) Menu+<LoopSave>d__64.MoveNext () (at Assets/Scripts/Menu/Menu.cs:429) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <d3b66f0ad4e34a55b6ef91ab84878193>:0)
該当のソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.IO; using System.Text; [Serializable] class SaveData { // アイテム取得フラグを保持 public bool[] S_itemGetFlags; // イベントフラグを保持 public bool[] S_eventFlags; // プレイヤーのステータスを保持 public int[] S_status; // プレイヤーの所持コマンドを保持 public List<Command> S_contents = new List<Command>(); // プレイヤーの座標を保持 public Vector3 S_playerPos; } [Serializable] class SaveDataWrapper { public SaveData[] data = new SaveData[] { new SaveData(), new SaveData(), new SaveData() }; } public class SaveDataManager : MonoBehaviour { [SerializeField, Header("アイテム取得フラグ")] FlagList itemGetFlags; [SerializeField, Header("イベントフラグ")] FlagList eventFlags; [SerializeField, Header("プレイヤーのステータス")] TmpInt status; [SerializeField, Header("プレイヤーのコマンド")] TmpCommand playerCommand; [SerializeField, Header("プレイヤー")] GameObject player; // セーブデータの名前(オブジェクト名)を格納する Vector3 playerPos; SaveDataWrapper wrapper = new SaveDataWrapper(); // 指定したパスにセーブデータを書き出す StreamWriter writer; // 指定したパスからセーブデータを読み出す StreamReader reader; // JSON形式に変換されたデータを格納 string json; // セーブデータへのパスを保持 string pass; FileStream fs; void Awake() { for (int i = 0; i <= wrapper.data.Length - 1; i++) { // 配列の要素数 + 要素の初期化 wrapper.data[i].S_itemGetFlags = new bool[itemGetFlags.Flags.Count]; wrapper.data[i].S_eventFlags = new bool[eventFlags.Flags.Count]; wrapper.data[i].S_status = new int[status.contents.Count]; } } public void Save(int dataNumber) { pass = Application.dataPath + "/Data" + dataNumber + ".json"; // ↓ここでエラー発生 fs = new FileStream(pass, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); //// 値入れ替え処理 //// // リストの要素 + 要素数を初期化 wrapper.data[dataNumber].S_contents.Clear(); // アイテムゲットフラグを格納 for (int i = 0; i <= itemGetFlags.Flags.Count - 1; i++) { wrapper.data[dataNumber].S_itemGetFlags[i] = itemGetFlags.Flags[i].IsFlag; } // イベントフラグを格納 for (int i = 0; i <= eventFlags.Flags.Count - 1; i++) { wrapper.data[dataNumber].S_eventFlags[i] = eventFlags.Flags[i].IsFlag; } // ステータスを格納 for (int i = 0; i <= status.contents.Count - 1; i++) { wrapper.data[dataNumber].S_status[i] = status.contents[i].number; } // 所持コマンドを格納 for (int i = 0; i <= playerCommand.contents.Count - 1; i++) { wrapper.data[dataNumber].S_contents.Add(playerCommand.contents[i]); } wrapper.data[dataNumber].S_playerPos = player.transform.position; // セーブ json = JsonUtility.ToJson(wrapper); writer = new StreamWriter(fs); writer.Write(json); writer.Flush(); writer.Close(); Debug.Log(dataNumber); } public void Load(int dataNumber) { pass = Application.dataPath + "/Data" + dataNumber + ".json"; fs = new FileStream(pass, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); reader = new StreamReader(fs); json = reader.ReadToEnd(); reader.Close(); wrapper = JsonUtility.FromJson<SaveDataWrapper>(json); //// 値入れ替え処理 //// // アイテムゲットフラグを更新 for (int i = 0; i <= itemGetFlags.Flags.Count - 1; i++) { if (wrapper.data[dataNumber].S_itemGetFlags[i]) { itemGetFlags.Flags[i].IsFlag = true; } else { itemGetFlags.Flags[i].IsFlag = false; } } // イベントフラグを更新 for (int i = 0; i <= eventFlags.Flags.Count - 1; i++) { if (wrapper.data[dataNumber].S_eventFlags[i]) { eventFlags.Flags[i].IsFlag = true; } else { eventFlags.Flags[i].IsFlag = false; } } // ステータスを更新 for (int i = 0; i <= status.contents.Count - 1; i++) { status.contents[i].number = wrapper.data[dataNumber].S_status[i]; } // 所持コマンドを更新 for (int i = 0; i <= playerCommand.contents.Count - 1; i++) { playerCommand.contents[i] = wrapper.data[dataNumber].S_contents[i]; } player.transform.position = wrapper.data[dataNumber].S_playerPos; } }
試したこと
FileStream のインスタンスを作成して使用するとエラーを回避出来ると聞いてやってみたけど同じエラーが出ました。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/11/01 07:08 編集
2022/11/01 12:28 編集