ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Unityでパラメータを保存、復元する

アプリケーションをリリースする際の現地調整などで、パラメータを少し変更したい場合があります。UnityではPlayerPrefsクラスを使うことでint、string、floatの保存および復元ができます。

環境

参考サイト

プロジェクト

できること

int、string、floatの保存および復元

キャプチャ

解説

Windowsデスクトップアプリケーションおよびエディターでの動作の場合はレジストリ

「HKEY_CURRENT_USER\Software\[company name]\[product name]」

に保存されます。ほかの環境については参考サイトを参照してください。

スクリーンショット 2014-06-26 15.37.08

company nameおよびproduct nameは「Build Settings|Player Settings」から変更できます。

デフォルトでは「DefaultCompany」と「作成したプロジェクト名(ここではPlayerPrefs)」です。

スクリーンショット_062614_034525_PM

値の保存は次のメソッドで行います。型によって呼び出しが変わります。

  • PlayerPrefs.SetString()
  • PlayerPrefs.SetInt()
  • PlayerPrefs.SetFloat()

実際に保存されるのはアプリケーションの終了時のようです。すぐに保存したい場合にはPlayerPrefs.Save()を呼びだすようです。レジストリの場合はSetXxx()を呼び出した段階で保存されているようです。

値の復元は次のメソッドで行います。

  • PlayerPrefs.GetString()
  • PlayerPrefs.GetInt()
  • PlayerPrefs.GetFloat()

簡単なサンプルは次の通りです。

using UnityEngine;

using System.Collections;

public class GUIBehaviourScript2 : MonoBehaviour {

// Use this for initialization

void Start () {

Toggle = PlayerPrefs.GetInt( "Toggle2" ) == 0 ? false : true;

Text = PlayerPrefs.GetString( "Text2" );

}

// Update is called once per frame

void Update () {

}

public bool Toggle = false;

public string Text = "";

//public string Text = PlayerPrefs.GetString( "Text" ); // これはエラー

void OnGUI()

{

var toggle = GUI.Toggle( new Rect( 250, 100, 100, 30 ), Toggle, "bool値" );

if ( toggle != Toggle ) {

Toggle = toggle;

PlayerPrefs.SetInt( "Toggle2", Toggle ? 1 : 0 );

//PlayerPrefs.Save();

}

var text = GUI.TextArea( new Rect( 250, 140, 100, 30 ), Text, 10 );

if ( text != Text ) {

Text = text;

PlayerPrefs.SetString( "Text2", Text );

//PlayerPrefs.Save();

}

}

}

なお、このコードだと保存が混じって見通しが悪くなるので、プロパティでかぶせてみます(Livetのプロパティのようにしてみました)。

// http://docs.unity3d.com/ScriptReference/PlayerPrefs.html

using UnityEngine;

using System.Collections;

public class GUIBehaviourScript1 : MonoBehaviour {

// Use this for initialization

void Start () {

Toggle = PlayerPrefs.GetInt( "Toggle1" ) == 0 ? false : true;

Text = PlayerPrefs.GetString( "Text1" );

}

// Update is called once per frame

void Update () {

}

#region Toggle

public bool _Toggle;

public bool Toggle

{

get

{

return _Toggle;

}

set

{

if ( _Toggle == value ) {

return;

}

_Toggle = value;

PlayerPrefs.SetInt( "Toggle1", value ? 1 : 0 );

//PlayerPrefs.Save();

}

}

#endregion

#region Text

public string _Text = "";

public string Text

{

get

{

return _Text;

}

set

{

if ( _Text == value ) {

return;

}

_Text = value;

PlayerPrefs.SetString( "Text1", value );

//PlayerPrefs.Save();

}

}

#endregion

void OnGUI()

{

Toggle = GUI.Toggle( new Rect( 100, 100, 100, 30 ), Toggle, "bool値" );

Text = GUI.TextArea( new Rect( 100, 140, 100, 30 ), Text, 10 );

}

}

初期値の取得がコンストラクタ(値の宣言時)にできればよいのですが、どうもPlayerPrefsクラスはメインスレッドでの呼び出しが必須で、コンストラクタは別スレッドになるため、ダメなようです。そのためStart()で初期化しています。