매치메이킹 규칙
규칙은 목표를 달성하기 위한 논리적 동작을 설명하는 일반적인 방법입니다. 규칙은 매치 수준과 팀 수준의 매치메이킹 로직에 적용됩니다. 매치 수준 규칙은 규칙이 정의된 매치의 유효성을 확인하며, 팀 수준 규칙은 규칙이 정의된 팀의 유효성을 확인합니다.
규칙 포맷
{
"Type": "RuleType",
"Source": "SourcePath",
"Not": true/false,
"EnableRule": true/false,
"Relaxations": [
{
Relaxation1,
Relaxation2
}
]
}
필드 | 필수 여부 | 유형 | 설명 |
---|---|---|---|
Type | 예 | 문자열 | 적용할 규칙입니다. 아래의 지원되는 규칙 표를 참고하십시오. |
Source | 예 | 문자열 | 데이터 소스 경로입니다. 지원되는 데이터 소스를 참조하십시오. |
레퍼런스 | 아니요 | 문자열, 숫자 또는 배열* | 비교할 레퍼런스입니다. 모든 규칙에서 사용되지 않습니다. *유효한 레퍼런스 유형은 규칙 유형에 따라 다릅니다. |
Not | 아니요 | 부울 | true로 설정하면 규칙을 반대로 적용합니다. 지정하지 않으면 false입니다. |
EnableRule | 아니요 | 부울 | false로 설정하면 규칙을 비활성화합니다. 지정하지 않으면 true입니다. 일반적으로 완화를 통해 규칙을 비활성화하거나 활성화할 때 사용됩니다. |
Relaxations | 아니요 | 목록<완화> | 적용할 완화 목록입니다. 규칙 완화와 트리거를 참고하십시오. |
지원되는 규칙
규칙 | 입력 | 설명 |
---|---|---|
Difference | 소스: List 레퍼런스: 숫자 | 목록 내 모든 값의 차이가 일정 범위 안에 있어야 합니다. |
Equality | 소스: List 레퍼런스: 문자열 또는 숫자* | 목록 내의 모든 값이 동일해야 합니다. *레퍼런스는 소스에 정의된 입력 유형입니다. |
LessThan | 소스: 숫자 레퍼런스: 숫자 | 소스 값이 레퍼런스 값보다 작아야 합니다. |
LessThanEqual | 소스: 숫자 레퍼런스: 숫자 | 소스 값이 레퍼런스 값보다 작거나 같아야 합니다. |
GreaterThan | 소스: 숫자 레퍼런스: 숫자 | 소스 값이 레퍼런스 값보다 커야 합니다. |
GreaterThanEqual | 소스: 숫자 레퍼런스: 숫자 | 소스 값이 레퍼런스 값보다 크거나 같아야 합니다. |
InList | 소스: 문자열 또는 숫자 레퍼런스: List | 소스 값이 레퍼런스 목록에 있어야 합니다. *레퍼런스는 소스에 정의된 입력 유형입니다. |
Intersection | 소스: List<List> 오버랩: 숫자 | 주어진 여러 목록으로 구성된 하나의 목록에 적어도 입력한 오버랩 숫자 이상의 교차가 있어야 합니다. |
지원되는 데이터 소스
모든 플레이어의 데이터
티켓에 속한 각 플레이어가 정의한 커스텀 데이터는 Players.CustomData.{your_custom_field_name}
을 사용하는 규칙으로 액세스할 수 있습니다. 이러한 커스텀 정의 데이터는 클라이언트가 티켓을 생성할 때 티켓에 추가됩니다. 티켓을 생성하는 방법을 알아보려면 티켓 생성을 참고하십시오.
모든 플레이어의 QoS
티켓 내 각 플레이어의 QoS(서비스 품질) 데이터는 Players.QoSResults.Latency
와 Players.QoSResults.PacketLoss
를 사용하는 규칙으로 액세스할 수 있습니다. QoS를 참조하십시오.
Leaderboards
서버 권한이 있는 매치메이킹은 **Unity Leaderboards**와의 연동을 통해 지원됩니다.
각 플레이어의 리더보드 데이터는 Players.CustomData.ExternalData.Leaderboard.Score
와 Players.CustomData.ExternalData.Leaderboard.Tier
를 사용하는 규칙으로 액세스할 수 있습니다. 이 데이터 소스를 선택하면, 대상 리더보드의 Id
를 포함하는 추가적인 ExternalData
오브젝트를 정의해야 합니다.
"ExternalData": {
"Leaderboard": {
"Id": "my-leaderboard"
}
}
사용 가능한 모든 리더보드 데이터는 자동으로 수신 티켓에 추가되고, 정의된 규칙에 따라 고려됩니다. 플레이어가 정의된 리더보드에 대한 데이터를 가지고 있지 않은 경우, 이 플레이어는 0점으로 이 리더보드에 추가됩니다.
단계가 활성화되지 않은 리더보드는 단계를 사용하는 규칙과 호환되지 않습니다. 이 풀에 할당된 모든 티켓은 매칭에 실패합니다.
Cloud Save
서버 권한이 있는 매치메이킹도 **Unity Cloud Save**와의 연동을 통해 지원됩니다.
각 플레이어의 Cloud Save 데이터는 Players.CustomData.ExternalData.CloudSave.{cloud_save_data_path}
를 사용하는 규칙으로 액세스할 수 있습니다. {cloud_save_data_path}
는 규칙에서 사용될 값을 가져오기 위한 마침표로 구분된 경로입니다. 데이터 경로의 첫 번째 섹션은 해당 키에서 Cloud Save 아이템을 검색합니다. 데이터 경로의 나머지 섹션은 검색된 아이템을 탐색하는 데 사용됩니다.
Cloud Save 키 | Cloud Save 아이템 | 데이터 경로 | 검색된 값 |
---|---|---|---|
기술 | 500 | 기술 | 500 |
맵 | ["desert", "sea"] | 맵 | ["desert", "sea"] |
인벤토리 | { "Apples": 10, "Bottles": 3 } | Inventory.Apples | 10 |
Cloud Save 데이터 소스를 선택하면, 해당 동작을 구성하기 위해 선택적인 ExternalData
오브젝트를 정의할 수 있습니다.
"ExternalData": {
"CloudSave": {
"AccessClass": "Protected",
"Default": 0
}
}
액세스 클래스는 플레이어 데이터를 어디에서 가져올지 지정합니다. 동일한 키에 각 액세스 클래스마다 다른 아이템이 저장될 수 있습니다. 액세스 클래스가 제공되지 않으면 기본적으로 Protected
로 설정됩니다.
기본값도 정의할 수 있습니다. 이 기본값은 지정된 데이터 경로에 플레이어의 Cloud Save 아이템이 없을 때 사용됩니다. 기본값의 데이터 유형은 정의된 규칙과 호환되어야 합니다. 예를 들어, 레퍼런스 데이터 유형이 숫자인 Equality 규칙은 기본값 데이터 유형의 숫자만 허용하는 반면, 레퍼런스 데이터 유형이 ‘목록<문자열>’인 InList 규칙은 기본값 데이터 유형의 문자열만 허용합니다.
사용 가능한 모든 Cloud Save 데이터는 자동으로 수신 티켓에 추가되며, 정의된 규칙에 따라 고려됩니다. 플레이어가 정의된 Cloud Save 데이터 경로에 대한 데이터를 가지고 있지 않고 기본값이 지정되지 않은 경우, 해당 티켓은 규칙 정의와 호환되지 않습니다.
지원되는 데이터 연산
매치메이킹 티켓의 플레이어 커스텀 데이터에 제공된 입력 중에서 일부는 규칙을 생성하기 위해 연산을 지원합니다.
연산 | 입력 | 출력 | 설명 |
---|---|---|---|
Count | List<*> | 숫자 | 주어진 목록 내 요소의 개수를 가져옵니다. *모든 유형이 유효합니다. 예를 들어 문자열이나 부울, 목록, 숫자를 사용할 수 있습니다. |
Median | List | 숫자 | 주어진 목록 내 숫자의 중간값을 가져옵니다. |
Avg | List | 숫자 | 주어진 목록 내 숫자의 평균값을 가져옵니다. |
Sum | List | 숫자 | 주어진 목록 내 숫자의 합을 가져옵니다. |
Min | List | 숫자 | 주어진 목록 내 숫자 중 가장 작은 수를 가져옵니다. |
Max | List | 숫자 | 주어진 목록 내 숫자 중 가장 큰 수를 가져옵니다. |
예시
다음은 Skill 필드에 액세스하는 예시입니다.
{ ..."Source": "Players.CustomData.Skill"... }
다음은 매치/팀 내 모든 플레이어의 스킬 평균을 구하는 예시입니다.
{ ..."Source": "Players.CustomData.Skill.Avg"... }
지원되는 규칙의 예시
Difference
다음 예시에서는 규칙이 적용되는 대상(매치 수준 또는 팀 수준)에 따라 매치나 팀에 속한 모든 플레이어 간의 스킬 포인트 차이가 200을 초과할 수 없습니다.
{
"Type": "Difference",
"Source": "Players.CustomData.Skill",
"Reference": 200 // Valid types: number
}
Equality
다음 예시에서는 팀 수준에 적용되는 규칙에 따라 Monster 팀의 모든 플레이어가 이 팀을 선택했어야 합니다.
{
"Type": "Equality",
"Source": "Players.CustomData.SelectedTeam",
"Reference": "Monster" // Valid types: string or number
}
다음 예시에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어의 비밀번호가 동일해야 합니다.
{
"Type": "Equality",
"Source": "Players.CustomData.Password"
}
다음 예시에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어의 스킬 등급이 동일해야 합니다.
{
"Type": "Equality",
"Source": "Players.Custom.SkillBracket"
}
LessThanEqual
다음 예시에서는 팀 수준에 적용되는 규칙에 따라 각 팀에 최대 두 명의 의무병이 있을 수 있습니다.
{
"Type": "LessThanEqual",
"Source": "Players.CustomData.PreferMedic.Count",
"Reference": 2 // Valid types: number
}
GreaterThanEqual
다음 예시에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어의 스킬이 500 이상이어야 합니다.
{
"Type": "GreaterThanEqual",
"Source": "Players.CustomData.Skill",
"Reference": 500 // Valid types: number
}
InList
다음 예시에서는 팀 수준에 적용되는 규칙에 따라 Monster 캐릭터를 선택한 경우 플레이어는 Monster 팀에 배치되어야 합니다.
{
"Type": "InList",
"Source": "Players.CustomData.ChosenCharacter",
"Reference": [ "Monster1", "Monster2", "Monster3" ] // Valid types: List<string> or List<number>
}
Intersection
다음 예시에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어가 공통으로 선호하는 맵이 적어도 3개 있어야 합니다.
{
"Type": "Intersection",
"Source": "Players.CustomData.PreferredMaps",
"Overlap": 3
}
다음 예제에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어가 레퍼런스 목록에 있는 아이템 중 하나 이상을 보유해야 합니다.
{
"Type": "Intersection",
"Source": "Players.CustomData.Items",
"Overlap": 1,
"Reference": [ "PluePill", "RedPill" ] // Valid types: List<string> or List<number>
}
리더보드
다음 예제에서는 팀 수준에 적용되는 규칙에 따라 팀 내 모든 플레이어의 리더보드 점수가 300 이하여야 합니다.
"TeamRules": [
{
"Name": "Score",
"Type": "Difference",
"Source": "Players.CustomData.ExternalData.Leaderboard.Score",
"ExternalData": {
"Leaderboard": {
"Id": "my-leaderboard"
}
},
"Reference": 300,
"Not": false,
"EnableRule": true
}
]
다음 예제에서는 매치 수준에 적용되는 규칙에 따라 매치 내 모든 플레이어가 동일한 리더보드 단계에 있어야 합니다.
"MatchRules": [
{
"Name": "Tier",
"Type": "Equality",
"Source": "Players.CustomData.ExternalData.Leaderboard.Tier",
"ExternalData": {
"Leaderboard": {
"Id": "my-leaderboard"
}
},
"Not": false,
"EnableRule": true
}
]
Cloud Save
다음 예제에서는 팀 수준에 적용되는 규칙에 따라 팀 내 모든 플레이어가 잠금 해제된 맵을 하나 이상 보유해야 합니다. 플레이어가 Cloud Save에 Maps
키를 가진 아이템이 없다면 매치메이킹을 위해 ["starter"]
값이 할당됩니다. 이 값은 Cloud Save에 저장되지 않습니다.
"TeamRules": [
{
"Name": "Unlocked Maps",
"Type": "Intersection",
"Source": "Players.CustomData.ExternalData.CloudSave.Maps.Unlocked",
"ExternalData": {
"CloudSave": {
"AccessClass": "Protected",
"Default": ["starter"]
}
},
"Not": false,
"EnableRule": true,
"Overlap": 1
}
]