
ごきげんよう、Budding Lab.編集部のゆくすぃです!
近頃は「Marvel Rivals」の作り込みに感心しきり!映画作品にも、俄然、興味が湧いてきました!
ゲームが大好きな皆さんなら、一度は「自分でゲームを作ってみたい!」と、思ったことがあるのではないでしょうか?
本連載では、ゲーム開発初心者のゆくすぃが、基礎的なスクリプトだけを使って、超入門・2D脱出ゲームの作り方を解説します!
本記事は、第5回「シーンの切り替え編」です。
プログラミングの専門知識がなくたって、画像や音楽作成アプリが使えなくたって、案外、ゲームって作れるものです。興味が湧いたなら、ぜひ挑戦してみてください!
シーンを登録する
第3回で作成した3つのシーン・・・TitleScene,GameScene,ClearSceneを切り替える仕組みを作る前に、まず、Unityにシーンを登録する必要があります。
Unity画面上部の「File」をクリックして表示されるメニューから「Build Settings」をクリックします。すると、Built Settingsウインドウが開きます。


Scenesフォルダを開き、ProjectウインドウからTitleScene,GameScene,ClearSceneをScenes In Build欄にドラッグ&ドロップします。
シーンを登録すると、右端に番号(インデックス)が振られます。ゲームを開始すると、番号「0」のシーンからスタートするので、TitleSceneに「0」が振られるようにしましょう。シーンの順番は、クリック&ドラッグで変更できます。
シーンをScenes In Build欄へドラッグ&ドロップする


スクリプトを作成する
Script(スクリプト)とは、ゲームオブジェクトを制御するために欠かせない、台本のようなものです。
シーンの切り替え、部屋の移動、アイテムの取得、SEやBGMの制御など、ゲーム内のあらゆるイベントの制御を担っています。
スクリプトは、ただ書くだけでは機能しません。書き上げたスクリプトは、ゲームオブジェクトに取り付ける(=アタッチする)ことで機能します。


Scriptsフォルダを作成する
Assetsフォルダを開き、Projectウインドウで右クリックすると、コンテキストメニューが表示されます。その中から「Create」を選び、追加で展開されるメニューの中から「Folder(フォルダ)」を選んでクリックします。


Assetsフォルダ内に新しいフォルダが作成されるので「Scripts」と入力して確定します。「プロジェクト:CandyHouse」に使用するスクリプトはすべて、このScriptsフォルダに保存します。


スクリプトを作成する
いよいよ「C#」というプログラミング言語を使って、シーンの切り替えを担うスクリプトを書いていきます!まずは、エクセルやパワーポイントでブックやプレゼンテーションを新規作成するように「C# スクリプト」を新規作成します。
Scriptsフォルダを開き、Projectウインドウで右クリックすると、コンテキストメニューが表示されます。その中から「Create」を選び、追加で展開されるメニューの中から「C# Script(C# スクリプト)」を選んでクリックします。


Scriptsフォルダ内に新しいスクリプトが作成されるので、名前を付けて確定します。今回は「SceneChanger」としました。


スクリプトを書く
C#スクリプト(=C#文法)の概要
ひとまず、C#スクリプトの雰囲気だけ掴んでおきましょう。難しいことは開発経験を積みながら、追々、理解していけば良いと思います。
まずは、新規作成した「スクリプト:SceneChanger」を開いてみましょう。
「スクリプト:SceneChanger」をダブルクリックすると、スクリプトを書くためのツール「Microsoft Visual Studio」が起動します。
参考URL:Microsoft Visual Studio 公式サイト
Microsoft Visual Studioとは
Microsoft Visual Studioとは、Microsoft社が開発・販売している「総合開発環境(IDE:Integrated Development Environment)」です。Microsoft Visual Studioは無料で使用できますが、サインインにMicrosoftアカウントが必要です。
Unityは、Microsoft社が開発したプログラミング言語「C#」に対応しており、この「C#」を使った開発をする場合、Microsoft Visual Studioを利用するのが一般的です。
参考URL:Visual Studio ドキュメント
Microsoft Visual Studio:コードエディター画面


