Unity 玉転がし#03 ベストタイムのセーブとロード

アイキャッチ チュートリアル

Unity チュートリアル 玉転がしゲーム作成の第3回目です。

今回はプレイタイムとベストタイムの表示を実装します。

あわせてベストタイムのセーブとロードも実装していきます。

この工程を通して、テキストオブジェクトの更新方法とセーブ/ロードの実装方法を覚えましょう。

それでは、以下、解説。

この記事の Unity バージョンは、2019.2.5f1 です。

1.プレイタイムを表示する

まずは Main シーンのプレイタイム表示です。

下記の手順でテキストオブジェクトを用意します。

  1. Canvas を作る
    ・Create → UI → Canvas で作成します。
    ・Canvas Scaler の UI Scale Mode を Scale With Screen Size にします。
    ・Reference Resolution を x 1920 y 1080 にします。
    ・Screen Match Mode を Expand にします。
  2. Text を作る
    ・Create → UI → Text でテキストオブジェクトを作成します。
    ・PosX 0, PosY 460, PosZ 0、Width 600, Height 160 にします。
    ・Font Size 100 にします。フォントの色はなんでもいいです。
    ・Alignment を中央寄せにします。
  3. スクリプトをアタッチする
    ・Scriptsフォルダを右クリックし、Create → C# Script を選択、名前を「PlayTime」とします。
    ・Text に PlayTime をアタッチします。

PlayTime に下記のコードを追加します。

using System; // 追加
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 追加

public class PlayTime : MonoBehaviour
{
	public float time = 0.0f; // 経過時間

	private Text text = null; // 表示用のテキストオブジェクト

	void Start()
	{
		text = GetComponent<Text>();
	}

	void Update()
	{
		time += Time.deltaTime;

		if ( text )
		{
			TimeSpan timeSpan = TimeSpan.FromSeconds( time );
			string minutes = timeSpan.Minutes.ToString( "00" );
			string seconds = timeSpan.Seconds.ToString( "00" );
			string millSeconds = timeSpan.Milliseconds.ToString( "000" );
			text.text = minutes + ":" + seconds + "." + millSeconds;
		}
	}
}

こんな感じでさくっとプレイタイム表示ができました。

PlayTime

2.リザルトでベストタイムの表示する

今度は Result シーンでベストタイムの表示を行います。

ついでに、ゲームクリアとゲームオーバーのテキストも表示してみます。

下記の手順で Result シーンに UI を配置します。

  1. キャプション用の Text を作る
    ・Create → UI → Text を選択し、名前を「Caption」とします。
    ・PosX 0, PosY 240, PosZ 0、Width 800, Height 160 にします。
    ・Font Size 100 にします。フォントの色はなんでもいいです。
    ・Alignment を中央寄せにします。
  2. Caption スクリプトをアタッチする
    ・「Caption」スクリプトを新規作成して、アタッチします。
  3. ベストタイム用の Text を作る
    ・Create → UI → Text を選択し、名前を「BestTime」とします。
    ・PosX 0, PosY -240, PosZ 0、Width 800, Height 240 にします。
    ・Font Size 80 にします。フォントの色はなんでもいいです。
    ・Alignment を中央寄せにします。
  4. BestTime スクリプトをアタッチする
    ・「BestTime」スクリプトを新規作成して、アタッチします。

出来上がり図。

BestTime

Caption スクリプトに下記のコードを追加します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 追加

public class Caption : MonoBehaviour
{

	// Start is called before the first frame update
	void Start()
	{
		Text text = GetComponent<Text>();

		if ( text )
		{
			// シーン上にアイテムが残っていたら、「GAME OVER」、
			// 残っていなかったら、「CLEAR!」と表示する。
			if ( GameObject.FindGameObjectsWithTag( "Item" ).Length > 0 )
			{
				text.text = "GAME OVER";
			}
			else
			{
				text.text = "CLEAR!";
			}
		}
	}
}

PlayerPrefs を使ってベストタイムのセーブ/ロードを実装する

つづいて、BestTime スクリプトを編集していきます。

Unity には、簡単にセーブ/ロードを実装できる PlayerPrefs という機能があります。

今回はこれを利用してベストタイムのセーブ/ロードを実装します。

using System; // 追加
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 追加

public class BestTime : MonoBehaviour
{
	void Start()
	{
		Text text = GetComponent<Text>();

		if ( text )
		{
			float defaultValue = -1.0f;

			// PlayerPrefs からベストタイムをロードする。まだベストタイムが保存されていない場合は、defaultValue が返ってくる。
			float bestTime = PlayerPrefs.GetFloat( "BestTime", defaultValue );


			// シーン上にアイテムが残っていない場合(=ゲームクリア)は、ベストタイムの更新をチェックする。
			if ( GameObject.FindGameObjectsWithTag( "Item" ).Length == 0 )
			{
				PlayTime playTime = GameObject.FindObjectOfType<PlayTime>();

				// 初回更新、またはタイム短縮したら PlayerPrefs にセーブする。
				if ( bestTime == defaultValue || bestTime > playTime.time )
				{
					PlayerPrefs.SetFloat( "BestTime", playTime.time );
					bestTime = playTime.time;
				}
			}

			if ( bestTime == defaultValue )
			{
				// まだ一度もベストタイムがセーブされていないときは、テキストを表示しない。
				text.gameObject.SetActive( false );
			}
			else
			{
				TimeSpan timeSpan = TimeSpan.FromSeconds( bestTime );
				string minutes = timeSpan.Minutes.ToString( "00" );
				string seconds = timeSpan.Seconds.ToString( "00" );
				string millSeconds = timeSpan.Milliseconds.ToString( "000" );
				text.text = "BestTime\n" + minutes + ":" + seconds + "." + millSeconds;
			}
		}
	}
}

ここまで出来たら、Main シーンに戻り、ゲームを実行してください。

ちゃんとキャプションが切り替わるか、ベストタイムが更新されるかを確認しましょう。

更新テスト

完璧ですね。

あと、PlayerPrefs に保存したデータを全削除したいときは、

Unityのメニューから Edit → Clear All PlayerPrefs でできます。

まっさらな状態から確認したいときには、これで削除してください。

今回はここまでです。

次回は、タイトルを追加してゲームを完成させます。

以上。おしまい。



コメント

タイトルとURLをコピーしました