【第5回】超入門!Unityで診断ゲームを作ろう!「シーンの切り替え編」

第5回シーンの切り替え編
ゆくすぃ

ごきげんよう、Budding Lab.編集部のゆくすぃです!
なんと20年ぶりに鬼武者の新作が出ますね!1st:金城武、2nd:松田優作・・・Latest:三船敏郎だそうで!

ゲームが大好きな皆さんなら、一度は「自分でゲームを作ってみたい!」と、思ったことがあるのではないでしょうか?

本連載では、ゲーム開発初心者のゆくすぃが、基礎的なスクリプトだけを使って、超入門・診断ゲームの作り方を解説します!

本記事は、第5回「シーンの切り替え編」です。

プログラミングの専門知識がなくたって、画像や音楽作成アプリが使えなくたって、案外、ゲームって作れるものです。興味が湧いたなら、ぜひ挑戦してみてください!

目次

シーンを登録する

今回の「ランチ診断」には、TitleSceneGameSceneの2つのシーンがあります。
タイトル画面で「診断スタート」ボタンを押すと、TitleSceneからGameSceneに切り替わり、ゲーム画面の「パネル:Question0」が表示されます。

早速、シーンの切り替えから設定していきたいところですが、その前にまず、Unityにシーンを登録する必要があります

Unity画面上部の「File」をクリックして表示されるメニューから「Build Settings」をクリックします。すると、Build Settingウインドウが開きます。

Build Settingを選択する

Scenesフォルダを開き、ProjectウインドウからTitleScene,GameSceneをScenes In Build欄にドラッグ&ドロップします

シーンを登録すると、右端に番号(インデックス)が振られます。ゲームを開始すると、番号「0」のシーンからスタートするので、TitleSceneに「0」が振られるようにしましょう。シーンの順番は、クリック&ドラッグで変更できます。

シーンをScenes In Build欄へドラッグ&ドロップする

Scene 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# スクリプト)」を選んでクリックします。

#C Scriptを新規作成

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

シーン切り替え用のスクリプトを書く

スクリプトの概要については、以下記事の「C# スクリプト(=C#文法)の概要」を参考にしてみてください。

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

スクリプト: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)が、シーンの切り替え先を読み込むために必要な変数になります。

変数:[SerializeField] private string _loadScene;
  • [SerializedField]:これを付ける(シリアル化する)と、inspectorウインドウで変数を操作できるようになる。
  • private:「アクセス修飾子」の一つ。他のクラスからの書き換えを許可しない。
  • string:変数の型の一つ。stringは文字列型で、テキストを扱える。
  • _loadScene:変数名。今回はシーン切り替えの際に読み込む、切り替え先のシーン名を指定する変数なので「_loadScene」とした。

上記のように「変数:_loadScene」を設定すると「スクリプト:SceneChanger」を他でも使い回せて便利なんだ!・・・ということだけ、頭の片隅に置いといてください。

10行目に「メソッド:public void SceneChange()」を記述します。この後の「{ }」の中に、シーンを切り替えるための処理を記述します。

メソッド: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」を開きます。

Add Componentをクリックする

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

スクリプト:SceneChangerを選択する

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

変数:loadSceneにGameSceneと入力

次に、On Click イベントの右下にある「+(Add to the list)」をクリックします。すると、On Click イベントを使えるようになります。

On Click イベント

ボタンをクリックすると、指定のメソッドを呼び出して実行するイベント。

OnClickイベントを追加

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

OnClickイベントにスクリプトをセット

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

OnClickイベントにSceneChangeをセット

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

GameStartボタンの設定完了
ゆくすぃ

スクリプトを一つ書き上げて、ゲームオブジェクトへのアタッチまで完了しました!
次は、この仕組みがきちんと動くのか、動作確認していきます!

再生モードでプロジェクトを実行する

エディター画面のツールバーにある「▶(再生ボタン)」をクリックすると、Gameビューに切り替わり、再生モードでプロジェクトが実行されます。

再生ボタンをクリックすると再生モードになる

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

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

診断スタートボタンをクリックすると、診断画面に切り替わる

追記:シーンの切り替えを少し遅らせる方法

「ボタンのクリック音を鳴らしてからシーンを切り替えたい!」と思っているのに、なぜかクリック音が鳴らずにシーンが切り替わってしまう・・・それは、クリック音を鳴らす処理が実行されるのを待たずにシーンが切り替わってしまうからです。

そんな時は、Invokeメソッドを使ってシーンの切り替えを少し遅らせると解決します!

「プロジェクト:Lunch-Shindan」でも、ボタンのクリック音を鳴らすために、後からInvokeメソッドを追加しました。

まとめ

今回の記事では、シーンの切り替えについて解説しました。
Microsoft Visual Studio のエディター画面には、ちょっぴり腰が引けた方もいらっしゃるかもしれません・・・が、諦めずにコツコツと簡単な関数から使っていけば、だんだんとルールを理解できるようになります。自分を信じて、一緒に頑張りましょう!

次回は、【第6回】超入門!Unityで診断ゲームを作ろう!「画面の移動編」です。

以上、最後まで読んでいただき有難うございました!

よかったらシェアしてね!
  • URLをコピーしました!
目次