특정 규칙 또는 특정 맵의 방 찾는 방법

방마다 현재 게임 맵, 모드, 스테이지 등 여러 가지 매개변수가 있습니다. SearchJoinableRoom() 함수와 ICondition 개체를 이용하면 검색 조건에 맞는 방을 찾을 수 있습니다.

다음과 같은 게임 모드와 맵이 있다고 하겠습니다.

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

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

특정 게임 타이틀 고유의 속성이므로 여기서는 커스텀 속성을 이용하여 그것을 표시합니다. 즉 key1으로 GameRule을, key2GameMap을 저장합니다.

방을 (Island 맵에서 DeathMatch 규칙으로) 만들면 다음과 같이 됩니다.

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 검색에서는 field라고 함)과 예상값을 담아 전달하여 검색해야 합니다.

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가 value와 같음(패턴)

NotLike

(이용 불가)

스트링

key가 value와 같지 않음(패턴)

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에 저장되어 있는 것)은 사용할 수 없습니다.

참고

속성의 타입은 검색을 할 때 중요합니다. 자동 타입 전환은 되지 않습니다. 방 속성의 이름과 지정된 타입이 일치하지 않을 경우, 오류는 검출되지 않지만 검색 결과는 사용할 수 없습니다.

예를 들어, 용량이 2가 아닌 방을 찾으려면 다음 조건을 검색 메서드로 보내도 됩니다.

new Equals(new Field("capacity"), new Value(2))

하지만, 실수로 다음과 같이 쓸 경우 작동하지 않습니다.

new  Equals(new Field("capacity"), new Value(2.0))

후자의 조건으로 검색하면 용량이 2인 것을 포함하여 방 목록이 표시됩니다. Strix 조건 시스템에서는 정수값 2와 실수값 2.0을 구분하며, "capacity" 속성의 타입은 정수이므로 검색에서는 용량이 "double 값 2.0"이 아닌 값이 리턴됩니다.

이 페이지에 나와 있는 예시에서 GameRuleGameMap은 이넘이고 key1key2 커스텀 속성은 double 타입입니다. 이 때문에 위 예에서 이넘값은 항상 double이 캐스트됩니다.

이 이넘값 중에서 하나를 Value 구성체 또는 EqualTo(조건 빌더) 같은 메서드로 보낼 때는 각별히 주의해야 합니다. (여러 타입 중에서) 속성별로 intdouble을 가져와야 하는 부담이 있기 때문입니다. 이넘값을 캐스트 없이 여기로 보낼 경우 C# 문법은 이것을 묵시적으로 int로 보내 int 버전을 불러옵니다. 그러면 사용할 수 없는 ICondition 개체가 만들어집니다.