ルームの概要¶
Strixでクライアント間の通信を行うには、両者が同じルームに参加している必要があります。
ルーム¶
ルームとは、特定の環境で一緒にゲームをプレイするプレイヤーのグループです。この定義は漠然としていますが、それはルームが、2つのチームに分かれてプレイヤーたちが戦う1つのマップ、プレイヤーたちが相互作用できるワールドの広い範囲、ゲーム外のプレイヤーや動作の同期が合理的な範囲の外にいるプレイヤーともコミュニケーションを行えるチャットルームといった、さまざまなものに対応する可能性があるからです。
ルームはルームサーバー上に作成されます。そのルームサーバーに接続すると、そのルームに参加できるようになります(他に、マスターサーバーに接続しておきNodeRoom系の関数を使うこともできます。詳しくは後述します)。ルームの操作については、このドキュメントで後ほど詳しく説明します。
Strix Unreal SDKでは、ルームはStrix Room構造体によって表します。これは、ルームのプロパティのコンテナーです。
Strix Room構造体はルームプロパティのモデルであって、ルーム内のオブジェクトの同期には使用しません。この構造体が表すのはルームを識別するための特徴です。つまりルームの名前、プレイヤーの人数、マップの名前といった、サーバーが追跡する情報です。
ルームプロパティ¶
ルームにはいくつかのプロパティがあります。ルームプロパティには、サーバーが設定するプロパティ、クライアントが編集できるプロパティ、カスタマイズのために使用できるプロパティなどがあります。自分のカスタムプロパティを実行中に定義することも可能です。
名前 |
タイプ |
説明 |
変数名 |
編集 |
検索 |
primaryKey |
Integer |
主キー(一意ID) |
Id |
× |
* |
capacity |
Integer |
ルームに入ることができるプレイヤーの数 |
Capacity |
◯ |
◯ |
memberCount |
Integer |
現在のプレイヤー数 |
Member Count |
× |
◯ |
isJoinable |
Boolean |
ルームに参加できるかどうか |
Is Joinable |
◯ |
◯ |
state |
Integer |
カスタマイズ可能 |
State |
◯ |
◯ |
name |
String |
ルームの名前 |
Name |
◯ |
◯ |
password |
String |
ルームのパスワード |
Password |
◯ |
◯ |
key1 |
Float |
カスタマイズ可能 |
Key 1 |
◯ |
◯ |
key2 |
Float |
カスタマイズ可能 |
Key 2 |
◯ |
◯ |
key3 |
Float |
カスタマイズ可能 |
Key 3 |
◯ |
◯ |
key4 |
Float |
カスタマイズ可能 |
Key 4 |
◯ |
◯ |
key5 |
Float |
カスタマイズ可能 |
Key 5 |
◯ |
◯ |
key6 |
Float |
カスタマイズ可能 |
Key 6 |
◯ |
◯ |
key7 |
Float |
カスタマイズ可能 |
Key 7 |
◯ |
◯ |
key8 |
Float |
カスタマイズ可能 |
Key 8 |
◯ |
◯ |
stringKey |
String |
カスタマイズ可能 |
String Key |
◯ |
◯ |
properties |
Strix Property Map構造体 |
ユーザー定義のカスタムプロパティ一式 |
Properties |
◯ |
× |
名前: サーバー上で管理しているルームプロパティの論理的な名前です。これは例えば、ルームを作成する際のプロパティマップや、サーチ条件の構成に使用します。
タイプ: ブループリントスクリプトから見たルームプロパティのデータ型です。
変数名: ブループリントスクリプトから見える、Strix Room構造体の対応するメンバー変数の名前です。
編集: プロパティの値を、SetRoom関数を呼んで値を編集したり、新規にルームを作成する際に値を指定したりできるかどうかを示します。編集不可のプロパティを編集しようとすると、エラーにならずに、そのプロパティと同じ名前のカスタムプロパティがproperties内に作成されることがあります。
検索: ルームプロパティを、ルームを検索する際の検索条件や結果の順序の指定に使用できるかどうかを示します。
注釈
Strix Unreal SDKでは、ルームプロパティの名前を文字列として指定することが必要な場面があります。見つけにくいバグを避けるために、プロパティ名では大文字と小文字が区別される点に注意してください。また、名前(これは名前の欄に示してあります)は、Strix Room(またはStrix Node Room)構造体のメンバー変数としてブループリントスクリプトで使われる表示名(これは変数名の欄に示してあります)とは異なっていることにも注意してください。
例えば、新規ルームを作成する際にStrix Property Mapで "Capacity" と指定すると、それは(ルームの最大プレイヤー数を定める)capacityプロパティの値を設定するのではなく、propertiesに格納されるカスタムプロパティの値を設定することになります。"Capacity" と "capacity" は、大文字と小文字を区別する比較では2つの異なるプロパティの名前と見なされるからです。
もう一つの注意点として、Strixの各ルームプロパティにはデータ型が対応しているということがあります。プロパティの名前を文字列として受け取るStrixのAPIでは、その値として任意のデータ型を受け付けますが、データ型が異なる2つの値は、一般に値が異なると見なされます。つまり、文字列である値 "1" は常に整数である値1とは異なると見なされます。また、整数である値1は通常(常に、ではありませんが)単精度浮動小数の値1.0とは異なるとみなされます。
例えば、SetRoom関数を使って文字列プロパティnameに整数値を設定しようとしたり、"1.0" という文字列である値を単精度浮動小数のプロパティkey1に設定しようとしたりすると、その要求はサーバー側で失敗します。
しかし同時に、ゲームスクリプトの妨げにならないように、Strixは可能であれば異なるデータ型の値であっても受け付けようとします。そのため、SetRoom関数では整数値を単精度浮動小数プロパティに設定することができます。例えば、単精度浮動小数プロパティであるkey2に1という整数値を設定すると、key2プロパティは単精度浮動小数の1.0という値になります。
ただし、Strixの寛容なデータ型の扱いに頼ることなく、ブループリントスクリプトでは常に正しいデータ型を指定するようにしてください。
これらのプロパティの取得、使用、設定を行う方法については、ゲームループとルームを参照してください。
NodeRoom¶
Strixでは複数のルームサーバーを利用したスケールアウトが可能です。ゲームクライアントがルームにアクセスする際には、特定のルームがあるルームサーバーを知る必要があります。ルームと関連させてルームサーバーを記録しておくことは煩わしい作業です。
その一方、Strixのマスターサーバーは、接続されている全てのルームサーバー上の全てのルームの最新のリストを維持しています。これにより、クライアントがルームサーバーを見つけて接続する手順をスキップできるため、ルームの操作が簡単になります。
マスターサーバーに保存されているルームのモデルをNodeRoomと呼びます。これはStrix Node Room構造体で表され、Strix Room構造体に対して追加のプロパティをいくつか持っています。
名前 |
タイプ |
説明 |
変数名 |
編集 |
検索 |
primaryKey |
Integer |
このルームとノードの組み合わせの主キー(一意ID) |
Id |
× |
* |
roomId |
Integer |
ルームの主キー(一意ID) |
Room Id |
× |
* |
isPasswordProtected |
Boolean |
ルームにパスワードがある場合はTrue |
Is Password Protected |
× |
◯ |
NodeRoomのことをルームのメタデータにルームサーバーの識別を組み合わせたものだと考えることができるでしょう。ルームを操作する大抵の関数には2種類が存在します。Room版とNodeRoom版です。利用者がどちらかを選んで使用します。
注釈
セキュリティ上の理由で、ルームのパスワードはマスターサーバーに格納しません。そのため、NodeRoomにはpasswordプロパティがありません。代わりにisPasswordProtectedプロパティがあり、ルームにパスワードがあるかどうかを示します。
注釈
ルームのprimaryKeyプロパティや、NodeRoomのprimaryKeyとroomIdプロパティは、サーバー上では64ビット整数型になっています。Strixはそれらによる検索をサポートしています。実際の検索では、検索条件でIntegerではなく64ビットのInteger64型の値を指定する必要がありますが、Strix Unreal SDKにはInteger64型を扱うブループリント関数がありません。そのような条件を指定するには、C++を使用する必要があります。