コードエディター画面には、以下のように、基本のスクリプトが自動生成されます。
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4
5 public class SceneChanger : MonoBehaviour
6 {
7 // Start is called before the first frame update
8 void Start()
9 {
10
11 }
12
13 // Update is called once per frame
14 void Update()
15 {
16
17 }
18 }
「1行目:System.Collections」・「2行目:System.Collections.Generic」は、いずれもC#に用意された「名前空間(namespace)」と呼ばれるものです。これらを利用すると、効率的にスクリプトを書くことができます。
「3行目:UnityEngine」は、Unityに用意された「名前空間(namespace)」です。これらを利用すると、やはり、効率的にスクリプトを書くことができます。
これらの名前空間は、スクリプトを書くうえで非常によく使われるため、あらかじめ記述されています。書きたいスクリプトの種類によっては、別の名前空間を追記することもあります。
名前空間を利用する際は、文頭に「using」と記述します。
「 ;(セミコロン)」は、C#文法で記述する命令文の区切りを示す記号です。これを書き忘れると、エラーになります。
「5行目:class SceneChanger」は「クラス名」と呼ばれるものです。新規作成すると「クラス名=スクリプト名」となり、これを変更するとエラーになります。
「5行目:MonoBehaviour」は、Unity側で準備されているクラス名です。「class SceneChanger : MonoBehaviour」と記述することで「スクリプト:SceneChanger」をゲームオブジェクトにアタッチして、様々な機能(コンポーネント)を与えたり、イベントを起こしたりできます。
スクリプトは「{ }」の中に書きます。「{}」や「()」は、閉じ忘れるとエラーになるので、気を付けてください。
7行目と13行目の「//」で始まる行は「コメントアウト」された文字で、スクリプト実行時には無視されます。スクリプトの中にメモを書き込みたい時に利用します。
「8行目:void Start」・「14行目:void Update」はメソッドと呼ばれるものです。呼び出した時に実行させたい処理を纏めておけます。
StartメソッドとUpdateメソッドはよく使われるので、スクリプトを作成するとデフォルトで記述されています。必要なければ、削除しても構いません。
スクリプト・クラス・メソッド・処理 の関係





