特定のルールや特定のマップのルームを見つける方法

各ルームには、現在のゲームマップ、モード、ステージなどのさまざまなパラメーターを持たせることができます。SearchJoinableRoom()関数とIConditionオブジェクトを使用すると、検索条件を満たすルームのコレクションを見つけることができます。

以下のようなゲームモードとマップがあるとしましょう。

public enum GameRule {
    TeamDeathMatch = 0,
    DeathMatch,
    GroundBattle
}

public enum GameMap {
    Island = 0,
    Sea,
    River
}

両者は特定のゲームタイトルに特有のプロパティのため、これらを表すためにはカスタムプロパティを使用します。つまり、key1GameRuleを、key2GameMapを、それぞれ格納することにします。

ルームを作成するスクリプトは(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のいずれかまたは両方が成立

  • この表では、「任意」はboolintlongdoublestringのいずれかを表し、「数値」はintlongdoubleのいずれかを表します。

注釈

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

文字列

注釈

ルームは、標準のプロパティ(例えば、capacitymemberCount)で検索することも標準のカスタムプロパティ(例えば、statekey1)で検索することもできますが、無制約のカスタムプロパティ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」ではないルームということになるのです。

このページで示した例では、GameRuleGameMapは列挙型ですが、key1key2というカスタムプロパティはdoubleです。そのため、上記のコード例では列挙型の値を毎回doubleにキャストしています。

特に注意が必要なのは、列挙型をValueのコンストラクターやEqualToのような比較メソッドに渡すときです。これらのメソッドのオーバーロードには、さまざまなプロパティに対応するためにintをとるものとdoubleをとるものがあります(他の型をとるものもあります)。列挙型の値をキャストせずにこれらのメソッドに渡すと、C#の文法によって暗黙のうちにint型にキャストされてintを受け取るメソッドが使われることになりますが、それが作るIConditionオブジェクトは役に立ちません。