特定のルールや特定のマップのルームを見つける方法¶
各ルームには、現在のゲームマップ、モード、ステージなどのさまざまなパラメーターを持たせることができます。SearchJoinableRoom()関数とIConditionオブジェクトを使用すると、検索条件を満たすルームのコレクションを見つけることができます。
以下のようなゲームモードとマップがあるとしましょう。
public enum GameRule {
TeamDeathMatch = 0,
DeathMatch,
GroundBattle
}
public enum GameMap {
Island = 0,
Sea,
River
}
両者は特定のゲームタイトルに特有のプロパティのため、これらを表すためにはカスタムプロパティを使用します。つまり、key1
にGameRule
を、key2
にGameMap
を、それぞれ格納することにします。
ルームを作成するスクリプトは(DeathMatchルールでIslandマップの場合)次のようになります。
StrixNetwork.instance.CreateRoom(
new RoomProperties {
name = "New Room",
capacity = 4,
key1 = (double)GameRule.DeathMatch,
key2 = (double)GameMap.Island
},
new RoomMemberProperties {
name = "Player name"
},
args => {
Debug.Log("CreateRoom succeeded");
},
args => {
Debug.Log("CreateRoom failed. error = " + args.cause);
}
);
ICondition
オブジェクトを作成することにより、ルームを条件検索できます。検索を行うには、プロパティの名前(検索APIでは「フィールド」と呼びます)と想定する値を渡す必要があります。
StrixNetwork.instance.SearchJoinableRoom(
new Equals(new Field("key1"), new Value((double)GameRule.DeathMatch)),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
Debug.Log("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
Debug.Log("SearchJoinableRoom failed. error = " + args.cause);
}
);
別の方法として、ConditionBuilder
を使ってIConditionオブジェクトを作成することもできます。こちらの方がより便利で読みやすい表現になります。
StrixNetwork.instance.SearchJoinableRoom(
ConditionBuilder.Builder().Field("key1").EqualTo((double)GameRule.DeathMatch).Build(),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
Andオブジェクトを使用すると、いくつかの条件を使用してルームを検索できます。
StrixNetwork.instance.SearchJoinableRoom(
new And(
new List<ICondition> {
new Equals(new Field("key1"), new Value((double)GameRule.DeathMatch)),
new Equals(new Field("key2"), new Value((double)GameMap.Island))
}
), null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
または、同じ検索を次のようにConditionBuilderを使用して行うこともできます。
StrixNetwork.instance.SearchJoinableRoom(
ConditionBuilder.Builder()
.Field("key1").EqualTo((double)GameRule.DeathMatch)
.And()
.Field("key2").EqualTo((double)GameMap.Island)
.Build(),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
Strixでは条件の構成要素として以下のものを提供します。
条件を表す型 |
ビルダーのメソッド |
データ型 |
説明 |
---|---|---|---|
Equals |
EqualTo |
任意 |
key == value |
NotEquals |
NotEqualTo |
任意 |
key != value |
GreaterThan |
GreaterThan |
数値 |
key > value |
GreaterThanEquals |
GreaterThanEquals |
数値 |
key >= value |
LessThan |
LessThan |
数値 |
key < value |
LessThanEquals |
LessThanEquals |
数値 |
key <= value |
IsNull |
IsNull |
文字列 |
keyがnullである |
IsNotNull |
IsNotNull |
文字列 |
keyがnullではない |
Like |
Like |
文字列 |
keyが値(パターン)に一致する |
NotLike |
(利用できません) |
文字列 |
keyが値(パターン)に一致しない |
And |
And |
条件 |
条件Aと条件Bが共に成立 |
Or |
Or |
条件 |
条件Aまたは条件Bのいずれかまたは両方が成立 |
この表では、「任意」は
bool
、int
、long
、double
、string
のいずれかを表し、「数値」はint
、long
、double
のいずれかを表します。
注釈
Strixはより多くの条件構成要素をサポートしています。完全な一覧はAPIリファレンスを参照してください。
検索条件には以下のプロパティ(フィールド)名が使用できます。
フィールド名 |
型 |
---|---|
roomId |
long |
capacity |
int |
memberCount |
int |
primaryKey |
long |
isPasswordProtected |
bool |
isJoinable |
bool |
state |
int |
name |
文字列 |
key1 |
double |
key2 |
double |
key3 |
double |
key4 |
double |
key5 |
double |
key6 |
double |
key7 |
double |
key8 |
double |
stringKey |
文字列 |
注釈
ルームは、標準のプロパティ(例えば、capacity
やmemberCount
)で検索することも標準のカスタムプロパティ(例えば、state
やkey1
)で検索することもできますが、無制約のカスタムプロパティ(properties
に格納するもの)で検索することはできません。
注釈
検索を行う際にはプロパティの型を区別します。自動型変換のようなものは適用されません。ルームプロパティの名前と指定された型が一致しない場合には、エラーは検出されませんが、無意味な結果が返ってきます。
例えば、capacityが2ではないルームを見つけたいのであれば、検索メソッドに次の条件を渡すことができます。
new Equals(new Field("capacity"), new Value(2))
しかし、何らかの理由で、次のように書き間違えてしまうと、うまく動作しません。
new Equals(new Field("capacity"), new Value(2.0))
後者の条件を使った検索では、capacityが2であるルームも含んだ一覧が返ってくることになります。Strixの条件システムではintの値2と、doubleの値2.0とを区別します。"capacity"プロパティはint型なので、検索結果はcapacityが「doubleの値2.0」ではないルームということになるのです。
このページで示した例では、GameRule
とGameMap
は列挙型ですが、key1
とkey2
というカスタムプロパティはdouble
です。そのため、上記のコード例では列挙型の値を毎回double
にキャストしています。
特に注意が必要なのは、列挙型をValue
のコンストラクターやEqualTo
のような比較メソッドに渡すときです。これらのメソッドのオーバーロードには、さまざまなプロパティに対応するためにint
をとるものとdouble
をとるものがあります(他の型をとるものもあります)。列挙型の値をキャストせずにこれらのメソッドに渡すと、C#の文法によって暗黙のうちにint
型にキャストされてint
を受け取るメソッドが使われることになりますが、それが作るIConditionオブジェクトは役に立ちません。