付記:ノンプログラミング開発したものにチャットを追加する

目次

  前置き
  ノンプログラミング開発プロジェクトを開き、チャット用スクリプトを追加する
  チャットスクリプトを組み込む
  スクリプトを修正する
  ここまでのChatScript01の内容
  実行して確認する


前置き

おまけ:ノンプログラミング開発にチャット機能を追加する

  今章では新規シーンからチャット機能を追加しました。
  では、ノンプログラミング開発したものにチャット機能を追加するには、今章の内容と同じように組み込めば良いのでしょうか?

  答えは「既に入退室の制御が自動化されているので、同じように組み込むわけにはいかない」です。

  「それでは困る!」というケースを想定し、おまけ要素としてこのページを設けました。
  このページは「ノンプログラミング開発したものにチャットを追加するにはどうすれば良いか」をまとめたものです。

  さすがに「ノンプログラミング」とは行きませんが、参考になれば幸いです。


ノンプログラミング開発プロジェクトを開き、チャット用スクリプトを追加する

ノンプログラミング開発したプロジェクトを開く

  前章で作成した「ノンプログラミング開発したプロジェクト」を開きます。
  Assets フォルダ直下にある Test01(Test01.unity)をダブルクリックして開きます。

Hierarchy 内にある「GameObject」を選択する

  Test01 を開いたら、Hierarchy の中から、前回「自動接続スクリプト」を登録した「GameObject」を選択ます。

GameObject に新規スクリプトを登録する

  この GameObject に、チャットプログラム用の新規スクリプトを登録します。
  Inspector にある [Add Component] ボタンを押してください。
  プルダウンメニューから New Script を選びます。(メニューリストの一番下にあります)
  Name 欄に ChatScript01 と入力し、 [Create and Add] ボタンを押します。
  以下のように Inspector に ChatScript01 が登録されます。

追加したスクリプトを開く

  Inspector に追加された「ChatScript01」を開きます。
  Inspector 内の Chat Script 01 の欄にある、以下の赤枠内をダブルクリックしてください。
  VisualStudio(またはMonoDevelop)が起動し、ChatScript01 がテキストとして開きます。


チャットスクリプトを組み込む

本章の内容をもとに、チャットスクリプトを組み込む

  本章で説明している「プログラミング・クイックスタート」の内容をもとに、チャットスクリプトを組み込みます。

    > シンプルなチャットを作る(前準備)#追加したスクリプトの編集 以降
    > MUNサーバへのログイン制御
    > チャットルームへの入室制御
    > チャットルーム内の制御
    > チャットルームからの退室制御

  すべて組み込んだ内容の結果は こちら にありますので、面倒であれば、これをそのままコピー&ペーストすると良いでしょう。


スクリプトを修正する

クラス名を ChatScript01 に変更する

  ChatScript01 の 6 行目付近のクラス宣言文を、以下のように変更します。
public class ChatScript01 : MonobitEngine.MonoBehaviour {				
  本章で説明しているスクリプトは ChatScript で、今回作成している ChatScript01 ではありません。
  スクリプト内に記述されているクラス名(public class の後に記述されている項目)は、
  スクリプト名と一致させる必要があるため、ここを修正します。

自動接続スクリプトとボタンが被らないようにする

  ChatScript01 の 35 行目付近に、以下のコードを記述します。
		// 自動接続スクリプトのボタンと被らないようにする
		GUILayout.Space(24);
		
  自動接続スクリプトで表示させている、[Connect][GameStart][Disconnect] のボタンの縦幅の分だけ、
  チャット用スクリプトのGUI表示を下側にずらします。

ルーム退室制御を削除する

  ChatScript01 の 53 行目付近から 58 行目付近までを削除します。
  ルームへの退室処理(サーバ切断処理)は、自動接続スクリプトが行ないますので削除します。

ルーム入室制御を削除する

  ChatScript01 の 77 行目付近から 110 行目付近までを削除します。
  ルームへの入室処理も、自動接続スクリプトが行ないますので削除します。

サーバ接続制御を削除する

  ChatScript01 の 90 行目付近から 97 行目付近までを削除します。
  サーバへの接続処理も、自動接続スクリプトが行ないますので削除します。


ここまでのChatScript01の内容


  改めて触れますが、ここまでの ChatScript01.cs の内容は以下の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MonobitEngine;

public class ChatScript01 : MonobitEngine.MonoBehaviour
{
    /** ルーム名. */
    private string roomName = "";

    /** チャット発言文. */
    private string chatWord = "";

    /** チャット発言ログ. */
    List<string> chatLog = new List<string>();

    /**
     * RPC 受信関数.
     */
    [MunRPC]
    void RecvChat(string senderName, string senderWord)
    {
        chatLog.Add(senderName + " : " + senderWord);
        if (chatLog.Count > 10)
        {
            chatLog.RemoveAt(0);
        }
    }

    /**
     * GUI制御.
     */
    void OnGUI()
    {
        // 自動接続スクリプトのボタンと被らないようにする
        GUILayout.Space(24);
        
        // MUNサーバに接続している場合
        if (MonobitNetwork.isConnect)
        {
            // ルームに入室している場合
            if (MonobitNetwork.inRoom)
            {
                // ルーム内のプレイヤー一覧の表示
                GUILayout.BeginHorizontal();
                GUILayout.Label("PlayerList : ");
                foreach (MonobitPlayer player in MonobitNetwork.playerList)
                {
                    GUILayout.Label(player.name + " ");
                }
                GUILayout.EndHorizontal();

                // チャット発言文の入力
                GUILayout.BeginHorizontal();
                GUILayout.Label("Message : ");
                chatWord = GUILayout.TextField(chatWord, GUILayout.Width(400));
                GUILayout.EndHorizontal();

                // チャット発言文を送信する
                if (GUILayout.Button("Send", GUILayout.Width(100)))
                {
                    monobitView.RPC("RecvChat",
                                    MonobitTargets.All,
                                    MonobitNetwork.playerName,
                                    chatWord);
                    chatWord = "";
                }

                // チャットログを表示する
                string msg = "";
                for (int i = 0; i < 10; ++i)
                {
                    msg += ((i < chatLog.Count) ? chatLog[i] : "") + "\r\n";
                }
                GUILayout.TextArea(msg);
            }
        }
        // MUNサーバに接続していない場合
        else
        {
            // プレイヤー名の入力
            GUILayout.BeginHorizontal();
            GUILayout.Label("PlayerName : ");
            MonobitNetwork.playerName = GUILayout.TextField(
                (MonobitNetwork.playerName == null) ?
                    "" :
                    MonobitNetwork.playerName, GUILayout.Width(200));
            GUILayout.EndHorizontal();
        }
    }
}



実行して確認する

複数クライアントでの操作について

  基本的には実行して確認するの内容に沿って動作確認できますが、実行後の操作だけ異なります。

  起動直後、「PlayerName : 」の欄に名前を入力して、[Connect] のボタンを押します。
  [Connect] を押すと、そのままチャットルームに移行した状態に変わります。
  ここでチャットを行なうことができます。
  もちろん、[GameStart]を押すことで、キャラクタを操作しながらチャットを行なう、ということも可能です。