【Unity3Dサンプルゲーム】障害物ランを作ろう~13~【チュートリアル】

前回の障害物ランを作ろう~12~の続きです。

スクリプトをかいて、ゴール時に表示されたいテキストをゴール時に表示させる処理を行います。

目次

前提条件

【Unity3Dサンプルゲーム】障害物ランを作ろう~12~まで終わらせておいてください。

今回の流れ

  • 「Canvas」にスクリプトの追加,アタッチする
  • 「GameFinish」スクリプトを開く
  • スクリプトを書く

「Canvas」にスクリプトの追加,アタッチする

「Canvas」にスクリプトの追加,アタッチする

●【Canvas】にスクリプトの追加,アタッチする

【Canvas】→【Inspector】→【Add Component】→【New script】→【GameFinishを入力】→【Create and Add】

「GameFinish」スクリプトを開く

GameFinishを開く

●【GameFinish】スクリプトを開く

【Projectウィンドウ】→【Assets】→【GameFinishをダブルクリック】→【Visual StudioかMonoDevelopが開く】

Visual StudioかMonoDevelopどっちが開いても同じコードを入力してください。自分はVisual Studioです。

スクリプトを書く

以下のコードを書いていきます。コードが小さくてごめんなさい。お使いのブラウザで拡大してご覧ください。検索すれば出ると思われます。

あと、最後の「}」を忘れないでください。「//」はコメントなので、実行されません。

GameFinish

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 1.UIシステムを使うときに必要なライブラリ
using UnityEngine.UI;
// 2.Scene関係の処理を行うときに必要なライブラリ
using UnityEngine.SceneManagement;

public class GameFinish : MonoBehaviour
{

    private int bestScore;         // 3.ベストタイムの値を格納する変数
    public Text finishTime;        // 4.FinissTimeテキストの変数
    public Text bestTime;          // 5.BestTimeテキストの変数
    public GameObject finishUI;    // 6.「Finish」オブジェクトの変数

    // Use this for initialization
    void Start()
    {

        // 7.もしBestScoreがあるなら、bestScoreに格納
        if (PlayerPrefs.HasKey("BestScore"))
        {
            bestScore = PlayerPrefs.GetInt("BestScore");
        }
        else
        {
            bestScore = 999;
        }

    }

    // Update is called once per frame
    void Update()
    {

        // 8.もしゴールしたら
        if (Goal.goal == true)
        {
            // 9.「Finish」を表示
            finishUI.SetActive(true);

            // 10.クリア時間を整数にしてscoreに格納
            int score = Mathf.FloorToInt(Timer.time);

            // 11.テキストの値を変える
            finishTime.text = "FinishTime = " + score;
            bestTime.text = "BestTime = " + bestScore;

            // 12.もしクリアスコアがベストスコアより小さい場合
            if (bestScore > score)
            {
                // 13.BestScoreにクリアスコアを入れる
                PlayerPrefs.SetInt("BestScore", score);
            }
        }
    }

    // 14.OnRetry関数が実行されたら、現在のSceneを読み込む
    public void OnRetry()
    {
        SceneManager.LoadScene(
            SceneManager.GetActiveScene().name);
    }
}

スクリプトの説明

1.UIシステムを利用するときに必要なライブラリ読み込む

GameFinish

// 1.UIシステムを使うときに必要なライブラリ
using UnityEngine.UI;

UIシステムを使うときに必要なライブラリを読みこみます。

2.Scene関係の処理を行うときに必要なライブラリ

GameFinish

// 2.Scene関係の処理を行うときに必要なライブラリ
using UnityEngine.SceneManagement;

Scene関係の処理を行うときにライブラリを読み込みます。

3・4・5・6.変数宣言

GameFinish

private int bestScore;       // 3.ベストタイムの値を格納する変数
public Text finishTime;       // 4.FinishTimeテキストの変数
public Text bestTime;          // 5.BestTimeテキストの変数
public GameObject finishUI; // 6.「Finish」オブジェクトの変数

変数宣言しています。

  • ベストタイムの値を格納する変数「bestScore」
  • FinishTimeテキストの変数
  • BestTimeテキストの変数
  • ゲームクリア時の処理をまとめた「Finish」オブジェクトの変数

の変数宣言をしています。「Finish」オブジェクトの変数を作る理由は、ゲームクリア時に非表示から表示にする理由があるからです。

7.セーブ

GameFinish

// 7.もしBestScoreがあるなら、bestScoreに格納
if (PlayerPrefs.HasKey("BestScore"))
{
bestScore = PlayerPrefs.GetInt("BestScore");
}
else
{
bestScore = 999;
}

