今回もスクリプトを使って、ボタンオブジェクトがクリックされた時の機能実装について説明します。具体的には「GO」ボタンが押された際、キャラクターにセリフを表示させ、その後、探索画面へ移動する機能を実装します。またその際、どのダンジョンを選択したかの情報を保持するクラスを実装します。
機能イメージ
先ずは今回実装する機能のイメージをつかんでもらいたいと思います。言葉では上で説明したつもりですが、その機能イメージを図にすると以下のとおりです。
遷移先シーン作成とシーン登録
遷移先シーン作成とシーン登録は前回の「Unity講座_7時限目」と重複する部分が多いので、細かい説明は省略します。必要に応じて下記をご参照ください。

STEP1:遷移先Sceneの作成
先ずは「GO」ボタンがクリックされた時の移動先となるシーンを作成し、遷移先のシーン名をExpoloreSceneとします。ExploreSceneは移動機能をテストした際に分かりやすくなるよう、下図のようにテキストで画面中央付近に探索画面と表示させました。
STEP2:シーンの登録
次にシーンの登録を行います。Fileタブ→BuildSettingsから下図のように、ScenesInBuildにExploreSceneを登録しました。
選択されたダンジョンの情報を保持するクラスの実装
次に「GO」ボタンがクリックされた時、どのダンジョンが選ばれたのかという情報を保持しておくクラスを実装します。
この情報はシーン遷移後にも利用したい情報ですので、Unity基礎4でご紹介したpublicでstaticなクラスを作成し、利用します。必要に応じて下記Unitu基礎4もご覧ください。

STEP1:Pluginsフォルダの作成
先ずは下図のようにプロジェクトウィンドウのAssetsフォルダ直下にPluginsフォルダを作成します。
STEP2:情報を保持しておくためのスクリプト作成
次にPuginsフォルダ内に、情報を保持しておくためのスクリプト作成を作成します。今回は下図のようにDungeonStateManagerという名前でスクリプトを作成しました。
STEP3:情報を保持する変数の定義
最後に、先ほど作成したスクリプトに選択されたダンジョンの情報を保持しておく変数を定義します。具体的には下記のようにしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//MonoBehaviourは継承しない。またstaticクラスであることに注意
public static class DungeonStateManger
{
//選択されたダンジョンのIDを格納する変数
public static int selectedDungeonID;
}
ポイント以下の通りです。
8行目:選択されたダンジョンのIDを格納する変数です。今後の拡張性を考え、整数型でIDを記憶しておく方式を採用しました。
「GO」ボタンクリック時の機能実装
ダンジョン情報を保持するための変数が定義できたら、次は「GO」ボタンクリック時の動作を実装します。
同機能はすでにUnity講座7で作成したButtonControllerGuildSceneクラスに実装することにします。今回はダンジョンを以下の4つ用意することにして、それぞれのダンジョン名がついたPanelの「GO」ボタンをクリックした時の動作を実装します。
・ゴブリンの洞窟(ダンジョンID:1)
・スライムの森林(ダンジョンID:2)
・コボルトの荒野(ダンジョンID:3)
・リビングアーマーの居城(ダンジョンID:4)
以下ではゴブリンの洞窟を例に説明しますが、他の動作も同様ですので、ご自分で試しててください。
STEP1:選択されたダンジョンIDを保持させる
先ずは選択されたダンジョンIDを保持させる機能を実装します。具体的には下記のように、「ゴブリンの洞窟」の「GO」ボタンがクリックされた時に呼び出されるメソッドとしてClickGoblinGoButtonを定義します。また、そこに先に定義したselectedDungeonIDを書き換える処理を追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//シーンをロードするために導入
public class ButtonControllerGuildScene : MonoBehaviour
{
//「戻る」ボタンがクリックされた時の処理
public void ClickReturnButton()
{
//HomeSceneへ移動
SceneManager.LoadScene("HomeScene");
}
//「ゴブリンの洞窟」の「GO」ボタンクリック時の動作
public void ClickGoblinGoButton()
{
DungeonStateManger.selectedDungeonID = 1;
}
}
今回追加した部分は14行目~17行目の部分です。なお、上での説明と重複しますが、追加部分を簡単に説明すると下記のとおりです。
16行目:DungeonStateMangerクラスで定義した変数selectedDungeonIDに、「ゴブリンの洞窟」のダンジョンIDを格納
STEP2:ギルド職員による会話を表示させる機能を実装する
ダンジョンのIDを格納したら、次はその処理の後にギルド職員に「それでは気をつけていってらっしゃまいせ」と発言させるようにすることにします。
GoToDungeon会話ブロックの追加と編集
先ずは会話ブロックを追加し、表示条件や表示内容を設定します。具体的には下図のようにヒエラルキーウィンドウのFlowchartを選択し、新たに「GoToDungeon」という名前の会話ブロックを作成します。その後、下記のように表示条件・表示内容を設定します。
Message:GoToDungeon
表示内容: それでは気をつけていってらっしゃいませ(Sayコマンド)

