특정 규칙 또는 특정 맵의 방 찾는 방법¶
방마다 현재 게임 맵, 모드, 스테이지 등 여러 가지 매개변수가 있습니다. SearchJoinableRoom() 함수와 ICondition 개체를 이용하면 검색 조건에 맞는 방을 찾을 수 있습니다.
다음과 같은 게임 모드와 맵이 있다고 하겠습니다.
public enum GameRule {
TeamDeathMatch = 0,
DeathMatch,
GroundBattle
}
public enum GameMap {
Island = 0,
Sea,
River
}
특정 게임 타이틀 고유의 속성이므로 여기서는 커스텀 속성을 이용하여 그것을 표시합니다. 즉 key1으로 GameRule을, key2로 GameMap을 저장합니다.
방을 (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"이 아닌 값이 리턴됩니다.
이 페이지에 나와 있는 예시에서 GameRule과 GameMap은 이넘이고 key1과 key2 커스텀 속성은 double 타입입니다. 이 때문에 위 예에서 이넘값은 항상 double이 캐스트됩니다.
이 이넘값 중에서 하나를 Value 구성체 또는 EqualTo(조건 빌더) 같은 메서드로 보낼 때는 각별히 주의해야 합니다. (여러 타입 중에서) 속성별로 int와 double을 가져와야 하는 부담이 있기 때문입니다. 이넘값을 캐스트 없이 여기로 보낼 경우 C# 문법은 이것을 묵시적으로 int로 보내 int 버전을 불러옵니다. 그러면 사용할 수 없는 ICondition 개체가 만들어집니다.