アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

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