Union Platformには色々な概念が登場します。本家のOverviewで紹介されている5つのコンセプトについてみていきます。UnionのバージョンはUnion alpha3を使用します。
- Server
- Client
- Room
- Attribute
- Message
Server
マルチユーザアプリケーションの中心となるのがServerです。クライアント同士はP2Pで直接やりとりすることはありません。必ずServerを介してお互いの情報を共有します。Serverとのやり取りは独自のUPCプロトコルを使用します。この独自のUPCプロトコルで通信するためにFlash PlayerからSocket通信を行います。
Serverとの通信の入り口となるGatewayは複数用意する事が可能です。通常の通信は、デフォルト9100ポートを使うように設定されていますがサーバの設定で変更する事が可能です。
Serverの設定
基本的にServer側のxmlを変更することで対応できます。設定方法は、公式サイトのUnion Server Configurationに詳しく掲載されています。
お試しServer
Union Serverをお試しするには、tryunion.comを使う事が出来ます。
Serverへの接続
Reactorクラスをインスタンス化して、connectメソッドを呼び出します。
var reactor:Reactor = new Reactor(); reactor.addEventListener(ReactorEvent.READY, reactor_readyHandler); reactor.connect("tryunion.com", 9100);
Client
Union Platformが提供するマルチユーザアプリケーションのユーザに当たるのがClientです。swfをブラウザのFlash Playerから実行する場合、ブラウザのウィンドウを複数立ち上げる事で、1人のユーザが複数のクライアントを操る事も可能です。 各Clientには一意のIDが振られるので、IDをキーにして識別する事が可能です。以下のようなことが出来ます。
- クライアントIDを指定して、特定のユーザの情報(後述するAttributeなど)を取得する
- クライアントIDを指定して、特定のユーザへメッセージ(後述するMessage)を送る
自身のClientを参照する
以下のように自身のClientインスタンスを取得出来ます。
// reactorにconnect後、ReactorEvent.READYイベントが送出されている事 var self:IClient = reactor.getClientManager().self();
Client API
Room
前回も紹介したとおり、Union ServerにはRoomという概念があります。Roomはサーバ上に作られる仮想の部屋です。RoomはRoom IDで識別されます。ClientはRoom IDを指定して、好きなRoomへ接続します。Server上に指定したRoom IDが存在しない場合は、新たにRoomを作成する事も出来ます。その際にパスワードを設定して秘密のRoomを作成することも可能です。
複数のRoomへの接続
Clientは1つのコネクションで、複数の部屋に接続する事が可能です。例えば、フリーチャットルームに接続しながら、Serverに接続しているみんなとチャットを楽しみつつ、1対1のゲームにも参加するようなシチュエーションが考えられます。
joinとobserve
またClientはRoomにjoinすること、observeすることが可能です。この違いは、
- joinは実際に部屋の中に入り、Room内の更新情報を共有します。自分から情報の発信を行うことも出来ます。
- observeは部屋の中を覗くイメージです。Room内の更新情報を共有するので、Room内で何が起きているのか見る事が出来ます。チャットのROM中のユーザはチャットRoomをobserveしているイメージです。ただし、部屋の出来事に口出しすることは出来ません。
下記の図では、Aさんはobserveをしています。B, C, Dさんは各部屋にjoinしています。Bさんは、2つのRoomに同時にjoinしている事を表しています。 [caption id="attachment_293" align="aligncenter" width="492" caption="joinとobserve"][/caption]
Roomを作成する
以下のように自身のRoomインスタンスを作成
// reactorにconnect後、ReactorEvent.READYイベントが送出されている事 var room:Room = reactor.getRoomManager().createRoom("unionParty");
Roomにjoin, observeする
以下のようにjoinします。
room.addEventListener(RoomEvent.JOIN, room_joinHandler); room.join();
observeは以下のようになります。
room.addEventListener(RoomEvent.OBSERVE, room_joinHandler); room.observe();
Room API
Attribute
ClientとRoomは自身の属性(プロパティ)を複数持つ事が出来ます。これをAttributeと呼びます。自身の属性とは、特徴や設定と考えると分かりやすいかも知れません。属性は、keyとvalueで定義されます。これらの属性を変更した際には、変更通知が行われるためRoomにjoin, observeしたClient間で情報の共有が可能となります。
[caption id="attachment_299" align="aligncenter" width="601" caption="ClientとRoomのAttribute"][/caption]
具体的な例
あるRoomに4人のClientがjoinしている例を考えます。Roomは、backgroundとtopicというAttributeを持ちます。Clientは、colorとnameというAttributeを持ちます。この状況を下図を使って整理してみます。
[caption id="attachment_295" align="aligncenter" width="650" caption="ClientとRoomのAttributeの例"][/caption]
Roomの背景はオレンジ色で、話題はflashです。このとき、Roomのbackgrond属性はorangeとなり、topic属性はflashとなります。誰かが、「次はiPhoneについて話そう」と提案する際には、Room Attributeのtopicをiphoneに変更します。もちろん、このtopic属性の変化はRoom内のClientに通知されるので、全員が話題の変更に気づきます。
各ユーザはcolor属性で表される自分の発言色と、name属性で表される名前を持ちます。各Clientの属性は以下の通りになります。
- 1人目のユーザのcolor属性はredで、name属性はA
- 2人目のユーザのcolor属性はgreenで、name属性はB
- 3人目のユーザのcolor属性はorangeで、name属性はC
- 4人目のユーザのcolor属性はpurpleで、name属性はD
Aさんが気分を変えて発言色を青にしたいという場合、Client Attributeのcolor属性をblueに変更します。この変更はRoom内の各Clientに通知されるため、全員にAさんが発言色を青に変えた事を伝える事が出来ます。
RoomのAttributeを設定
Roomインスタンスを通じて設定します。
room.setAttribute("background", "orange");
ClientのAttributeを設定
Clientインスタンスを通じて設定します。
self.setAttribute("color", "blue");
Attribute API
Message
Messageは、Clientから発信出来るメソッドになります。Attributeはプロパティで、Messageはメソッドとイメージしておくと良いです。メソッドなので、Message名と任意の引数を渡す事が出来ます。
MessageはServer側から送信することも可能です。RoomにjoinしたClientが居たら、ServerがすべてのClientに通知する、といったシチュエーションが考えられます。
Messageは、基本的にRoomに接続しているClient全員に通知されますが、特定のAttributeを持ったClientだけに通知するなどFilterを使うことで絞り込みを行う事も可能です。
以下の図のように、基本はみんなに向けて発信するメッセージと考えると分かりやすいです。
[caption id="attachment_296" align="aligncenter" width="420" caption="Room Message"][/caption]
Filterを使って、特定のAttributeを持つユーザだけにMessageを送る事も出来ますし、Client IDからClientを識別し、特定のClientに向かってMessageを送信する事も可能です。
[caption id="attachment_297" align="aligncenter" width="474" caption="Client Message"][/caption]
Messageの送信
Roomに接続しているClientへ送信
room.sendMessage("chatMessage", true, null, "こんにちわ!");
Client IDが3941のClientへ送信
var client:IClient = room.getClient("3941"); client.sendMessage("chatMessage", true, null, "今夜空いてる?");
まとめ
今回は、Union Platformに登場する概念について整理しました。図解すると大分理解が深まりました。次回は情報の共有化において、AttributeとMessageの使いどころを考えて行こうと思います。