ゆくすぃごきげんよう、Budding Lab.編集部のゆくすぃです!
今更ですが「逆転裁判123 成歩堂セレクション」を楽しんでいます。シナリオが面白くて、やり始めると止まりません!
ゲームが大好きな皆さんなら、一度は「自分でゲームを作ってみたい!」と、思ったことがあるのではないでしょうか?
本連載では、ゲーム開発初心者のゆくすぃが、基礎的なスクリプトだけを使って、超入門・パズルゲームの作り方を解説します!
本記事は、第4回「ピースの入手とシーンの切替編」です。
プログラミングの専門知識がなくたって、画像や音楽作成アプリが使えなくたって、案外、ゲームって作れるものです。興味が湧いたなら、ぜひ挑戦してみてください!
2D脱出ゲームの作り方も解説しています。ご興味があれば、ぜひご覧ください!


ピース入手の表現方法
ゲーム画面上のアイテムや家具をクリックして、入手したピースをインベントリに収納する・・・これを基礎的なスクリプトで行うには、どうすれば良いでしょう?
- クリックされたゲームオブジェクトを非表示にする
- インベントリのゲームオブジェクトを表示させる
このように、ゲームオブジェクトの表示・非表示を切り替えるだけで、あたかも、入手したピースをインベントリに収めたように見せることができます。


ゲームオブジェクトの表示・非表示を制御する
スクリプトを作成する
では、ゲームオブジェクトの表示・非表示を制御するスクリプトを書いていきます。
まずは、Projectウインドウに新規フォルダを作成し「Scripts」と名付けて保存しましょう。今後、作成するスクリプトは、すべてこのScriptsフォルダに保存します。
ProjectウインドウのScriptsフォルダ


Scriptsフォルダの中で右クリックすると、コンテキストメニューが表示されます。その中から「Scripting」を選び、追加で展開されるメニューの中から「MonoBehaviour Script」を選んでクリックします。


Scriptsフォルダ内に新しいスクリプトが作成されるので、名前を付けて確定します。今回は「ItemController」としました。
1 using UnityEngine;
2
3 public class ItemController : MonoBehaviour
4 {
5 [SerializeField] SEController _seController; // SEControllerと接続 ・・・ 後述します
6 [SerializeField] GameObject _getItem; // Inventoryに表示するアイテム_getItemを定義
7 public void ItemGet()
8 {
9 _getItem.SetActive(true); // Inventoryにアイテムを表示
10 }
11
12 public void HideItem()
13 {
14 this.gameObject.SetActive(false); // 自分自身を非表示にする
15 ItemGet(); // ItemGetスクリプトを呼び出す
16 _seController.Get(); // SEControllerのGetスクリプトを呼び出す ・・・ 後述します
17 }
18 }
※薄い青文字の部分はSEを鳴らすための記述です。後ほど説明しますので、ここでは読み飛ばしてください。
→ <ピース入手時にSEを鳴らす>
6行目で「GameObject変数:_getItem」を定義しています。
これにより、Inspectorウインドウの「変数:Get Item」で、表示・非表示を制御したいゲームオブジェクトを指定できるようになります。
Get Itemに指定したゲームオブジェクト(Item2)の表示・非表示を制御できる


7行目から10行目の「ItemGetメソッド」で「変数:Get Item」に指定したゲームオブジェクトを表示しています。SetActive関数の引数に「true」を与えると、ゲームオブジェクトは表示した状態(アクティブな状態)になります。
12行目から17行目の「HideItemメソッド」で、このスクリプトがアタッチされているゲームオブジェクト(this.gameObject)を非表示にしています。SetActive関数の引数に「false」を与えると、ゲームオブジェクトは非表示(非アクティブな状態)になります。
さらに「ItemGetメソッド」を呼び出して「変数:Get Item」に指定したゲームオブジェクトを表示しています。
スクリプトをアタッチする
「スクリプト:ItemController」を「GamePanel」上の入手用ピース(UI Image:bg0_card0~card4)にアタッチします。
「スクリプト:ItemController」は、Scriptsフォルダから入手用ピースのInspectorウインドウにドラッグ&ドロップするか、Inspectorウィンドウの「Add Component」をクリックすることでアタッチできます。