PlayerPrefs データのセーブを行ってくれる
PlayerPrefs.HasKey("A") Aというものがあるか判断してくれる
PlayerPrefs.GetInt("A"); AのInt型(整数型)の値を取得

ゲーム開始時にBestScoreがあるか、PlayerPrefs.HasKey("BestScore")で確認しています。もしあったら、bestScoreにBestScoreを入れてくれます。

 

もしゲーム開始時にBestScoreがなかったら、bestScore = 999にしています。

まとめると、ゲーム開始にBestScoreがあったら、その値をbestScoreにいれるよ。もしなかったら、とりあえず999にしとくね。

8.もしゴールしたら

GameFinish

// 8.もしゴールしたら
if (Goal.goal == true)
{

}

if(A == true){B} もしAがtrueだったら、Bを行う

もしGoalファイルのgoalがtrueだったときの処理を書いています。Goal.csを書いたときの変数を利用してます。

9.「finishUI」に格納したオブジェクトを有効・表示する

GameFinish

// 9.「Finish」を表示
finishUI.SetActive(true);

オブジェクトを見えなくしたことを覚えていますか。それを表示する処理を書いています。

10.クリア時間を整数にしてscoreに格納

GameFinish

// 10.クリア時間を整数にしてscoreに格納
int score = Mathf.FloorToInt(Timer.time);

Mathf.FloorToInt(A); Aをint型(整数)にしてscoreに格納

Timerと名前をつけたスクリプトを以前かきましたよね。そのTimerのtime変数を整数にして、scoreに入れてます。

11.テキストの値を変える

GameFinish

// 11.テキストの値を変える
finishTime.text = "FinishTime = " + score;
bestTime.text = "BestTime = " + bestScore;

ゲームクリア時に表示される「FinishTime」とベストスコアを表示する「BestScore」の時間を表す部分だけをかえて、変数に格納しています。

12・13.もしベストスコアがクリアスコアより高い場合

GameFinish

// 12.もしベストスコアがクリアスコアより高い場合
if(bestScore > score)
{
// 13.BestScoreにクリアスコアを入れる
PlayerPrefs.SetInt("BestScore", score);
}

if(A > B){C} もしBがAより小さい場合、Cの処理を行う
PlayerPrefs データのセーブを行っている
PlayerPrefs.SetInt("A", B); Bの値をAに格納

もし今回のクリアスコアが過去のベストスコアより高い場合、BestScoreの値をscoreの値に変えてくれます。

14.Retryボタンの処理

GameFinish

// 14.OnRetry関数が実行されたら、現在のSceneを読み込む
public void OnRetry()
{
SceneManager.LoadScene(
SceneManager.GetActiveScene().name);
}

SceneManager.LoadScene("A") 「A」Sceneを読み込む
SceneManager.GetActiveScene().name 現在のSceneを表す。(今回でいうMainシーン)

【SceneManager.LoadScene(A)】で「A」のSceneを読み込むという処理を行います。

【SceneManager.GetActiveScene().name】は現在のSceneを表します。今回でいうと、Mainシーンのことを表します。

スクリプト全体の説明

ベストスコアがあったら、その値をベストスコアとして表示するよ

ゴールしたら「Finish」オブジェクトを非表示の状態から、表示の状態にするよ。

クリア時間を整数にするよ

テキストを変更するよ

もし現在のスコアの方がベストスコアより小さかったら、その現在のスコアをベストスコアにするよ

OnRetry関数が実行されたら、現在のSceneをもう一度読み込むよ

スクリプトを保存する

Visual Studioの場合→【ファイル】→【すべて保存か〇〇の保存】(WindowsでCTRL + Sでも可)

MonoDevelopの場合→【File】→【Save】

おわりに

まだこのスクリプトを完成させたからといって、ゲームを実行してもなにもかわりません。

GameFinishの変数にUIオブジェクトをアタッチすることが必要があります。ことばは難しいですが、簡単なので大丈夫です。

では,【Unity3Dサンプルゲーム】障害物ランを作ろう~14~にいきましょう。

あわせて読みたい
【Unity3Dサンプルゲーム】障害物ランを作ろう~14~【チュートリアル】 障害物ランを作ろう~13~の続きです。 前回書いたスクリプトとオブジェクトを関連させます。 【前提条件】 障害物ランを作ろう~13~まで終わらせておいてください。 ...
Unity3Dサンプルゲーム【障害物ラン】13記事目

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次