【Unity講座_9時限目】ボタンクリック時の動作実装その2

Unity講座

今回もスクリプトを使って、ボタンオブジェクトがクリックされた時の機能実装について説明します。具体的には「GO」ボタンが押された際、キャラクターにセリフを表示させ、その後、探索画面へ移動する機能を実装します。またその際、どのダンジョンを選択したかの情報を保持するクラスを実装します。

機能イメージ

先ずは今回実装する機能のイメージをつかんでもらいたいと思います。言葉では上で説明したつもりですが、その機能イメージを図にすると以下のとおりです。

遷移先シーン作成とシーン登録

 

遷移先シーン作成とシーン登録は前回の「Unity講座_7時限目」と重複する部分が多いので、細かい説明は省略します。必要に応じて下記をご参照ください。

【Unity基礎7】オブジェクトから別オブジェクトを操作する方法〜SerializedField〜
ゲーム製作の際、あるオブジェクトから別のオブジェクトを操作したい場面は多々発生します。この記事ではその方法の一つについて説明します。

STEP1:遷移先Sceneの作成

先ずは「GO」ボタンがクリックされた時の移動先となるシーンを作成し、遷移先のシーン名をExpoloreSceneとします。ExploreSceneは移動機能をテストした際に分かりやすくなるよう、下図のようにテキストで画面中央付近に探索画面と表示させました。

STEP2:シーンの登録

次にシーンの登録を行います。Fileタブ→BuildSettingsから下図のように、ScenesInBuildにExploreSceneを登録しました。

選択されたダンジョンの情報を保持するクラスの実装

 

次に「GO」ボタンがクリックされた時、どのダンジョンが選ばれたのかという情報を保持しておくクラスを実装します。

この情報はシーン遷移後にも利用したい情報ですので、Unity基礎4でご紹介したpublicでstaticなクラスを作成し、利用します。必要に応じて下記Unitu基礎4もご覧ください。

【Unity基礎4】複数のシーンで変数を共有する
ゲーム制作の際、キャラクターのHPや累積経験値など、複数のシーンで変数を共有する必要が出てくる場合があります。今回はそのような状況を想定し、複数のシーン間で変数を共有する方法を説明したいと思います。

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;
}

ポイント以下の通りです。

5行目:MonoBehaviourは継承しません。またstaticクラスであることに注意してください。
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行目の部分です。なお、上での説明と重複しますが、追加部分を簡単に説明すると下記のとおりです。

14行目~17行目:「ゴブリンの洞窟」の「GO」ボタンがクリックされた時に呼び出されるようにするメソッド
16行目:DungeonStateMangerクラスで定義した変数selectedDungeonIDに、「ゴブリンの洞窟」のダンジョンIDを格納

 

STEP2:ギルド職員による会話を表示させる機能を実装する

ダンジョンのIDを格納したら、次はその処理の後にギルド職員に「それでは気をつけていってらっしゃまいせ」と発言させるようにすることにします。

GoToDungeon会話ブロックの追加と編集

先ずは会話ブロックを追加し、表示条件や表示内容を設定します。具体的には下図のようにヒエラルキーウィンドウのFlowchartを選択し、新たに「GoToDungeon」という名前の会話ブロックを作成します。その後、下記のように表示条件・表示内容を設定します。

表示条件(ExecuteOnEvent):MessageReceived
Message:GoToDungeon
表示内容: それでは気をつけていってらっしゃいませ(Sayコマンド)

 

上で使用している特定のタイミングで会話を表示させる方法については、下記Unity基礎6で詳しく説明しています。必要に応じてご参照ください。
【Unity基礎6】任意のタイミングで会話を表示させる方法〜Fungusの使い方③〜
今回はUnityで自身の設定した特定のタイミングで会話ログを表示させる方法について説明します。ゲームにおける戦闘終了時の経験値取得ログ表示を例として扱います。
スクリプトの編集(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");
    }
}

新たに追加した部分を簡単に説明すると下記のとおりです。

5行目:Fungusを使った会話制御を行うために導入
9行目:Flowchartとの連携窓口として実装
22行目:ギルド職員に「それでは気をつけていってらっしゃまいませ」と発言させる会話ブロックの会話起動条件に設定したメッセージをFlowchartに送付

 

今回使用したSerializedFieldについては下記Unity基礎7で解説しています。必要に応じてご参照ください。
【Unity基礎7】オブジェクトから別オブジェクトを操作する方法〜SerializedField〜
ゲーム製作の際、あるオブジェクトから別のオブジェクトを操作したい場面は多々発生します。この記事ではその方法の一つについて説明します。
 スクリプトとFlowchartの連携

最後に先ほど編集したスクリプトで定義した変数GuildStaffConvとFlowchartを連携させます。具体的には下図に示すとおり、ButtonControllerオブジェクトにアタッチされているスクリプトのGuildStaffConvボックス内にFlowchartをドラッグ&ドロップします。

「GO」ボタンがクリックされた時の動作実装

「GO」ボタンがクリックされた時の機能が実装できたので、クリック時の動作と結びつけます。具体的には下図のように「GO」ボタンのOnClick()に先ほど作成したClickGoblinGoButtonを設定します。

ボタンクリック時の動作実装方法についてはUnity基礎3でも解説していますので、必要に応じてご覧ください。

会話表示後に探索画面へ遷移させる処理実装

ここまででボタンクリックがされた時、選択されたダンジョン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の中を下記のように設定して完成です。(下図参照)

CallMethodの設定
TargetObject:ButtonController(呼び出したいメソッドがアタッチされているオブジェクト)MethodName:GoToExploreScene(呼び出したいメソッド)
Delay:1(会話表示後1秒経ってから画面遷移メソッドを呼び出す設定)

 

会話表示後にメソッドを呼び出す方法については下記Unity基礎5で詳しく説明してますので、必要に応じてご参照ください。
【Unity基礎5】会話終了後にメソッドを呼び出す方法〜Fungusの使い方②〜
今回は会話終了後にメソッド呼び出しが必要な状況(経験値取得の会話ログ表示後に探索画面へ戻る等)を想定し、Fungusを使って、会話ログを表示させた後にメソッドを呼び出す方法を紹介します。

機能テスト

最後にこれまで作成した機能のテストを行いましょう。Playボタンを押して「ゴブリンの洞窟」の「GO」ボタンを押した時、ギルド職員が「それでは気をつけていってらっしゃませ」と発言し、その後探索画面へ移動すれば成功です。実際にゲームを起動すると下図のようになり、うまく動いていることが確認できました。

今回は簡単のため「ゴブリンの洞窟」についてのみ実装しましたが、他のものについても同様ですので、残りのダンジョンについては皆さんでやってみてください。

今回は単純な画面遷移だけでなく、変数の保持や会話後のメソッド呼び出しなど色々な処理が必要だったため、大変だったかと思いますがいかがでしたでしょうか。ここまでの内容でギルド画面についてはひとまず終了となります。皆さんお疲れ様でした。次回からは探索画面を実装していければと考えています。ではまた次回お会いしましょう。

以上

コメント