「Get Item」に、表示させたいピース(インベントリのゲームオブジェクト:東・西・風・北・南)を参照させます。HierarchyウインドウからInspectorウィンドウにドラッグ&ドロップするか、Inspectorウィンドウの「Get Item」右端の丸いボタンをクリックすることで参照させられます。


Buttonコンポーネントをアタッチする
入手用ピースは、クリックされることで「スクリプト:ItemController」内の「HideItemメソッド」を実行します。では、ゲームオブジェクトがクリックされた時に任意のメソッドを実行させるには、どうすれば良いのでしょう?
それには、Buttonコンポーネントの「OnClickイベント」を使います。
ButtonコンポーネントのOnClickイベント


入手用ピース(UI:Image)のInspectorウィンドウで「Add Component」をクリックし、Buttonコンポーネントを追加します。すると、上図のようにOnClickイベントが表示されます。
「None(Object)」と表示されている箇所に、このゲームオブジェクト自身をドラッグ&ドロップして参照させ「No Function」と表示されているドロップダウンリストから「ItemController > HideItem」を選んでクリックします。
このように設定することで「HideItemメソッド」により「入手用ピースを非表示 / インベントリのピースを表示」という処理が一度に行われ、入手したピースをインベントリに収納することができます。
初期状態ではインベントリのピースを非表示にする
入手用ピースをクリックするまで、インベントリ内のピースが表示されていてはいけません。
そこで、Inspector ウインドウの最上部、ゲームオブジェクト名の左横にあるチェックを外し、ゲームオブジェクトを非表示にしておきます。


ピース入手時にSEを鳴らす
SEを鳴らす手順の概要は下記の通りです。
- Projectウインドウに「Sounds」フォルダを作成し、音素材を保存する。
- SEを鳴らすスクリプトを作成する。
- 空のゲームオブジェクト「SE」を作成し、Audio Sourceコンポーネントを追加する。
- 「SE」に手順2で作成したスクリプトをアタッチし、変数に鳴らしたい音素材を指定する。
- 入手用ピースのOnClickイベントに「SE」を参照させ、SEを鳴らすメソッドを実行させる。
BGM・SEの設定方法については以下記事を参考にしてください。


今回、書いたスクリプト「SEController」の中身は下記の通りです。
ゲーム内のSEを制御するスクリプト:SEController
1 using UnityEngine;
2
3 public class SEController : MonoBehaviour
4 {
5 [SerializeField] private AudioClip _decide; // ボタン押下時に鳴らす音素材
6 [SerializeField] private AudioClip _get; // アイテム入手時に鳴らす音素材
7 [SerializeField] private AudioClip _stageClear; // ステージクリア時に鳴らす音素材
8
9 AudioSource audioSource; // AudioSource変数:audioSourceを定義
10
11 void Start()
12 {
13 // このスクリプトがアタッチされているGameObjectのAudio Sourceコンポーネントを取得
14 audioSource = GetComponent<AudioSource>();
15 }
16
17 public void Decide() // GameStartボタン押下時、PlayAgainボタン押下時
18 {
19 audioSource.PlayOneShot(_decide); // 一度だけ_decideを鳴らす
20 }
21
22 public void Get() // ピース入手時
23 {
24 audioSource.PlayOneShot(_get); // 一度だけ_getを鳴らす
25 }
26
27 public void StageClear() // ステージクリア時
28 {
29 audioSource.PlayOneShot(_stageClear); // 一度だけ_stageClearを鳴らす
30 }
31 }
この「スクリプト:SEController」をゲームオブジェクト「SE」にアタッチし、Audio Sourceコンポーネントを追加します。「Decide, Get, Stage Cleare」に鳴らしたい音素材を指定してください。
さらに「スクリプト:ItemController」をアタッチした入手用ピースの「Se Controller」に、この「スクリプト:SEController」を参照させます。これで「スクリプト:ItemController」の薄い青文字で書かれた部分が機能し、入手用ピースをクリック(タップ)するとSEが鳴るようになります。



超入門!Unityで2D脱出ゲームを作ろう!「BGM・SEの設定編」を参考に、ぜひBGMも設定してみてください。
シーンを切り替える
シーン切り替えの実装手順は下記の通りです。
- Build Profiles の「Scene List」にシーンを登録する。
- シーンを切り替えるスクリプトを作成する。
- 任意のゲームオブジェクトに手順2で作成したスクリプトをアタッチし、遷移先のSceneを指定する。
- OnClickイベントを利用したり、他のメソッド内に呼び出したりして、メソッドを実行させる。
シーンの切り替え方法については以下記事を参考にしてください。


