UnityUnityメモ

Unity初心者必見!ハイスコアをセーブ&リセットする仕組みを作ろう

Unity

1. はじめに

ゲームをプレイしていると、「ハイスコア」が表示される場面をよく目にしませんか?プレイヤーがゲームを再開したときに、前回のスコアやハイスコアがちゃんと残っていると、よりやりがいを感じますよね。

この記事では、Unity初心者でも簡単に作れる「ハイスコアのセーブ&リセット機能」の仕組みを解説します!Unityの便利な機能「PlayerPrefs」を使うことで、ゲームを終了してもデータを保持できるようになります。

また、シンプルなゲームとして、Sphere(球体)をクリックするたびにスコアが増える仕組みも一緒に作成します。記事を読み終えるころには、スコア表示やリセットボタン、クリックによる得点システムの基本が理解できるはずです!

PlayerPrefsとは?

PlayerPrefsはUnityに標準で備わっている、データを保存するための仕組みです。以下の特徴があります:

  • 簡単に使える:初心者でもコードを書くだけでデータを保存・取得できます。
  • 軽量:ハイスコアや設定データなど、少量のデータ保存に最適です。
  • 永続性:ゲームを終了してもデータが保持されます。

この仕組みを使えば、Unityで簡単にスコア管理ができるようになります。ゲームをより魅力的にするための第一歩を、一緒に学んでいきましょう!

この記事で学べること

  • ハイスコアを保存&リセットする方法
  • スコアをリアルタイムで更新するUIの作り方
  • PlayerPrefsの使い方
  • クリックイベントでスコアを増やすスクリプトの作成方法

それでは、早速始めてみましょう!まずは、スコアを表示するUIのセットアップからスタートします。

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. 基本のUIセットアップ

この記事では、スコアを表示するUIを作成する方法を解説します。Unityの「Text – TextMeshPro」機能を使えば、簡単にスコアやハイスコアを表示できます。また、スコアをリセットするためのボタンも作成します。それでは、手順を見ていきましょう!


① ハイスコアとスコアを表示するTextを追加

  1. TextMeshProをプロジェクトにインポート
    初めてTextMeshProを使う場合は、Unityが自動的に「TextMeshPro Essentials」をインポートするように求めます。「Import TMP Essentials」をクリックしてください。
  2. ハイスコア表示用のTextを作成
    • ヒエラルキーウィンドウで右クリックし、「UI」→「Text – TextMeshPro」を選びます。
    • 作成されたTextオブジェクトの名前を「HighScoreText」に変更します。
    • インスペクターウィンドウで以下の設定を変更しましょう:
      • Text: 「High Score: 0」
      • Font Size: 好みのサイズ(例: 36)
      • Alignment: 中央揃えに設定(HorizontalとVertical両方)
  3. スコア表示用のTextを作成
    • 上記と同じ手順で新しい「Text – TextMeshPro」を追加します。
    • 名前を「ScoreText」に変更します。
    • Text: 「Score: 0」と設定します。
  4. 配置を調整
    • ハイスコア(HighScoreText)を画面上部中央に配置。
    • スコア(ScoreText)をその下に配置。
    • サイズや位置は、RectTransformを使って好みに合わせて調整してください。

② リセットボタンを追加

  1. ボタンを作成
    • ヒエラルキーウィンドウで右クリックし、「UI」→「Button – TextMeshPro」を選びます。
    • 作成されたButtonオブジェクトの名前を「ResetButton」に変更します。
  2. ボタンのテキストを設定
    • Buttonの子オブジェクトとして「Text (TMP)」が自動で追加されています。
    • インスペクターウィンドウで以下を変更します:
      • Text: 「リセット」
      • Font Size: ボタンの大きさに合うサイズ(例: 24)
  3. 配置とデザインの調整
    • ボタンを画面下部中央に配置します。
    • 必要に応じて、RectTransformでボタンのサイズを変更します。
    • ボタンの背景色やスタイルをカスタマイズする場合は、Button (Script) コンポーネント内の設定を調整してください。

これで、ハイスコア、スコア、リセットボタンが揃いました!次は、スコアを管理し、ハイスコアを保存するスクリプトを作成していきます。次のセクションもお楽しみに!



3. スコア管理スクリプトの作成

このステップでは、スコアとハイスコアを管理するスクリプトを作成します。PlayerPrefsを使うことで、ゲームを終了したりシーンを再読み込みしてもハイスコアを保存できるようにします。さっそく作ってみましょう!


① スクリプトの作成

  1. プロジェクトウィンドウを開き、空白部分を右クリックします。
  2. Create」→「C# Script」を選び、スクリプト名を「ScoreManager」とします。
  3. 作成したスクリプトをダブルクリックして、スクリプトを開きます。

② コードを記述する

以下のコードをコピーして、「ScoreManager」スクリプトに貼り付けてください。