スクリプトの編集(Flowchartとの連携窓口実装と会話ログ起動条件の送付)
続いてスクリプトを編集し、Flowchartとの連携窓口実装と会話ログ起動条件の送付機能を実装します。
具体的なスクリプトは下記のとおりです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//シーンをロードするために導入
using Fungus;//会話制御のために導入
public class ButtonControllerGuildScene : MonoBehaviour
{
//Flowchartとの連携窓口
[SerializeField] Flowchart GuildStaffConv = null;
//「戻る」ボタンがクリックされた時の処理
public void ClickReturnButton()
{
//HomeSceneへ移動
SceneManager.LoadScene("HomeScene");
}
//「ゴブリンの洞窟」の「GO」ボタンクリック時の動作
public void ClickGoblinGoButton()
{
//選択されたダンジョンのIDを格納
DungeonStateManger.selectedDungeonID = 1;
//会話起動条件に設定したメッセージをFlowchartに送付
GuildStaffConv.SendFungusMessage("GoToDungeon");
}
}
新たに追加した部分を簡単に説明すると下記のとおりです。
9行目:Flowchartとの連携窓口として実装
22行目:ギルド職員に「それでは気をつけていってらっしゃまいませ」と発言させる会話ブロックの会話起動条件に設定したメッセージをFlowchartに送付

スクリプトとFlowchartの連携
最後に先ほど編集したスクリプトで定義した変数GuildStaffConvとFlowchartを連携させます。具体的には下図に示すとおり、ButtonControllerオブジェクトにアタッチされているスクリプトのGuildStaffConvボックス内にFlowchartをドラッグ&ドロップします。
「GO」ボタンがクリックされた時の動作実装
「GO」ボタンがクリックされた時の機能が実装できたので、クリック時の動作と結びつけます。具体的には下図のように「GO」ボタンのOnClick()に先ほど作成したClickGoblinGoButtonを設定します。
会話表示後に探索画面へ遷移させる処理実装
ここまででボタンクリックがされた時、選択されたダンジョンIDを保持し、さらにギルド職員に会話を表示させるところまで実装できました。最後は会話表示後に探索画面へ移動させる必要があるためその処理を実装します。
STEP1:探索画面へ遷移するメソッド実装
先ずは探索画面へ移動するメソッドを実装します。本来であれば新しくスクリプトを作成した方がいいのかもしれませんが、簡単のため今回はすでにあるButtonControllerGuildSceneにそのメソッドを追加します。具体的なスクリプトは下記の25行目~29行目です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//シーンをロードするために導入
using Fungus;//会話制御のために導入
public class ButtonControllerGuildScene : MonoBehaviour
{
//Flowchartとの連携窓口
[SerializeField] Flowchart GuildStaffConv = null;
//「戻る」ボタンがクリックされた時の処理
public void ClickReturnButton()
{
//HomeSceneへ移動
SceneManager.LoadScene("HomeScene");
}
//「ゴブリンの洞窟」の「GO」ボタンクリック時の動作
public void ClickGoblinGoButton()
{
//選択されたダンジョンのIDを格納
DungeonStateManger.selectedDungeonID = 1;
//会話起動条件に設定したメッセージをFlowchartに送付
GuildStaffConv.SendFungusMessage("GoToDungeon");
}
//探索画面へ遷移するメソッド
public void GoToExploreScene()
{
//ExploreSceneへ移動
SceneManager.LoadScene("ExploreScene");
}
}
STEP2:会話表示後に画面遷移メソッドを呼び出すようにする
STEP1で画面遷移を行うためのメソッドを定義できたので、次はそれを会話表示後に呼び出されるようにします。具体的にはまず下図に示すように、Flowchartで定義されたGoToDungeon会話ブロックのCommandsにCallMethodを追加します。
その後、CallMethodの中を下記のように設定して完成です。(下図参照)
TargetObject:ButtonController(呼び出したいメソッドがアタッチされているオブジェクト)MethodName:GoToExploreScene(呼び出したいメソッド)
Delay:1(会話表示後1秒経ってから画面遷移メソッドを呼び出す設定)

機能テスト
最後にこれまで作成した機能のテストを行いましょう。Playボタンを押して「ゴブリンの洞窟」の「GO」ボタンを押した時、ギルド職員が「それでは気をつけていってらっしゃませ」と発言し、その後探索画面へ移動すれば成功です。実際にゲームを起動すると下図のようになり、うまく動いていることが確認できました。
今回は単純な画面遷移だけでなく、変数の保持や会話後のメソッド呼び出しなど色々な処理が必要だったため、大変だったかと思いますがいかがでしたでしょうか。ここまでの内容でギルド画面についてはひとまず終了となります。皆さんお疲れ様でした。次回からは探索画面を実装していければと考えています。ではまた次回お会いしましょう。
以上
コメント