前回の障害物ランを作ろう~12~の続きです。
スクリプトをかいて、ゴール時に表示されたいテキストをゴール時に表示させる処理を行います。
前提条件
【Unity3Dサンプルゲーム】障害物ランを作ろう~12~まで終わらせておいてください。
今回の流れ
- 「Canvas」にスクリプトの追加,アタッチする
- 「GameFinish」スクリプトを開く
- スクリプトを書く
「Canvas」にスクリプトの追加,アタッチする
●【Canvas】にスクリプトの追加,アタッチする
【Canvas】→【Inspector】→【Add Component】→【New script】→【GameFinishを入力】→【Create and Add】
「GameFinish」スクリプトを開く
●【GameFinish】スクリプトを開く
【Projectウィンドウ】→【Assets】→【GameFinishをダブルクリック】→【Visual StudioかMonoDevelopが開く】
Visual StudioかMonoDevelopどっちが開いても同じコードを入力してください。自分はVisual Studioです。
スクリプトを書く
以下のコードを書いていきます。コードが小さくてごめんなさい。お使いのブラウザで拡大してご覧ください。検索すれば出ると思われます。
あと、最後の「}」を忘れないでください。「//」はコメントなので、実行されません。
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システムを利用するときに必要なライブラリ読み込む
// 1.UIシステムを使うときに必要なライブラリ
using UnityEngine.UI;
UIシステムを使うときに必要なライブラリを読みこみます。
2.Scene関係の処理を行うときに必要なライブラリ
// 2.Scene関係の処理を行うときに必要なライブラリ
using UnityEngine.SceneManagement;
Scene関係の処理を行うときにライブラリを読み込みます。
3・4・5・6.変数宣言
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.セーブ
// 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.もしゴールしたら
// 8.もしゴールしたら
if (Goal.goal == true)
{
}
if(A == true){B} | もしAがtrueだったら、Bを行う |
---|
もしGoalファイルのgoalがtrueだったときの処理を書いています。Goal.csを書いたときの変数を利用してます。
9.「finishUI」に格納したオブジェクトを有効・表示する
// 9.「Finish」を表示
finishUI.SetActive(true);
オブジェクトを見えなくしたことを覚えていますか。それを表示する処理を書いています。
10.クリア時間を整数にしてscoreに格納
// 10.クリア時間を整数にしてscoreに格納
int score = Mathf.FloorToInt(Timer.time);
Mathf.FloorToInt(A); | Aをint型(整数)にしてscoreに格納 |
---|
Timerと名前をつけたスクリプトを以前かきましたよね。そのTimerのtime変数を整数にして、scoreに入れてます。
11.テキストの値を変える
// 11.テキストの値を変える
finishTime.text = "FinishTime = " + score;
bestTime.text = "BestTime = " + bestScore;
ゲームクリア時に表示される「FinishTime」とベストスコアを表示する「BestScore」の時間を表す部分だけをかえて、変数に格納しています。
12・13.もしベストスコアがクリアスコアより高い場合
// 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ボタンの処理
// 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~にいきましょう。
コメント