▲前のページへ
次のページへ▼

チャットを作る(1) チャットの実装


【目次】
GUIと送信処理の実装
サーバ側での受信処理
クライアント側での受信処理


GUIと送信処理の実装

 シンプルなエコー送受信を用いて、シンプルなチャットを作ってみましょう。
 まずは簡素なGUIを用意するところから始めてみましょう。

■ チャットGUIに必要なデータ郡の定義
  Unity から client/unity/Asset/MainExecute.cs を選び、その 84 行目あたりに
  名前・チャット文・ログリストを保存するための以下の変数宣言を加えましょう。
    // チャット用
    private string m_Name = "";
    private string m_Text = "";
    private static List<string> m_ChatLog = new List<string>();
  

■ GUIスクリプトの記述
  続けて、これらのフィールド要素を踏まえ、GUIを用意します。
  送信ボタン押下時に、echoサンプルの文字列送信と同じようにサーバへ送信する処理も同時に組み込んでしまいましょう。
  ただし、ここではイベントキーを「2」に、送信文字列を「名前:本文」となるように送信します。

  では、MainExecute に、更に以下の OnGUIメソッドを付け加えてください。
    void OnGUI()
    {
        // 名前欄
        GUI.Label(new Rect(0, 0, 40, 20), "名前");
        m_Name = GUI.TextField(new Rect(40, 0, 150, 20), m_Name);

        // 本文
        GUI.Label(new Rect(0, 20, 40, 20), "本文");
        m_Text = GUI.TextField(new Rect(40, 20, 200, 20), m_Text);

        // 送信ボタン
        if (GUI.Button(new Rect(250, 20, 50, 20), "送信"))
        {
            // イベントキー(ここでは2)と任意のデータ(ここでは文字列)を送信する
            var parameters = new Dictionary<byte, object> { { 2, m_Name + " : " + m_Text } };
            m_Client.SendServer(parameters);
        }

        // チャットログ欄
        for (int i = 0; i < m_ChatLog.Count; i++)
        {
            GUI.Label(new Rect(0, 40 + i * 20, 640, 20), m_ChatLog[i]);
        }
    }
  


サーバ側での受信処理

■ 受信制御を組み込む
  サーバ側の受信処理については「プログラム解説」の項目にも記載しましたが、
  EchoClient.SendServer で送られてくるイベントキーによって「どんな処理を行うか」について記述します。

  デフォルトの状態だと、「送信元のクライアントに」送信する形になっていますが、一般的なチャットを考えると
  「現在接続している全てのクライアントに」発言内容を送信する形にしなければなりません。

  先に「イベントキー」として「2」を設定したのはそのためで、server/echo_sample/src/MainExecute.cpp にある
  SendMessage 関数に、以下のケースを追加して無条件で送信します。
  SendMessage 関数そのものは「接続中の全クライアントに対し等しく呼び出される関数」ですので、
  無条件で Send_EchoResult() をコールすれば全員にコールが帰ります。
	case 2: // CHAT本文
		{
			// 全員に送信
			GetInterface_Intf(peerRpcId).Send_EchoResult( eventId, pData );
		}
		break;
  


クライアント側での受信処理

■ クライアント側でチャットログを更新する
  サーバから受信してきた情報は client/unity/Assets/MainExecute.cs の OnEvent メソッドで受け取ることが出来ますので、
  先ほど同様、イベントキーに基づいたチャットログに更新を掛けます。
        case 2:
            {
                // イベント2ならチャットログに反映
                if (m_ChatLog.Count > 15)
                {
                    m_ChatLog.RemoveAt(0);
                }
                m_ChatLog.Add(obj.ToString());
            }
            break;
  


▲前のページへ
次のページへ▼