
ごきげんよう、Budding Lab.編集部のゆくすぃです!
なんと20年ぶりに鬼武者の新作が出ますね!1st:金城武、2nd:松田優作・・・Latest:三船敏郎だそうで!
ゲームが大好きな皆さんなら、一度は「自分でゲームを作ってみたい!」と、思ったことがあるのではないでしょうか?
本連載では、ゲーム開発初心者のゆくすぃが、基礎的なスクリプトだけを使って、超入門・診断ゲームの作り方を解説します!
本記事は、第5回「シーンの切り替え編」です。
プログラミングの専門知識がなくたって、画像や音楽作成アプリが使えなくたって、案外、ゲームって作れるものです。興味が湧いたなら、ぜひ挑戦してみてください!
シーンを登録する
今回の「ランチ診断」には、TitleSceneとGameSceneの2つのシーンがあります。
タイトル画面で「診断スタート」ボタンを押すと、TitleSceneからGameSceneに切り替わり、ゲーム画面の「パネル:Question0」が表示されます。
早速、シーンの切り替えから設定していきたいところですが、その前にまず、Unityにシーンを登録する必要があります。
Unity画面上部の「File」をクリックして表示されるメニューから「Build Settings」をクリックします。すると、Build Settingウインドウが開きます。


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


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


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


Scriptsフォルダ内に新しいスクリプトが作成されるので、名前を付けて確定します。今回は「SceneChanger」としました。
シーン切り替え用のスクリプトを書く
スクリプトの概要については、以下記事の「C# スクリプト(=C#文法)の概要」を参考にしてみてください。


Scriptsフォルダ内の「スクリプト:SceneChanger」をダブルクリックすると、スクリプトを書くためのツール「Microsoft Visual Studio」が起動します。


Microsoft Visual Studio:コードエディター画面


まずは、自動生成されたスクリプトの7行目(// Start is called~)から17行目( })までが、今回不要なので削除します。
続いて、以下のようにコードを書き込みます。
シーンの切り替えを担うスクリプト:SceneChanger
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; // 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 イベントを使えるようになります。
ボタンをクリックすると、指定のメソッドを呼び出して実行するイベント。


「None (Object)」と表示されている場所へ「Scene Changer (Script)」をドラッグ&ドロップします。


すると「No Function」のドロップダウンリストで「クラス:SceneChanger」を選択できるようになります。「クラス:SceneChanger」から「メソッド:SceneChange()」を選択して、クリックします。


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





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


再生モードに入ると、ゲーム画面の外側が暗くなります。この状態で「診断スタート」をクリックしてみましょう。
画面が以下のように切り替わればOKです!
GameビューからSceneビューに戻るには、もう一度、再生ボタンをクリックします。


追記:シーンの切り替えを少し遅らせる方法
「ボタンのクリック音を鳴らしてからシーンを切り替えたい!」と思っているのに、なぜかクリック音が鳴らずにシーンが切り替わってしまう・・・それは、クリック音を鳴らす処理が実行されるのを待たずにシーンが切り替わってしまうからです。
そんな時は、Invokeメソッドを使ってシーンの切り替えを少し遅らせると解決します!


「プロジェクト:Lunch-Shindan」でも、ボタンのクリック音を鳴らすために、後からInvokeメソッドを追加しました。
まとめ
今回の記事では、シーンの切り替えについて解説しました。
Microsoft Visual Studio のエディター画面には、ちょっぴり腰が引けた方もいらっしゃるかもしれません・・・が、諦めずにコツコツと簡単な関数から使っていけば、だんだんとルールを理解できるようになります。自分を信じて、一緒に頑張りましょう!
次回は、【第6回】超入門!Unityで診断ゲームを作ろう!「画面の移動編」です。
以上、最後まで読んでいただき有難うございました!