using UnityEngine;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public TextMeshProUGUI highScoreText; // ハイスコアを表示するUI
    public TextMeshProUGUI currentScoreText; // 現在のスコアを表示するUI

    private int currentScore = 0; // 現在のスコア
    private int highScore = 0; // ハイスコア

    void Start()
    {
        // PlayerPrefsから保存されたハイスコアを読み込む(初期値は0)
        highScore = PlayerPrefs.GetInt("HighScore", 0);
        UpdateScoreText();
    }

    void UpdateScoreText()
    {
        // UIにスコアを反映する
        currentScoreText.text = "Score: " + currentScore;
        highScoreText.text = "High Score: " + highScore;
    }

    public void AddScore(int points)
    {
        // スコアを加算
        currentScore += points;

        // ハイスコアを更新する
        if (currentScore > highScore)
        {
            highScore = currentScore;
            PlayerPrefs.SetInt("HighScore", highScore); // ハイスコアを保存
        }
        UpdateScoreText();
    }

    public void ResetScore()
    {
        // 現在のスコアをリセット
        currentScore = 0;
        UpdateScoreText();
    }

    public void ResetHighScore()
    {
        // ハイスコアをリセット
        highScore = 0;
        PlayerPrefs.DeleteKey("HighScore"); // PlayerPrefsからハイスコアを削除
        UpdateScoreText();
    }
}

③ スクリプトをUnityに適用する

  1. ヒエラルキーウィンドウで右クリックし、「Create Empty」を選びます。
  2. 新しい空のオブジェクトを「ScoreManager」と名前を変更します。
  3. 作成した「ScoreManager」オブジェクトに、作成したスクリプトをドラッグ&ドロップしてアタッチします。

④ スクリプトとUIの接続

  1. ScoreManagerオブジェクトを選択し、インスペクターウィンドウを開きます。
  2. スクリプトの「High Score Text」と「Current Score Text」の欄に、それぞれTextMeshProで作成した「HighScoreText」と「ScoreText」をドラッグ&ドロップします。

これで、スコアとハイスコアを管理する基本的なスクリプトが完成しました!次のステップでは、クリックイベントを実装し、スコアを増やす仕組みを作っていきます。



4. クリックでスコアを増やす仕組み

次に、ゲーム内でSphereをクリックしたときにスコアが増える仕組みを作成しましょう。このセクションでは、Sphereオブジェクトを作成し、クリックイベントでスコアを追加する方法を解説します。


Sphereオブジェクトの追加

  1. ヒエラルキーウィンドウで右クリックします。
  2. メニューから「3D Object」→「Sphere」を選択します。
  3. シーンにSphereが追加されます。これがスコアを増やすトリガーになります。

スクリプトの作成

次に、Sphereをクリックしたときにスコアを増やすスクリプトを作成します。

  1. プロジェクトウィンドウで右クリックします。
  2. 「Create」→「C# Script」を選択し、スクリプト名をSphereClickとします。
  3. 作成したスクリプトをSphereにドラッグしてアタッチします。
  4. スクリプトをダブルクリックして開き、以下のコードを入力してください。
using UnityEngine;

public class SphereClick : MonoBehaviour
{
    // ScoreManagerの参照を保持
    public ScoreManager scoreManager;

    // Sphereがクリックされたときに呼び出される
    void OnMouseDown()
    {
        // スコアを10ポイント加算
        scoreManager.AddScore(10);
    }
}

スクリプトの説明

  • OnMouseDown()は、オブジェクトがクリックされたときに実行されるUnityのイベントです。
  • scoreManager.AddScore(10)では、ScoreManagerスクリプトのAddScoreメソッドを呼び出し、10ポイントを加算します。
  • scoreManagerは、スコアを管理するためにScoreManagerスクリプトを参照しています。

スクリプトの設定

  1. ヒエラルキーウィンドウでSphereを選択します。
  2. インスペクターで、SphereClickスクリプト内のScoreManagerフィールドに、ScoreManagerスクリプトをアタッチしたオブジェクトをドラッグ&ドロップします。



5. ボタンのイベント設定

リセットボタンに機能を追加して、ボタンが押されたときにハイスコアをリセットする処理を設定します。Unityのインスペクターから簡単に設定できるので、手順通りに進めてみましょう!

リセットボタンの機能を追加する手順

  1. ボタンの作成を確認 まず、ヒエラルキー内に「ResetButton」という名前のボタンがあることを確認してください。このボタンを使ってハイスコアをリセットします。
  2. ボタンの「On Click()」セクションを探す
    • ResetButtonをヒエラルキーで選択し、インスペクターを開きます。
    • インスペクター内の「Button (Script)」セクションにある「On Click()」という項目を見つけます。
  3. イベントを追加
    • 「On Click()」セクション内にある「+」ボタンをクリックして、新しいイベントスロットを追加します。
    • 「オブジェクト」欄に、ScoreManagerスクリプトがアタッチされたオブジェクトをドラッグ&ドロップします。
  4. リセットメソッドを選択
    • ドロップダウンメニューをクリックし、「ScoreManager」→「ResetHighScore」を選択します。
    • これで、ボタンがクリックされたときにResetHighScore()メソッドが実行されるようになります。