C#スクリプトのざっくりとしたイメージが掴めたところで、
早速、シーンを切り替えるスクリプトを書いていきましょう!
シーンを切り替えるスクリプトを書く
まずは、自動生成されたスクリプトの7行目(// Start is called ~)から17行目( })までが今回不要なので、削除します。
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using UnityEngine.SceneManagement;
5
6 public class SceneChanger : MonoBehaviour
7 {
8 [SerializeField] private string _loadScene;
9
10 public void SceneChange()
11 {
12 SceneManager.LoadScene(_loadScene);
13 }
14 }
シーンの切り替えに必要な処理を可能にする名前空間「using UnityEngine.SceneManagement;」を4行目に書き足します。この名前空間を利用すると、シーンの切り替えを担うメソッド(LoadScene)を使えるようになります。
次に「クラス:SceneChanger」の中、8行目に「変数:[SerializeField] private string _loadScene; 」を記述します。これは、シーンの切り替えを担うメソッド(LoadScene)が、シーンの切り替え先を読み込むために必要な変数になります。
- [SerializedField]:これを付ける(シリアル化する)と、inspectorウインドウで変数を操作できるようになる。
- private:「アクセス修飾子」の一つ。他のクラスからの書き換えを許可しない。
- string:変数の型の一つ。stringは文字列型で、テキストを扱える。
- _loadScene:変数名。今回はシーン切り替えの際に読み込む、切り替え先のシーン名を指定する変数なので「_loadScene」とした。
上記のように「変数:_loadScene」を設定すると「スクリプト:SceneChanger」を他でも使い回せて便利なんだ!・・・ということだけ、頭の片隅に置いといてください。
10行目に「メソッド:public void SceneChange()」を記述します。この後の「{ }」の中に、シーンを切り替えるための処理を記述します。
- public:アクセス修飾子の一つ。外(他のスクリプト)からの呼び出しが可能。
- void:英語で「空っぽ」の意味。メソッドを実行した結果、何らかの値を返す(戻り値がある)場合は記述しない。今回は戻り値がないので記述する。
- SceneChange():メソッド名。メソッド名はそれ自身を含むクラス名と同じにはできない。
「{ }」で囲まれた範囲(ブロック)内、12行目に「SceneManager.LoadScene(_loadScene);」を記述します。
これは、4行目で記述した「名前空間:SceneManagement」の中の「クラス:SceneManager」が持っている「メソッド:LoadScene」を呼び出している状態です。「メソッド:LoadScene」は、Build Settingsに登録したシーン名(あるいはインデックス:右端に振られた番号)でシーンを読み込みます。
「(_loadScene)」の部分では、メソッドに「引数」を渡しています。8行目で、Inspectorウインドウで操作できる「変数:_loadScene」を宣言しているので、そこに指定した文字列型(=テキスト)の変数を引数として渡します。
以上で、シーンを切り替えるスクリプトは完成です!
聞き慣れない単語が一度にたくさん登場したので、相関関係を整理するのはなかなか難しいと思います。
今は何となく、[SerializeField]で操作できる変数を、メソッド:LoadSceneに引数として渡せば、シーンの切り替えができるんだな!ぐらいに思えれば大丈夫です!
スクリプトをアタッチする
初めにお伝えしたように、スクリプトはただ書くだけでは機能しません。書き上げたスクリプトは、ゲームオブジェクトに取り付ける(=アタッチする)ことで機能します。


「スクリプト:SceneChanger」を「シーン:TitleScene」の「ボタン:GameStart」にアタッチしたいので、Unityのエディター画面に戻って「シーン:TitleScene」を開きます。


「ボタン:GameStart」を選択した状態で、Inspectorウインドウの「Add Component」をクリックします。検索ウィンドウが開いたら、そこに「Scene Changer」と入力します。入力を始めると、サジェストで「Scene Changer」が表示されるので、それをクリックして選んでください。


「ボタン:GameStart」に「スクリプト:SceneChanger」がアタッチされ、inspectorウインドウで「変数:Load Scene」を設定できるようになりました。「変数:Load Scene」には「GameScene(=切り替え先のシーン名)」と入力しておきます。


次に、On Click イベントの右下にある「+(Add to the list)」をクリックします。すると、On Click イベントを使えるようになります。
ボタンをクリックすると、指定のメソッドを呼び出して実行するイベント。
「Add to the list」をクリック


On Click() イベントを使えるようになる


「None (Object)」と表示されている場所へ「Scene Changer (Script)」をドラッグ&ドロップします。すると「No Function」のドロップダウンリストで「クラス:SceneChanger」を選択できるようになります。「クラス:SceneChanger」から「メソッド:SceneChange()」を選択して、クリックします。
Scene Changerをドラッグ&ドロップする


SceneChanger > SceneChange() を選択


これで「ボタン:GameStart」をクリックすると「クラス:Scene Changer」の「メソッド:SceneChange()」が呼び出されて(実行されて)「シーン:TitleScene」から「シーン:GameScene」に切り替わる設定ができました!





スクリプトを一つ書き上げて、ゲームオブジェクトへのアタッチまで完了しました!
次は、この仕組みがきちんと動くのか、動作確認していきます!
再生モードでプロジェクトを実行する
エディター画面のツールバーにある「▶(再生ボタン)」をクリックすると、Gameビューに切り替わり、再生モードでプロジェクトが実行されます。


再生モードに入ると、ゲーム画面の外側が暗くなります。この状態で「ボタン:Game Start」をクリックしてみましょう。


画面が以下のような「シーン:GameScene」に切り替わればOKです!
GameビューからSceneビューに戻るには、もう一度、再生ボタンをクリックします。
「ボタン:Game Start」をクリックすると「シーン:Gamescene」に切り替わる


以上の要領で「シーン:ClearScene」でも「ボタン:Play Again」に「スクリプト:Scene Change」の「メソッド:SceneChange()」を指定して、シーンが切り替わる仕組みを作りましょう。


脱出口にもシーン切り替えの仕組みを作る
「シーン:GameScene」に切り替えて、Hierarchyウインドウで「脱出口(=Exit)」を選択してみてください。inspectorウインドウを確認すると、そこには「ボタン:Game Start」や「ボタン:Play Again」にはあった「Buttonコンポーネント」がありません。
これは、脱出口を配置する際に、UI > Image を使ったためです。
脱出口にはButtonコンポーネントがない


UI > Buttonで作成したGameObjectにはある


脱出口をクリックしたら「シーン:ClearScene」に切り替わって欲しいので、脱出口にもButtonコンポーネントが必要です。なので「Add Component」で「Button」と入力し、Buttonコンポーネントを追加します。
「Add Component」でButtonを選択


Buttonコンポーネントが追加された


脱出口にもButtonコンポーネントが付いたので「ボタン:Game Start」や「ボタン:Play Again」と同じようにシーン切り替えの仕組みを作ります。脱出口をクリックすると「シーン:ClearScene」に切り替わるので「変数:Load Scene」には「ClearScene」と入力します。
設定できたら、再生モードで動作確認してみましょう。
再生モードで脱出口をクリック


クリア画面に切り替われば設定完了





スクリプトは一つしか書いていませんが、変数を差し替えるだけで三箇所ものシーン切り替えを設定でき、楽なうえに効率的でとても便利ですね!
追記:シーンの切り替えを少し遅らせる方法
「ボタンのクリック音を鳴らしてからシーンを切り替えたい!」と思っているのに、なぜかクリック音が鳴らずにシーンが切り替わってしまう・・・それは、クリック音を鳴らす処理が実行されるのを待たずにシーンが切り替わってしまうからです。
そんな時は、Invokeメソッドを使ってシーンの切り替えを少し遅らせると解決します!
「プロジェクト:CandyHouse」でも、ボタンのクリック音を鳴らすために、後からInvokeメソッドを追加しました。
まとめ
今回の記事では、シーンの切り替えについて解説しました。
呪文が並んでいるような Microsoft Visual Studio の画面も、一つずつ意味を読み解いて、使用上のルールを理解していけば、色んなことができるようになります!諦めずに、コツコツと小さな一歩を積み重ねることが何より大事です。一緒に頑張りましょう!
次回は、【第6回】超入門!Unityで2D脱出ゲームを作ろう!「部屋の移動編」です。
以上、最後まで読んでいただき有難うございました!