アプリケーションをリリースする際の現地調整などで、パラメータを少し変更したい場合があります。UnityではPlayerPrefsクラスを使うことでint、string、floatの保存および復元ができます。
環境
- Windows 8.1 Pro Update1
- Unity Pro 4.5
- Visual Studio 2013 Ultimate
- UnityVS
参考サイト
プロジェクト
できること
int、string、floatの保存および復元
解説
Windowsデスクトップアプリケーションおよびエディターでの動作の場合はレジストリの
「HKEY_CURRENT_USER\Software\[company name]\[product name]」
に保存されます。ほかの環境については参考サイトを参照してください。
company nameおよびproduct nameは「Build Settings|Player Settings」から変更できます。
デフォルトでは「DefaultCompany」と「作成したプロジェクト名(ここではPlayerPrefs)」です。
値の保存は次のメソッドで行います。型によって呼び出しが変わります。
- 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.htmlusing 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()で初期化しています。