Liteアプリケーション
ここでは、Liteアプリケーションの基本的な概念の概要を説明します。
ピア
Liteは、Photon用のアプリケーションフレームワークに基づいており、 接続プレイヤーへの参照として「ピア」を使用しています。これはラップされ、クラスLitePeerで拡張されます。
クライアントがLiteアプリケーションに接続すると、 LiteApplication.CreatePeerに新しいLitePeerが作成されます。 そのクライアントからのさらなるリクエスト(たとえば、オペレーションなど)は、該当のLitePeerによって処理されるようになります。
Liteでは、すべてのLitePeerはステートとして単一のRoomReferenceを持ちます。 プレイヤーは、単一のルームにのみ存在できます。 ステートはオペレーションJoinによって設定されます。
LitePeerではピアが切断されるとOnDisconnectメソッドが呼ばれます。 ピアがルームに残っている場合、ピアを削除するメッセージを取得します。
ルーム
Liteでは、ピアは一緒にプレイするためにルームに入ります。ルームを「ゲーム」とも呼ぶのはそのためです。 join以外のすべてはルームで行われます。
すべてのゲームには一意の名前があり、他と完全に分離して扱われます。 また、プレイヤーから来るすべてのリクエストは順番に処理されます。 多くのルームが並行して存在し、それぞれのリクエストは単なるティックで処理されるので、このスケーリングの設定が重要です。
ルームには参加、退出、切断時に更新されるプレイヤーのリストがあります。 これらのプレイヤー間でイベントを送信することができます。
ルームの中で、プレイヤーはアクターとして知られており、各アクターにはActorNumberがあります。この番号は、イベントの起点の特定に使用されます。
オペレーションとイベント
Liteは以下のオペレーションを定義します
- Join: ルームに名前で入ります。存在しない場合はすぐに作成されます。 Joinするとピアは暗黙的に前のルーム(もしあれば)から退室します。 割り当てられたActorNumberを返します。
- Leave: ルームから退出します(ただし、接続は保持されます)。
- RaiseEvent: ルーム内の他のピアにイベントを送信するよう、ルームに指示します。 イベントにはEventCodeがあり、イベントはクライアントが提供したデータを保有できます。Liteは、イベントを保存しません。
- GetProperties: Liteでは、プロパティをルームやプレイヤーにアタッチできます。 このオペレーションでプロパティがフェッチされます。
- SetProperties: 任意のキーと値のセットをルームまたは単一のプレイヤーにアタッチします。 Liteはデータを使用しないので、クライアントは任意のデータを送信できます。慣例によるコードです。
Liteは以下のイベントを定義します
- Join: ルームに参加すると(オペレーションによって) 内部のプレイヤーのリストが更新されます。 このリストはすべてのプレイヤーにイベントで送信されます(新しいものを含む)。
- Leave: プレイヤーがルームを退出すると、他のプレイヤーは再び更新されます。
- Properties update: プロパティが変更される際、 変更をブロードキャストするオプションがあります。 このイベントは、すべてのクライアントが最新の状態である点を確認します。
RaiseEvent / カスタムイベント
Liteではプレイヤーはルーム内の他のプレイヤーに 任意の内容のイベントを送信することができます。 オペレーションRaiseEventがこの処理を行い、イベントの内容を転送します。
たとえば、.NET Realtime デモ内の以下のクライアントコードはプレイヤーの位置を送信します:
C#
// Raises an event with the position data of this player.
internal void SendEvMove(LitePeer peer)
{
if (peer == null)
{
return;
}
Hashtable evInfo = new Hashtable();
evInfo.Add((byte)STATUS_PLAYER_POS_X, (byte)this.posX);
evInfo.Add((byte)STATUS_PLAYER_POS_Y, (byte)this.posY);
//OpRaiseEvent(byte eventCode, Hashtable evData, bool sendReliable, byte channelId, bool encrypt)
peer.OpRaiseEvent(EV_MOVE, evInfo, isSendReliable, (byte)0, Game.RaiseEncrypted);
}
Liteアプリケーションは、サーバー側でイベントを解釈しようとしないので、基本的に何でも送信することができます。上記のEV_MOVEはLiteが認識できるものではなく、クライアント側のみで定義および使用されます。
上記のサンプルで発生する移動イベントによって、受信クライアント上でEventActionコールが生じます。これによって、 イベントとデータが以下のように処理されます:
C#
//in Game.cs:
public void EventAction(byte eventCode, Hashtable photonEvent)
{
int actorNr = 0;
if (photonEvent.ContainsKey((byte)LiteEventKey.ActorNr))
{
actorNr = (int) photonEvent[(byte) LiteEventKey.ActorNr];
}
// get the player that raised this event
Player p;
this.Players.TryGetValue(actorNr, out p);
switch (eventCode)
{
case Player.EV_MOVE:
p.SetPosition((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
break;
//[...]
}
}
//in Player.cs:
internal void SetPosition(Hashtable evData)
{
this.posX = (byte)evData[(byte)STATUS_PLAYER_POS_X];
this.posY = (byte)evData[(byte)STATUS_PLAYER_POS_Y];
}
クライアント以外でも、サーバーは必要に応じて任意のイベントを送信できます。 HandleRaiseEventで使用されるメソッドを確認し、用途に合わせて使用してください。
プロパティ
Liteでは、プロパティはプレイヤーが設定しフェッチできるハッシュテーブルです。 プロパティは常にアクターまたはルームにアタッチされています。 ルームの設定、プレイヤー名、その他クライアントが利用できるものすべてを格納するために使用できます。
オペレーションSetPropertiesとGetPropertiesを使用でき、 任意のクライアントが任意の値を設定可能です。ショートカットとして、Joinにはルームへの入室時にプロパティを設定するための任意のパラメータがあります。このパラメータによって、すぐに利用できるようになります。
参加のたびにルームのプロパティがリセットされないようにするため、Joinはルームが新しく追加された場合にのみルームのプロパティを設定します。このため、すべてのプレイヤーが参加時にルームのプロパティを設定している場合でも、最初の参加時のみルームプロパティが設定されます。
プロパティを設定すると、Liteはプロパティをイベントでブロードキャストするオプションを提供します。このイベントは、新しいプロパティ値を提供するためルーム内の他のユーザに送信されます。
Back to top