PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。
今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。
サーバー管理のシンプルなチャット
例えば、特定の単語や言葉遣い、スパムなどを制限する目的で、ゲーム内のチャットの管理をサーバーで行いたい場合もあるでしょう。
現在関わっているゲームに対して、シンプルな サーバー管理のチャットシステムを作成しました。あなたの需要に応えられるかは分かりませんが、何らかのお役に立てて頂ければ幸いです。
PlayerChatController
プレイヤー上に、PlayerChatControllerを添付してください。これにより、プレイヤーからの入力を受け付け、それをサーバーに送信します。私たちは、私たちのGUIについてDF-GUI*を用いています。これによりdfTextboxへの参照を行っておりますが、どのようなGUIシステムを用いていたとしても、基本的な部分は変わりありません。
* DF-GUIは現在保護されていません。そのため、このソリューションを用いることは推奨されません。
C#
public class PlayerChatController : Bolt.EntityEventListener<IPlayerState> {
dfTextbox chatInputTextbox;
void Start () {
chatInputTextbox = PlayerUI.instance.chatInputTextbox; // PlayerUI is a local, non-networked, singleton
}
void Update () {
// The chat input box is triggered when the player presses "T"
if ( Input.GetKey(KeyCode.T) && !chatInputTextbox.IsVisible ) {
chatInputTextbox.MaxLength = 140; // Bolt allows strings of max 140 chars length
chatInputTextbox.Text = "";
chatInputTextbox.IsVisible = true;
chatInputTextbox.Focus();
}
// Things that can only happen if the chat input textbox is visible
if ( chatInputTextbox.IsVisible ) {
// Send message when player presses Enter/Return
if ( Input.GetKeyDown(KeyCode.Return) ) {
chatInputTextbox.IsVisible = false;
chatInputTextbox.Trim(); // Removes spaces at the beginning and end; we don't want strings filled with spaces to bother us
// Send the chat message to the server only for "quality check"
if ( chatInputTextbox.Text.Length > 0 ) {
using ( var evnt = SendChatMsgToServer.Create(Bolt.GlobalTargets.OnlyServer) ) {
evnt.Sender = entity;
evnt.Message = chatInputTextbox.Text;
}
}
}
// Abort (i.e. if pressing the ESC key)
if ( Input.GetKeyDown(KeyCode.Escape) ) {
chatInputTextbox.IsVisible = false;
}
}
}
}
UI_ChatOutputController
このコントローラはプレイヤーのユーザーインターフェイスに添付されるもので、チャットのメッセージを表示したり、それをスクロールしたり、古いものを削除したりするものです。また、チャットイベントも管理します。
C#
public class UI_ChatOutputController : Bolt.GlobalEventListener {
public override void OnEvent ( SendChatMsgToServer evnt ) {
bool okToSend = true;
// This is the place where you do all the checks to see if it's OK to forward the message to all the clients.
// Then, if it's OK...
if ( okToSend ) {
// Send the message to everyone, including the server
using ( var clientEvnt = SendChatMsgToClients(Bolt.GlobalTargets.Everyone) ) {
clientEvnt.Message = evnt.Message;
}
}
}
public override void OnEvent ( SendChatMsgToClients evnt ) {
// This is where you receive the chat message from the server, adds it to your chat messages list/array and refreshes your GUI.
}
}
同じタスクに2つのイベント?
ここで、チャットのメッセージを送信するという基本的に同じ仕事のために 2つの イベントが用いられていることに気がつくかもしれません。クライアントがそのイベントをサーバーに対してのみ送信するようなイベント(上記コードを参照)だけを用いて、その後同じイベントを全てのクライアントに対する送信に用いることもできます(または、サーバーを含む全ての対象への送信にも用いることができます。上記コードを参照してください)。
全てはあなた次第です。
Back to top