특정 규칙 또는 특정 맵의 방 찾는 방법¶
방마다 현재 게임 맵, 모드, 스테이지 등 여러 가지 매개변수가 있습니다. 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 개체가 만들어집니다.