6.動作確認

設定が完了したら、ボタンが正しく動作するか確認しましょう。

  1. ゲームを再生(Play)
    • Unityエディターの再生ボタンをクリックしてゲームを開始します。
  2. ハイスコアをリセット
    • スコアをいくつか増やした状態でリセットボタンをクリックしてみましょう。
    • ハイスコアがリセットされ、UIに表示された値が0に変更されていれば成功です。

これで、リセットボタンの設定は完了です!インスペクターから簡単に設定できるので、コードを書く必要がないのも嬉しいポイントですね。この方法を応用すれば、他のボタンに新しい機能を追加することもできます。例えば、スコアを保存したり、別のシーンに移動したりするボタンを作ることも可能です。ぜひ試してみてください!



7. まとめ

この記事では、Unityでハイスコアをセーブ&リセットできる仕組みを作成する方法を学びました。PlayerPrefsを使用することで、ゲームを再起動してもハイスコアが保持される仕組みを簡単に実装できることを理解できたと思います。また、スコアをクリックで増やす簡単なインタラクションやリセットボタンの設定方法も紹介しました。


応用編:ハイスコアをランキング形式にする

もしさらにチャレンジしたい場合は、ハイスコアをランキング形式で管理してみてはいかがでしょうか?
例えば、**リスト(List)**を使用して複数のスコアを保存し、順位に基づいてランキングを表示する方法があります。この場合は、PlayerPrefsではなく、JSON形式でデータを保存する仕組みを取り入れると便利です。


次に学ぶべきこと

ハイスコアの管理ができるようになったら、次は以下のテーマに挑戦してみましょう!

  1. ゲーム終了画面の作成
    • スコアやハイスコアを表示するだけでなく、「もう一度プレイする」「メニューに戻る」などの選択肢を加えて、ゲーム全体の流れを作ってみましょう。
  2. アニメーションの追加
    • スコアが増えたときや新しいハイスコアを達成したときに、アニメーションを表示することでプレイヤー体験を向上させられます。例えば、TextMeshProの色を変えたり、サイズをアニメーションで変更してみましょう。
  3. サウンドの追加
    • Sphereをクリックしたときやボタンを押したときに効果音を追加することで、より楽しいゲーム体験が作れます。UnityのAudioSourceを活用して実装してみてください。

これで、ハイスコアのセーブ&リセットの仕組みを活用したシンプルなゲームの基盤が完成しました。少しずつ新しい要素を加えて、オリジナルのゲームを作り上げてください!新しいチャレンジを楽しみにしています! 🎮



よくある質問(FAQ)

Q
PlayerPrefsで保存されるデータの保存先は?
A

PlayerPrefsで保存されたデータは、プラットフォームごとに異なる場所に保存されます。例えば:

  • Windows: レジストリに保存されます。パスは HKEY_CURRENT_USER\Software\[会社名]\[アプリ名] です。
  • Mac: ~/Library/Preferences/[会社名].[アプリ名].plist に保存されます。
  • Android: アプリの内部ストレージに保存されます。

このように、システムに依存して保存場所が異なるので注意してください。

Q
データを削除したいときはどうすればいい?
A

PlayerPrefsのデータを削除する方法は以下の通りです。

  • 特定のキーのデータを削除したい場合は、PlayerPrefs.DeleteKey("キー名"); を使用します。
  • すべてのデータを削除したい場合は、PlayerPrefs.DeleteAll(); を使用します。

ただし、DeleteAll を使うとすべてのデータが消えてしまうので、注意して使用してください。

Q
ハイスコア以外に保存できるデータは?
A

PlayerPrefsは文字列、整数、浮動小数点数(float)の保存が可能です。例えば:

  • 文字列データ
    PlayerPrefs.SetString("PlayerName", "UnityPlayer");
    string playerName = PlayerPrefs.GetString("PlayerName", "DefaultName");
  • 整数データ
    PlayerPrefs.SetInt("Level", 5);
    int level = PlayerPrefs.GetInt("Level", 1);
  • 浮動小数点数データ
    PlayerPrefs.SetFloat("Volume", 0.8f);
    float volume = PlayerPrefs.GetFloat("Volume", 1.0f);

このように、スコアだけでなく、プレイヤー名や設定値などさまざまなデータを保存することが可能です。

おすすめのアセット

「Saving System for DOTS」は、UnityのDOTS(Data-Oriented Technology Stack)向けに特化したセーブシステムです。大量のエンティティデータを効率的に管理できるため、大規模でパフォーマンスを重視したプロジェクトに最適です。シーンの保存と読み込みが高速で、簡単なインテグレーションが可能です。Built-in、URP、HDRPにも対応しており、幅広いレンダリング環境で利用できます。