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

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

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

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

Unity

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

Q&A

解決済

2回答

2109閲覧

Listを保存して他のシーンでも参照したい

YUEI

総合スコア18

C#

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

Unity

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

0グッド

0クリップ

投稿2019/04/06 16:25

編集2019/04/06 16:31

実現したいこと

Listを編集した後、それを何らかの形式で保存する
その後、それを別のシーンで読み込む

###状況
現在TCGを作っているのですが、Listの保存に困っています。

C#

1デッキ編集シーンのスクリプト 2 3public class Deck1 : MonoBehaviour 4{ 5 static Deck1 Instance = null; 6 7 public static Deck1 GetInstance() 8 { 9 if (Instance == null) 10 { 11 GameObject obj = new GameObject("DeckObject1"); 12 Instance = obj.AddComponent<Deck1>(); 13 DontDestroyOnLoad(obj); 14 } 15 16 return Instance; 17 } 18 19 public List<GameObject> Player1Deck; 20 21 public GameObject BookPanel; 22 public GameObject InDeckPanel; 23 24 //カードのプレファブ 25 public GameObject CardA; 26 27 //カード一覧のボタン 28 public GameObject AddButtonKadan; 29 30 //デッキ一覧のボタン 31 public GameObject RemoveButtonKadan; 32 33 34 public void Start() 35 { 36 Player1Deck = new List<GameObject>(); 37 } 38 39 public void addCardA() 40 { 41 Player1Deck.Add(CardA); 42 } 43 44 public void RemoveCardA() 45 { 46 Player1Deck.Remove(CardA); 47 } 48} 49

このように、例えばCardAというカードがあり、ボタンでこのスクリプトのaddCardAやRemoveCardAを動かしてリストに対象のカードのprefabを入れています。そして、空のゲームオブジェクトにアタッチして、static Deck1〜から始まる部分でオブジェクトを維持しています。
ただこれだと、他のシーンに移動した時にインスペクターに登録したprefabなどが全てNoneになってしまい、最初にListを初期化しているので当然ですがもう一度このデッキ編集シーンを開くとListがリセットされてしまいます。どこかのサイト様で、Listを使う時はまず初期化をしないといけない、といったようなものを見たのですが、もしかして初期化しなくても大丈夫なのでしょうか?
なので、Listを任意のタイミングで保存して、他のシーンでもその状態で読み込みたいのですが、どうすればいいのでしょうか。

C#

1public void SaveDeck() 2 { 3 string SaveDeckData = JsonUtility.ToJson(Player1Deck); 4 Debug.Log(SaveDeckData); 5 } 6

途中にJson化も試してみましたが、CardAを入れていない状態/入れた状態でこのSaveDeckを呼び出した時、どちらもJson形式が変わっていませんでした。
調べた結果としてはListをJson化してPlayerPrefsで保存する、というところでしょうか?

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

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

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

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

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

guest

回答2

0

シーン間でデータを共有する場合、色々と方法があります。
以下のサイトを参考にしてみてください。

static(静的な)オブジェクトとして保持する
オブジェクトを破棄されないようにする
オブジェクトは破棄されないし重複もしない
シーンを加算ロード・アンロードでオブジェクト破棄を行わない
アセットのインスタンスにデータを格納
データを外部に保存する

【Unity】シーン間でスコアを共有 まとめ
http://tsubakit1.hateblo.jp/entry/2015/11/07/024350

投稿2019/04/06 21:28

nskydiving

総合スコア6500

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

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

YUEI

2019/04/08 08:31

回答ありがとうございます。 サイトを参考にし、色々試してみようと思います。 リンクを教えてくださりありがとうございます。
guest

0

ベストアンサー

文面から想像しますと、デッキ編集シーンではDeck1オブジェクトをシーン上にあらかじめ配置した状態でそれを編集し、その後ゲームシーンに移動してからはDeck1.GetInstance()でアクセスして中身を取り出そうというプランでしょうか?
確かにその方法だと、編集時のDeck1オブジェクトとプレイ時のDeck1オブジェクトが異なっているでしょうから、編集結果が反映されずにカードリストはまっさらになってしまいそうですね。

下記のように、スクリプトをデッキ編成を保管する部分とデッキを編集する部分の2つに分けてしまうのはどうでしょうか。これならデッキ保管部分がゲーム内で唯一となり、シーンをまたいでも編集結果を取り出せるんじゃないかと思います。

  • Deck1

シーン間を持ち回るデッキオブジェクト
このデッキオブジェクトには、必ずDeck1.GetInstance()を使ってアクセスする...というルールにし、シーン上のオブジェクトにスクリプトを手動でアタッチしたりはしないことにする

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4public class Deck1 : MonoBehaviour 5{ 6 static Deck1 Instance = null; 7 static bool suppressDestroy; 8 9 public static Deck1 GetInstance() 10 { 11 if (Instance == null) 12 { 13 GameObject obj = new GameObject("DeckObject1"); 14 suppressDestroy = true; 15 Instance = obj.AddComponent<Deck1>(); 16 suppressDestroy = false; 17 DontDestroyOnLoad(obj); 18 } 19 20 return Instance; 21 } 22 23 public List<GameObject> Deck = new List<GameObject>(); 24 25 void Awake() 26 { 27 // GetInstance内以外でAwakeが実行された場合、「必ずGetInstanceを使う」のルールに 28 // 違反しているものと見なして、コンポーネントを破壊する 29 if (suppressDestroy) 30 { 31 return; 32 } 33 34 Debug.LogError($"You are supposed to access {this.GetType().Name} via {nameof(GetInstance)}!", this.gameObject); 35 Destroy(this); 36 } 37}
  • Deck1Editor

デッキ編集用スクリプト
デッキ編集シーン上に空オブジェクトを配置してこのスクリプトをアタッチし、それにカードプレハブをセットしたりボタン類と接続したりしておく

C#

1using UnityEngine; 2 3public class Deck1Editor : MonoBehaviour 4{ 5 public GameObject BookPanel; 6 public GameObject InDeckPanel; 7 8 //カードのプレファブ 9 public GameObject CardA; 10 11 //カード一覧のボタン 12 public GameObject AddButtonKadan; 13 14 //デッキ一覧のボタン 15 public GameObject RemoveButtonKadan; 16 17 public void addCardA() 18 { 19 Deck1.GetInstance().Deck.Add(CardA); 20 } 21 22 public void RemoveCardA() 23 { 24 Deck1.GetInstance().Deck.Remove(CardA); 25 } 26}

投稿2019/04/06 21:55

Bongo

総合スコア10807

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

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

YUEI

2019/04/08 08:29

返信が遅れてしまい申し訳ありません。 確かにそうやって分けてしまえば解決しそうですね。 とりあえず試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問