ルームの検索

一般的に、マッチメイキング機能を備えたゲームは、参加する特定のマッチを検索する機能をプレイヤーに提供します。Strixでは、これはいくつかの検索メソッドによって提供されています。

検索メソッド

ルームを検索するSearchRoomメソッドの基本形には引数が7つあります。

void SearchRoom(ICondition condition, Order order, int limit, int offset, RoomSearchEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)

SearchRoomのオーバーロードには、条件と結果の順序を省略したものが2種あります。これらは使いやすさのために追加してあります。

void SearchRoom(int limit, int offset, RoomSearchEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
void SearchRoom(ICondition condition, int limit, int offset, RoomSearchEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)

また、メンバーが参加する余地のあるルームのみを検索することに特化したメソッドも2つあります(これらは名前が異なります)。

void SearchJoinableRoom(int limit, int offset, RoomSearchEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)
void SearchJoinableRoom(ICondition condition, Order order, int limit, int offset, RoomSearchEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)

注釈

ルームが1つもない場合には、検索関数は正常に完了し成功ハンドラーが呼び出されますが、見つかったルームの一覧として空のコレクションが渡されます。

検索条件を指定し、どのルームも条件を満たさなかった場合も同様です。

検索条件

Strixの検索機能の中には、検索結果を絞り込むためにconditionという名前の引数を持っているものがあります。

これを利用するために、専用のAPIを使用して複雑な検索クエリを作成できます。ConditionBuilderクラスが、クエリを構築するためのシンプルなインターフェイスを提供します。

まず、ConditionBuilder.Builder()を呼び出します。全ての条件はフィールドで始まるため、ビルダーでFieldメソッドを呼び出してフィールドの名前を指定します。

ConditionBuilder.Builder()
.Field("capacity")

次に、何らかの条件節を追加する必要があります。これらの条件のほとんどは、何らかの固定値か別のフィールドを受け入れます。

例えば、次の方法でcapacityが4に等しいかどうかを調べることができます。

ConditionBuilder.Builder()
.Field("capacity")
.EqualTo(4)

または、capacityがmemberCountと等しいかどうかを確認することもできます。

ConditionBuilder.Builder()
.Field("capacity")
.EqualTo(new Field("memberCount"))

その後、And()Or()メソッドを使用してさらに条件節を追加するか、Build()メソッドを使用して条件を完成させます。

注釈

文字列に作用する全ての条件節では、大文字と小文字を区別します。

検索順序

Strixの検索関数の中にはorderという引数を持つものがあります。これは、検索結果の並び順を指定します(OrderType.Ascendingは昇順、OrderType.Descendingは降順です)。

Order order = new Order("MyField", OrderType.Ascending);

// 降順の場合は
order.SetOrderType(OrderType.Descending);

fieldNameは並べ替えに用いるフィールドの名前、orderTypeは並び順です。

コード例

using SoftGear.Strix.Client.Core.Model.Manager.Filter.Builder;
using SoftGear.Strix.Unity.Runtime;
using UnityEngine;

public class StrixSearchRoomExample : MonoBehaviour
{
    void Start()
    {
        var strixNetwork = StrixNetwork.instance;

        // これは仮の値です。実際のアプリケーションIDに変更してください
        // Strix Cloudのアプリケーション情報タブにあります: https://www.strixcloud.net/app/applist
        strixNetwork.applicationId = "00000000-0000-0000-0000-000000000000";

        // まずマスターサーバーに接続します
        strixNetwork.ConnectMasterServer(
            // これは仮の値です。実際のマスターホスト名に変更してください。
            // Strix Cloudのアプリケーション情報タブにあります: https://www.strixcloud.net/app/applist
            host: "000000000000000000000000.game.strixcloud.net",
            connectEventHandler: _ => {
                Debug.Log("Connection established.");

                // マスターサーバーに接続した後でルームを作成できます
                strixNetwork.CreateRoom(
                    new RoomProperties { name = "My Game Room" },
                    new RoomMemberProperties { name = "My Player Name" },
                    handler: __ => {
                        Debug.Log("Room 1 created.");

                        // ルームを作成したので、名前で見つけることができるかどうか試してみましょう
                        strixNetwork.SearchRoom(
                            condition: ConditionBuilder.Builder().Field("name").EqualTo("My Game Room").Build(),  // 「My Game Room」という名前のすべての部屋を検索します
                            limit: 10,                                                                            // 結果を10件のみ取得します
                            offset: 0,                                                                            // 結果を先頭から取得します
                            handler: searchResults => {
                                Debug.Log(searchResults.roomInfoCollection.Count + " rooms found.");

                                // 検索が終わったら、見つかった全てのルームに関する情報を出力します
                                foreach (var roomInfo in searchResults.roomInfoCollection)
                                    Debug.Log("Room ID: " + roomInfo.id
                                        + "\nHost: " + roomInfo.host
                                        + "\nMember count: " + roomInfo.memberCount
                                        + "\nCapacity: " + roomInfo.capacity
                                    );
                            },
                            failureHandler: searchError => Debug.LogError("Search failed. Reason: " + searchError.cause));
                    },
                    failureHandler: createRoomError => Debug.LogError("Could not create room. Reason: " + createRoomError.cause)
                );
            },
            errorEventHandler: connectError => Debug.LogError("Connection failed. Reason: " + connectError.cause)
        );
    }
}

注釈

applicationIdhostの仮の値を、忘れずにStrix Cloudのアプリケーション情報タブにある実際の値に変更してください。