【Unity】ステージ解放を簡単に実装できるようにした【コピペOK】
こんにちは!今絶賛アプリ開発中のシロウです!
はい、ということで初アプリをリリースするために絶賛アプリを開発中なのですが『「???」と書かれているステージボタンの名前をボスを倒すと変更して、そのステージにチャレンジできるようになる』という機能を実装しようと思ったときに、ほんの少しだけ立ち止まりました。
ですが、無事実装できたので他のアプリ開発者の方が『ステージ解放機能』で迷わないようにここにやり方を記しておきます。
たぶん5分もかからずに実装できてしまうと思うのでぜひご利用ください!!!
記事内のコードはいくらでも自分のスクリプトにコピペして頂いていいのでお気軽に( ̄▽ ̄)
とりあえずステージ開放用のコードを載せます
一旦、全てのコードをここに載せてしまいます。
もちろんこれで全て理解できた人はそのままコピペでサクッとアプリ開発を進めてください。
コードをざっと読んだけど理解できなかった方はわかりやすく説明しますので、そのまま読み進めてください。
↓ステージボタンをまとめるスクリプト↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class StageSelector : MonoBehaviour
{
private int stageNumber; //ステージ開放条件の値を格納
//ステージ1はゲームスタート時に解放されているのでstage2から
public Text stage2;
public Text stage3;
public Text stage4;
public Text stage5;
void Start()
{
stageNumber = PlayerPrefs.GetInt("stageNumber");
}
void Update()
{
if(stageNumber >= 2)
{
stage2.text = "荒れた広野"; //ステージ2の名前
}
if (stageNumber >= 3)
{
stage3.text = "滑稽の洞窟"; //ステージ3の名前
}
if (stageNumber >= 4)
{
stage4.text = "憤怒の墓地";//ステージ4の名前
}
if (stageNumber >= 5)
{
stage5.text = "終焉の城";//ステージ5の名前
}
}
↓下記のコードを自分の好きなスクリプトに貼り付ける↓
[SerializeField] private int stageNum; //このボスが登場するステージ番号をインスペクターに指定
//~~中略〜〜//
public void StageOpen()
{
PlayerPrefs.SetInt("stageNumber", stageNum);//PlayerPrefsでクリアしたステージ番号をセット
}
さて、それでは解説していきます。
ステージ解放の手順
手順としては下記の通り、たったの7つです。5分で終わります。
- ステージシーンに飛ぶ用のボタンをいくつか作る
- 『StageSelector』(空のオブジェクト)を用意する *名前は何でもOK
- 「StageSelector.cs」(スクリプト)を②のオブジェクトにアタッチ
- ②のオブジェクトのInspectorに①で作ったボタンテキストをアタッチ
- ステージシーンを作る
- 各ステージシーンにステージ番号を割り振る
- 関数「StageOpen()」を任意のタイミングで呼び出す
さて、それでは早速ですがサクッと解説していきましょう!
手順①:ボタンをいくつか作る
とりあえず上記のような各ステージシーンに遷移するためのボタンをいくつか用意します。
好きな数を作ってもらえればいいのですが、今回は5つにしました。
ボタンの作り方は下記画像の通り、【Create】>【UI】>【Button】の手順で作れます。
手順②:空のオブジェクトを用意する
次に上記の手順(【Create】>【Create Empty】)で空のオブジェクトを作成します。
今回は『StageSelector』という名前にしましたが、名前は何でもいいです。(自分の名前とかにしてもいいですよ( ̄▽ ̄)。嘘です、そんな意味不明なことは辞めておきましょう笑)
手順③:スクリプトをアタッチ
前述した「StageSelectorスクリプト」を【手順②】で作った空のオブジェクトにアタッチしてください。
手順④:Inspector(インスペクター)上からボタンテキストをアタッチ
上記画像のように、【手順③】でアタッチした空のオブジェクトのinspector(インスペクター)上に「Stage2」~「Stage5」が現れているはずなので、そこに各ステージボタンをアタッチしてください。
画像では「StageSelect」が「Button」の親、「Button」が「Stage2~Stage5」の親、となっていますが、これは僕が見やすくするためにまとめているだけなので、無視してもらってOKです。
手順⑤:ステージシーンを作って、スクリプトをアタッチ
次に上記画像のように(【Create】が抜けてますが)【Project】>【Create】>【Scene】という手順でステージシーンを作ってください。
そして、クリア判定を実装しているスクリプトに下記の2行を追加してください。(例:ボスが死ぬことをクリア条件にするなら「ボスがHP0になった時の処理」を書いているスクリプトに下記2行を追加)
[SerializeField] private int stageNum; //このボスが登場するステージ番号をインスペクターに指定
//~~中略〜〜//
public void StageOpen()
{
PlayerPrefs.SetInt("stageNumber", stageNum);//PlayerPrefsでクリアしたステージ番号をセット
}
手順⑥:シーンにステージ番号を割り振る
次に『ステージをクリア後に解放したいステージの番号』を『【手順④】でコードを追加したコードをアタッチしているオブジェクト上』から指定してください。
例えば、ステージ2をクリアした次にステージ3を解放したいなら『ステージ2のシーンのInspector上で「stageNum」の番号を「3」』とします。
手順⑥:関数「StageOpen()」を任意のタイミングで呼び出す
あとは「StageOpen()」を好きなタイミングで呼び出せば、『ステージ番号がセーブされて、タイトル画面でその番号が読み込まれ、指定した番号のステージの名前が変更される』という処理が実行されます。
と言っても、よくわからないと思うので、今から丁寧にスクリプトを解説していきます。
スクリプトの解説
それでは1つずつスクリプトを解説していきます。
①:変数
まず、最初の下記のコードはインスペクター上で各ボタンのテキストを保持するための変数です。
//ステージ1はゲームスタート時に解放されているのでstage2から
public Text stage2;
public Text stage3;
public Text stage4;
public Text stage5;
これを記述することで【手順④】のようにインスペクター上に各変数を格納することができるようになります。
②:stageNumber変数とPlayerPrefs
private int stageNumber; //ステージ開放条件の値を格納
//ーーー(中略)ーーー//
void Start()
{
stageNumber = PlayerPrefs.GetInt("stageNumber");
}
「stageNumber」変数は『今はステージがどこまで解放(クリア)されているのか』を格納する変数です。
要するに【手順⑤】で指定した番号がstageNumber = PlayerPrefs.GetInt(“stageNumber”);で「stageNumber」変数に格納されるわけです。
「PlayerPrefs」というのはデータを保存・読み取りするためのクラスです。
保存する時はPlayerPrefs.SetInt(“キー(今回はstageNum)”, 値(今回はstageNum));
読み込む時はPlayerPrefs.GetInt(“キー(今回はstageNumber)”);
とするだけなのでとても簡単ですね。
③:条件分岐
下記のコードでは「stageNumber」変数に格納されている値に応じて、テキストを変更するステージを決めています。
例えば、『ステージ1がクリアされた場合』は「2」が「stageNumber」変数に格納されるので、 if(stageNumber >= 2){stage2.text = “荒れた広野”; }この処理だけが実行されます。
if(stageNumber >= 2)
{
stage2.text = "荒れた広野"; //ステージ2の名前
}
if (stageNumber >= 3)
{
stage3.text = "滑稽の洞窟"; //ステージ3の名前
}
if (stageNumber >= 4)
{
stage4.text = "憤怒の墓地";//ステージ4の名前
}
if (stageNumber >= 5)
{
stage5.text = "終焉の城";//ステージ5の名前
}
④:StageOpenクラスについて
最後に下記のコードについてです。
まず [SerializeField] private int stageNum; で【手順⑥】のようにインスペクター上から値を指定できるようにします。
そして、その値を「StageOpenクラス」が呼ばれたタイミングでPlayerPrefsを使って値を保存しています。
[SerializeField] private int stageNum; //このボスが登場するステージ番号をインスペクターに指定
//~~中略〜〜//
public void StageOpen()
{
PlayerPrefs.SetInt("stageNumber", stageNum);//PlayerPrefsでクリアしたステージ番号をセット
}
よし、とりあえずこれで説明は以上です。
無駄に長く書いてしまったので2時間ほどかかりました笑
さて、それではもう0時を回そうなので今日は寝ようと思います!
皆さんもアプリ開発頑張ってください!それではっっっ
Unityスキルをもっと上達させたい方へ
僕も最初の頃はUnityを独学でやっていたのですが、その頃は全くダメでした。笑
でもテックアカデミーの「Unityコース」を受講してから一気に色々なことができるようになりました。(メンターさんにいつでも質問できるのが大きかったです。)
もっとUnityで色々なアプリを作れるようになりたい!という方はぜひUnityコースを受講することを考えてみてください!
確実に今よりは成長しますので!
興味のある方は下記の記事にUnityコースの詳細をまとめていますので、そちらもどうぞ!