グーグルアドセンス

広告

MonobitEngineでチャットルーム作成

今までPhotoncloudを使ってきましたが、1秒間に500メッセージの制限がないMonobitEngineを最近使ってます。割とPhotonと同じように使えるので、Photon経験者だとすぐに使えますね。

MonobitEngineのダウンロード

手順は

  1. MonoBitEngineを一番左のMUNクライアントセットをダウンロード
  2. Unityを起動し、Asset→ImportPackage→CastamPackageで1のファイルを読み込む
  3. 一度実行し、MnobitUnityNetworking→Resourcesのフォルダに、MnobitAutherntiicateCodeとMonobitServerSettingsがあるか確認する。
  4. 以下のソースコードを張り付ける

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MonobitEngine;

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

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

    GUIStyle AllChatStyle = new GUIStyle(); //全体チャットStyle
    GUIStyleState AllChatStyleState = new GUIStyleState();
    Rect RoomGuiRect = new Rect(0, 0, 300, 200); //チャットUIの大きさ設定用
    Rect LobbyGuiRect = new Rect(0, 0, 300, 200);
    Vector2 scrollPos = new Vector2(0,10);   //スクロールバー位置

    bool FocusFlag = false;
    void Start()
    {
        GUI.FocusControl("");
        //全体チャットの場合
        AllChatStyleState.textColor = Color.white;
        //文字がUIからあふれた場合は折り返す設定
        AllChatStyle.normal = AllChatStyleState;
        AllChatStyle.wordWrap = true;
    }
    /**
     * RPC 受信関数.
     */
    [MunRPC]
    void RecvChat(string senderName, string senderWord)
    {
        chatLog.Add(senderName + " : " + senderWord);
        if (chatLog.Count > 10)
        {
            chatLog.RemoveAt(0);
        }
    }

    void Update()
    {
        //ChatUIの位置を調整
        RoomGuiRect.y = Screen.height - RoomGuiRect.height;
        //ChatUIの大きさ調整
        RoomGuiRect.width = Screen.width / 3;
        RoomGuiRect.height = Screen.height / 3;

        LobbyGuiRect.x = Screen.width / 4;
        LobbyGuiRect.y = Screen.height / 4;
        LobbyGuiRect.width = Screen.width / 2;
        LobbyGuiRect.height = Screen.height / 4;
    }

    int State = 0;
    void ChatUIWindow(int window_id)
    {
        //FocusがチャットUIに乗ってるときにEnterを押すとチャット発言が実行される
        if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
        {
            if (!string.IsNullOrEmpty(chatWord))  //チャット入力欄がNullやEmptyでない場合
            {
                //チャット送信関数実行
                monobitView.RPC("RecvChat",
                                MonobitTargets.All,
                                MonobitNetwork.playerName,
                                chatWord);
                chatWord = "";
                return;
            }
            else
            {
                GUI.FocusControl("");
                FocusFlag = false;
            }
        }
        //垂直のコントロールグループ開始
        GUILayout.BeginVertical();
        // ルーム内のプレイヤー一覧の表示
        GUILayout.BeginHorizontal();
        GUILayout.Label("PlayerList : ");
        foreach (MonobitPlayer player in MonobitNetwork.playerList)
        {
            GUILayout.Label(player.name + " ");
        }
        GUILayout.EndHorizontal();

        //スクロールビュー開始位置
        scrollPos = GUILayout.BeginScrollView(scrollPos);

        //チャットログ表示用フレキシブルスペース生成
        GUILayout.FlexibleSpace();
        // チャットログを表示する
        for (int i = chatLog.Count - 1; i >= 0; --i)
        {
            GUILayout.Label(chatLog[i], AllChatStyle);
        }
        //スクロールビュー終了
        GUILayout.EndScrollView();

        GUILayout.BeginHorizontal();
        //入力テキストフィールド生成、Focusが乗った状態をChatInputと命名
        GUI.SetNextControlName("ChatInput");
        chatWord = GUILayout.TextField(chatWord, GUILayout.Width(200));
        // チャット発言文を送信する
        if (GUILayout.Button("Send", GUILayout.ExpandWidth(false)))
        {
            monobitView.RPC("RecvChat",
                            MonobitTargets.All,
                            MonobitNetwork.playerName,
                            chatWord);
            chatWord = "";
        }
        // ルームからの退室
        if (GUILayout.Button("Room", GUILayout.ExpandWidth(false)))
        {
            MonobitNetwork.LeaveRoom();
            chatLog.Clear();
        }
   
        if(!FocusFlag && Input.GetKeyDown(KeyCode.Return))
        {
            FocusFlag = true;
            GUI.FocusControl("ChatInput");
        }
        GUILayout.EndHorizontal(); 

        //垂直のコントロールグループ終了
        GUILayout.EndVertical();
    }
    void RoomNameUIWindow(int window_id)
    {
        // ルーム名の入力
        GUILayout.BeginHorizontal();
        GUILayout.Label("RoomName : ");
        roomName = GUILayout.TextField(roomName, GUILayout.Width(200));
        GUILayout.EndHorizontal();

        // ルームを作成して入室する
        if (GUILayout.Button("Create Room", GUILayout.Width(150)))
        {
            MonobitNetwork.CreateRoom(roomName);
        }

        // ルーム一覧を検索
        foreach (RoomData room in MonobitNetwork.GetRoomData())
        {
            // ルームパラメータの可視化
            System.String roomParam =
                System.String.Format(
                    "{0}({1}/{2})",
                    room.name,
                    room.playerCount,
                    ((room.maxPlayers == 0) ? "-" : room.maxPlayers.ToString())
                );

            // ルームを選択して入室する
            if (GUILayout.Button("Enter Room : " + roomParam))
            {
                MonobitNetwork.JoinRoom(room.name);
            }
        }
    }
    void PlayerNameUIWindow(int window_id)
    {
        // プレイヤー名の入力
        GUILayout.BeginHorizontal();
        GUILayout.Label("PlayerName : ");
        MonobitNetwork.playerName = GUILayout.TextField(
            (MonobitNetwork.playerName == null) ?
                "" :
                MonobitNetwork.playerName, GUILayout.Width(200));
        GUILayout.EndHorizontal();

        // デフォルトロビーへの自動入室を許可する
        MonobitNetwork.autoJoinLobby = true;

        // MUNサーバに接続する
        if (GUILayout.Button("Connect Server", GUILayout.Width(150)))
        {
            MonobitNetwork.ConnectServer("SimpleChat_v1.0");
        }
    }
    void OnGUI()
    {
        // MUNサーバに接続している場合
        if (MonobitNetwork.isConnect)
        {
            // ルームに入室している場合
            if (MonobitNetwork.inRoom)
            {
                GUILayout.Window(0, RoomGuiRect, ChatUIWindow, "");
   
            }
            // ルームに入室していない場合
            else
            {
                GUILayout.Window(1, LobbyGuiRect, RoomNameUIWindow, "");
            }
        }
        // MUNサーバに接続していない場合
        else
        {
            GUILayout.Window(2, LobbyGuiRect, PlayerNameUIWindow, "");
        }
    }
}

Photonの時と似たような配置にしましたが、エンターキーでフォーカスを合わせたり、外したり、発言ボタンの代わりになったり、機能面では前よりも、使いやすくなっています。