テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

エディタでゲーム再生中に変更した値を停止しても消さない方法

Unityはゲーム再生中のデータを残せない。

例えばPushを押す度にカウントが+1されるプログラムを組む。それをシーンに配置し、ゲームを再生前は0のカウントをプレイ中に5まで増やしたとする。その後再生を停止させてしまうと0に逆戻り、5から進行することは出来ない。

スクリーンショット 2013-09-29 20.14.03

スクリーンショット 2013-09-29 20.13.49

かといって絶対に出来ないという訳ではない。
例えばScriptableObjectを使用する方法がある。

[Unity]ScriptableObjectの使い方・・・?
[Unity]ScriptableObjectのhideFlagをリセット
ScriptableObjectマニュアル(日本語)

簡単な手順はこんな感じ。

  1. データを保持したいクラスを用意する(今回はSample.cs)。
    スクリーンショット 2013-09-29 20.32.19
  2. CreateScriptableObjectPrefubで1で用意したクラスをプレハブ化する。
    スクリーンショット 2013-09-29 20.32.32
  3. 適当なコンポーネントをシーンに配置し、そこから1で作ったプレハブを参照する。
    スクリーンショット 2013-09-29 20.33.00
これで、3で作ったコンポーネントから1で作ったScriptableObjectの値を変更した場合、ゲームの再生を停止した場合もゲームの情報が保持出来る。

スクリーンショット 2013-09-29 20.34.58  スクリーンショット 2013-09-29 20.35.04 

参考資料

UNITE 2013 レポート(4)[Unity]
Unity Serialization(英語)

ちなみに、再生中にコンポーネントをコピーし、終了後にペーストすればゲーム実行時のコンポーネントを適応出来る。単体のコンポーネント情報を保持したい場合はコレでもOK。



間違ってはいけないのが、これはエディタ上でのみ有効な手順という事。要するにiOSAndroidやWeb向けにビルドして出力した場合、ScriptableObjectの中身は変更されず、アプリを終了すると情報は失われる。

この場合、MsgpackやJSON等でシリアライズして保持するのが有効だ。間違っても大規模なデータをPlayerPrefsに突っ込んではいけない。(理由についてはこちらを参照)


ちなみに、エディタ上の単純な情報を保持したいだけならばUnityEditor.EditorPrefsがある。これはどちらかと言えばエディタ拡張で有効と思われ。


ちなみに、シーンを再生中に変更したデータを終了時にも保持させるアセットもある。
こっちの方はScriptableObjectを作らなくても保持出来るので、便利そうだ。

PlayModePersistスクリーンショット 2013-09-29 22.04.21

余りにも便利なので、記事にした。
[Unity]エディタ再生中の情報を停止時も保持するPlayModePersistが予想以上に使いやすい件