読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

シーンを切り替えても引き継げて、簡単に書き換えられるデータ 【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.4f1 Personal


はじめに

ゲーム画面でのスコアをリザルト画面で使いたい、といったように

シーンを切り替えてもデータを保持したい、でも別に保存したいわけじゃない

みたいなことはよくあると思います。


そういう時には、以下のような方法が考えられると思いますが、

  • Staticなクラスに保持してもらう
  • Playerprefabで保存
  • DontDestroyOnLoad でオブジェクトを消えないようにし、そこにデータを保持


今回は上記のどれにも当てはまらないScriptableObjectを使った方法のご紹介です!

今回紹介する方法の利点は以下の通り。

  • 現在のデータがInspector上で目視&変更可能
  • スクリプトからのデータ取得&変更が簡単
  • シーンを切り替えても引き継げる
  • エディタ実行中か否かにかかわらず書き換えられる&読み込める


イメージは以下のような感じ。


f:id:kan_kikuchi:20160801135537p:plain

CacheData.Entity.Score = 10; //キャッシュデータにスコア登録
int score = CacheData.Entity.Score; ; //キャッシュデータからスコア取得



CacheData

まずはコードです。



上記のCacheData.csとCacheDataEditor.csを作成した後、

ProjectのCreate -> Cache DataからCache Dataを作成、


f:id:kan_kikuchi:20160802133956p:plain


CacheDataEditor.csをEditorディレクトリ、CacheDataをResources直下に入れれば準備完了です!


f:id:kan_kikuchi:20160802134043p:plain


使い方

次にCacheDataの使い方です。

スクリプトからのデータを取得、変更する場合はCacheData.Entityを使います。

CacheData.Entity.Score = 10; //キャッシュデータにスコア登録
int score = CacheData.Entity.Score; ; //キャッシュデータからスコア取得


なお、Entityへの初アクセス時にResources.Loadをするため、

Inspectorで設定したり、あらかじめLoadするなどの準備は必要はありません。


また、Inspectorで値を設定することも出来ます。


f:id:kan_kikuchi:20160802134321p:plain


CacheDataはエディター上でのテストを想定しているので、

実機での実行時はRefreshを実行して各値を初期化しています。


なので、新しい値を追加したらRefreshにも初期化処理を追加してください。

  public int Score = 0;

  //新しく追加したスコア
  public float NewScore = 0;

  //=================================================================================
  //初期化
  //=================================================================================

  /// <summary>
  /// キャッシュを全て初期化
  /// </summary>
  public void Refresh(){
    Score = 0;
    NewScore = 0;//初期化処理も追加
  }  


なお、初期化はInspectorから行うことも出来ます。


f:id:kan_kikuchi:20160802134844g:plain


おわりに

結構便利な方法だと思いますが、一つ注意点があります。

それはエディタ実行中に値を書き換えるとその値が残るということです。


f:id:kan_kikuchi:20160802135231g:plain


一応、エディタ実行時と終了時のイベントは取れるので、

エディタ実行前の値に戻すということも可能ですが、今回は実装していませんのであしからず。


なお、エディタ実行時と終了時のイベント取得方法は以下の記事を参照のこと。