シーンを登録する
第2回で作成した3つのシーン・・・TitleScene,GameScene,ClearSceneを切り替える仕組みを作る前に、まず、Unityにシーンを登録する必要があります。
Unity画面上部の「File」をクリックして表示されるメニューから「Build Profiles」をクリックします。すると、Built Profilesウインドウが開きます。


Build Profilesウィンドウで「Open Scene List」をクリックすると「Scene List」が開くので、ProjectウインドウからTitleScene,GameScene,ClearSceneを「Scene List」にドラッグ&ドロップします。


シーンを登録すると、右端に番号(インデックス)が振られます。ゲームを開始すると、番号「0」のシーンからスタートするので、TitleSceneに「0」が振られるようにしましょう。シーンの順番は、クリック&ドラッグで変更できます。
スクリプトを作成する
今回、書いたスクリプト「SceneChanger」の中身は下記の通りです。
シーンを切り替えるスクリプト:SceneChanger
1 using UnityEngine;
2 using UnityEngine.SceneManagement; // シーンの切り替えを担うメソッド:LoadSceneを使うために必要
3
4 public class SceneChanger : MonoBehaviour
5 {
6 [SerializeField] private string _loadScene; // string型の変数_loadStringを定義
7
8 public void SceneChangeInvoke() // ボタンにセットするのはこのメソッド
9 {
10 Invoke("SceneChange", 1.0f); // 1.0秒後にSceneChangeメソッドを呼び出す
11 }
12
13 public void SceneChange()
14 {
15 SceneManager.LoadScene(_loadScene); // シーンを切り替える処理
16 }
17 }
遷移先のシーンをInspectorウィンドウで指定できる(「変数:Load Scene」に指定できる)ので、汎用性があり便利なスクリプトです。
※Invoke関数については以下記事を参考にしてください。


スクリプトをアタッチする
実装すべきシーンの切り替えは下記の3パターンです。
- ゲーム開始時:「GameStage」ボタンを押下する:TitleSceneからGameSceneへ遷移する。
- ゲームクリア時:クリア判定結果が「true」となる:GameSceneからClearSceneへ遷移する。
- 再チャレンジ時:「PlayAgain」ボタンを押下する:ClearSceneからGameSceneへ遷移する。
「2.ゲームクリア時」については、次回以降で詳しく触れますので、今回は1と3について解説します。
1と3は、いずれもボタンを押下した時に「SceneChanger」内の「SceneChangeInvokeメソッド」が実行されるので、スクリプトはそれぞれ「GameStart」ボタンと「PlayAgain」ボタンにアタッチします。


「スクリプト:SceneChanger」をアタッチしたら、いずれの「Load Scene」にも「GameScene」と入力します。
「GameStart」ボタン・「PlayAgain」ボタン、いずれも押下すると「GameScene」に遷移する


OnClickイベントの「None(Object)」と表示されている箇所に、このゲームオブジェクト自身をドラッグ&ドロップして参照させ「No Function」と表示されているドロップダウンリストから「SceneChanger > SceneChangeInvoke」を選んでクリックします。
シーンの遷移を確認するには、エディター画面のツールバーにある「▶(再生ボタン)」をクリックします。Gameビューに切り替わり、再生モードでプロジェクトが実行されます。この状態で「GameStart」ボタンや「PlayAgain」ボタンを押下して、ゲームが始まればOKです!
再生モードを抜けるには「■(停止ボタン)」をクリックします。





以上で今回の解説は終了です、お疲れ様でした!
次回は、いよいよドラッグ&ドロップの仕組みを実装しますょ!
まとめ
今回の記事では、ピースを入手する仕組みや、シーンを切り替える方法について解説しました。スクリプトを作成する際は、操作するゲームオブジェクトや接続するスクリプトを簡単に入れ替えられるように、汎用性を持たせておくと扱いやすくなります。
次回は、【第5回】超入門!Unityで診断ゲームを作ろう!「ドラッグ&ドロップの実装編」です。
以上、最後まで読んでいただき有難うございました!









