質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4107閲覧

Unity ListをJSON形式で保存したい

kenken2245

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/11/15 07:01

編集2021/12/02 08:38

前提として

、表示されているスコアを保存(JSON)で保存することはできます

public class GameDirector : MonoBehaviour { [SerializeField] GameObject costText;  [SerializeField] GameObject timeText; [SerializeField] InputField inputArea; //最初 [System.Serializable] public class PlayerData { public int cost = 0; public int time = 0; public string playerName; } PlayerData myData = new PlayerData(); /////////////////////// ここにはスコアが増えていく処理 /////////////////////// public void SavePlayerData()//000 { StreamWriter writer; var playerName = inputArea.text; myData.playerName = playerName; string jsonstr = JsonUtility.ToJson(myData);//myDtaをjson形式に変更 writer = new StreamWriter(Application.dataPath + "/save" + playerName + ".json", false); writer.Write(jsonstr); writer.Flush(); writer.Close(); }

実現したい事

増えていくスコアをある区切りごとで保存していきたいと考えています。
{動作イメージ}
1:スコアが増える
2:キープボタンを押すと現在のスコアを一旦保存する

この1と2を繰り返し、最後にそのキープされた途中結果全てををJSONに保存したいと考えています。

そこで、costとtimeの途中結果をどんどんlistにいれ、そのデータを保存させたいと考えております。
このようなlistを用意して、キープボタンのOnclickにアタッチしようと考えています。

public void ListSave() { int no = 0; var list = new List<List<int>>(); list.Add(new List<int>()); list[no].Add(myData.cost);//class PlayerDataから取り出すのが問題? list[no].Add(myData.time); no++; }

問題、疑問

このリストの配列をJSONで保存しよう思っていたのですが、保存するデータをまとめたクラス(PlayerData)にどう定義すればいいかわからなくなりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/15 07:19

> このリストの配列をJSONで保存しようとしてみたのですが壁にあたりました。 「壁」というのは具体的に何ですか? 何が分かれば乗り越えられるのですか?
kenken2245

2021/11/15 07:31

すみません、編集いたしました。
退会済みユーザー

退会済みユーザー

2021/11/15 23:08

> 2:キープボタンを押すと現在のスコアを一旦保存する > この1と2を繰り返し、最後にそのキープされた複数のデータをJSONに保存したいと考えています。 上記 2 の途中結果もすべて JSON にシリアライズしたいと言うことですか? で、シリアライズする前の C# のクラス定義をどうしたらいいかという質問ですか?
kenken2245

2021/11/16 00:29

説明が上手く出来ず、何度も何度もすみません。途中結果もすべて保存したいです。そのため途中結果を配列(list)にどんどん追加していこうとしています。listに追加する動作(ListSave)はbuttonのOnclickにアタッチしたいです。そして、おっしゃる通り途中結果のデータをシリアライズする前の、クラスをどう定義したらいいのかで分からなくなりました。
退会済みユーザー

退会済みユーザー

2021/11/16 06:45

このスレッドの課題は解決したようですので、解決に役に立った回答にベストアンサーを付けてこのスレッドはクローズ願います。
guest

回答2

0

このリストの配列をJSONで保存しよう思っていたのですが、保存するデータをまとめたクラス
(PlayerData)にどう定義すればいいかわからなくなりました。

単純に

C#

1[System.Serializable] 2public class PlayerData 3{ 4 public string playerName; 5 public int cost; 6 public int time; 7 public int[] costs; 8 public int[] times; 9}

あるいは cost と time でワンセットなので

C#

1[System.Serializable] 2public class Score 3{ 4 public int cost; 5 public int time; 6} 7 8[System.Serializable] 9public class PlayerData 10{ 11 public string playerName; 12 public Score current; 13 public Score[] history; 14}

とか

投稿2021/11/16 01:29

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

このリストの配列をJSONで保存しよう思っていたのですが、保存するデータをまとめたクラス(PlayerData)にどう定義すればいいかわからなくなりました。

PlayerData クラスの定義を以下のように、過去のスコアを含めたデータを List<int> 型の Costs, Times プロパティに保持できるように変更して、

public class PlayerData { public List<int> Costs { get; set; } public List<int> Times { get; set; } public string PlayerName { get; set; } }

使う前に以下のように初期化してから、

var playerData = new PlayerData { Costs = new List<int>(), Times = new List<int>(), PlayerName = "日本太郎" };

キープボタンを押す毎に、そのイベントハンドラで呼び出されるという ListSave メソッドで以下のようにしてはいかがですか?

public void ListSave() { playerData.Costs.Add(myData.cost); playerData.Times.Add(myData.time); }

最後にそのキープされた途中結果全てををJSONに保存

というところで、JsonUtility.ToJson メソッドで JSON 文字列にシリアライズすれば良さそうです。

投稿2021/11/16 01:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenken2245

2021/11/16 03:07

丁寧な回答ありがとうございます。実装してみたところ var playerData = new PlayerData { Costs = new List<int>(), Times = new List<int>(), PlayerName = "日本太郎" }; の一行目に対して The contextual keyword 'var' may only appear within a local variable declaration or in script code とエラー表示になったのでがこれはvar を変える必要があるのでしょうか。
退会済みユーザー

退会済みユーザー

2021/11/16 03:40

var を使えない場所で使っているのではないでしょうか? もしそうであれば、 PlayerData playerData = new PlayerData としてください。
kenken2245

2021/11/16 04:10

それでvarは解決することができました。 playerData.Costs.Add(myData.cost); playerData.Times.Add(myData.time); myData.costの箇所が'myData'does not existとなってしまいました。 新しくPlayerData playerData = new PlayerDataにしたためでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/16 04:33

> 新しくPlayerData playerData = new PlayerDataにしたためでしょうか? 全体のコードが不明ですが、質問のコードの PlayerData myData = new PlayerData(); を書き換えて myData が無くなってしまったということでしょうか? キープボタンを押すタイミングで cost, time のデータをどこから取得してくるのか分かりませんが、それを何らかの手段で ListSave メソッド内で直接取得できるなら、 playerData.Costs.Add(直接取得した cost); playerData.Times.Add(直接取得した time); としてはいかがですか?
kenken2245

2021/11/16 05:32 編集

単純にCostsとcostの区別ができていませんでした。 playerData.Costs.Add(直接取得した cost);とする事で解決いたしました。 全体のプログラミングはエラーなく動くのですが、保存したJSONのデータを見るとcostsとtimesが保存で来ていませんでした。playerNameは保存できていました。私が上手くデータの取得の処理をできてないかもしれません。 流れがわかるように全体のコードを載せておきます。 丁寧な対応ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問