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

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

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

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

Unity

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

Q&A

1回答

375閲覧

【C# Unity】シーン上のクラスの変数を個別にセーブしたい。

HiruLow

総合スコア55

C#

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

Unity

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

0グッド

0クリップ

投稿2018/04/06 07:53

編集2018/04/06 08:00

Unityを使ってゲーム中の変数を保存したいのですが保存の仕方で悩んでいます。

RPGゲームなんかでは、プレイヤーが壺を壊してアイテムを拾ったりしますが、勿論この壊れた壺からは再度アイテムが取得できる事は有りません。伝説の剣やキーアイテムなら尚更の事です。
壺が壊されているかどうか、といった状態を保存する為に以下のようなスクリプトを追加するとします。

csharp

1public class tubo{ 2 3 bool isOpen = false; 4 5 bool Open(){ 6 if(!isOpen){ 7 isOpen=true; 8 return true; 9 }else{ 10 return false; 11 } 12 } 13 14} 15

シーンを移動してしまうと上記変数isOpenはFalseになってしまいます。

単純にシーンを移動する度に上記変数をstaticなKeyを持ったセーブ用変数に保存して、シーンから戻って来た際に保存しておいた状態を設置し直すのもいいですが、数が1000とかになってくると、staticなKeyを設定するのは大変です。

そこでstaticな変数ではなくランダムなキーを各tuboClass毎に持たせて保存したいと思いました。
上記tuboClassに手を加えると以下のようになります。

csharp

1public class tubo{ 2 3 //★追加部分------------------------------------ 4 string random_key="fapugaw9ug9epgaw9eghf9pawehfiawehfiewhf";//スクリプト設置時にランダムに生成 5 //★追加部分------------------------------------ 6 7 bool isOpen = false; 8 9 bool Open(){ 10 if(!isOpen){ 11 isOpen=true; 12 return true; 13 }else{ 14 return false; 15 } 16 } 17    18 //★追加部分------------------------------------ 19  public void Save(){ 20 PlayerPrefs.SetInt(random_key, isOpen ? 1 : 0); 21 PlayerPrefs.Save(); 22 } 23 24 public void Load(){ 25 isOpen = (1 == PlayerPrefs.GetInt(random_key, isOpen ? 1 : 0)); 26 } 27 //★追加部分------------------------------------ 28 29} 30

このtuboClassですが、複数設置した際、まとめて管理をしたいと思っておりまして、継承等で上手く管理して1つのスクリプトから一気にシーン中のtuboClassの全Save関数,Load関数を呼び出し出来ないかと試行錯誤しているのですがなかなかいい方法が見つかりません。

恐らく初歩的な事だとは思うのですが、いまいちこれだとゆうものが解らずにいます。
何かいい方法等ありましたら教えてください。

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

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

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

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

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

fiveHundred

2018/04/06 08:45

そもそも「staticの変数」と「PlayerPrefs」は別物です。後者はゲーム終了後も内容が破棄されないという特徴があります。「ゲーム終了後はリセットされる」なら前者、そうでなければ後者になりますが、どちらになりますでしょうか?
guest

回答1

0

tuboClassの全Save関数,Load関数を呼び出し出来ないか

要件は満たしませんが、必要なタイミングで初期化するのはどうでしょうか?詳しくは後述します。

C#

1public class tubo 2{ 3 string random_key; 4 5 //コンストラクタでrandom_keyを設定 6 //こうしておくとrandom_keyを強要できるので未設定防止に繋がります。 7 public tubo(string random_key) 8 { 9 this.random_key = random_key; 10 } 11 12 int isOpenKey = -1; 13 // 呼ばれた時点でisOpenKeyが-1の場合、初期化。代入があった場合、PlayerPrefsに保存します。 14 public bool IsOpen 15 { 16 get{ 17 if(isOpenKey == -1) isOpenKey = PlayerPrefs.GetInt(random_key, 0); 18 return isOpenKey == 1; 19 } 20 set{ 21 PlayerPrefs.SetInt(random_key, value ? 1 : 0); 22 } 23 } 24}

上記コードのポイント

  • 一度にロードせず必要なタイミングで初期化すると処理が分散されるのでおすすめです。
  • ロードやセーブのタイミングを考える必要がないので楽です。

注意点など

  • PlayerPrefs.Save()は重い処理なので細かく呼ばない方が良いです。アプリを閉じる時や、フレームレートが落ちるのを許容できるタイミングで呼ぶと良いと思います。
  • ランダムなキーも良いですが、C#は文字列の扱いが苦手なので、可能であればシンプルなintで管理したいところです。

最後に、ここが一番重要です

PlayerPrefsは名前の通り環境設定などに使うものです。例をあげるとオーディオのON/OFFなど単純且つあまり呼ばれないものを永続保存したい場合に使用するものです。今回のように頻度が高そうなものはクラスで管理しMessagePackなどを使い保存するのをオススメします。

投稿2018/04/09 13:43

IShix

総合スコア1724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問