[뒤끝팁] 비동기(로컬) PvP 매칭 시스템 만들기!

안녕하세요, 개발자 여러분!
개발이 필요 없는 게임 서버, 뒤끝입니다.

이전 포스팅에서 PvP 콘텐츠를 제작하는 두 가지 방법을 소개 드렸는데요.
그중에서, 오늘은 비동기(로컬) 방식으로 PvP 콘텐츠를 만드는 방법을 로직과 함께 소개 드립니다.

? 비동기(로컬) PvP 매칭 시스템이란, 다른 유저의 정보를 대입한 AI와 유저 간에
   진행되는 PvP 방식을 말합니다.

   따라서 오늘 소개드리는 PvP 만들기는 뒤끝매치(실시간)를 사용하지 않았습니다!
   클라이언트에서 비동기(로컬)로 구현하는 방법을 준비하였으니 참고 부탁드립니다.

참고 ? [뒤끝팁] 내 게임에 맞는 PvP 콘텐츠는?


“실시간 PvP인데… 실시간 접속 유저가 부족하면…??”

많은 PvP 게임에서 접속자가 적어 실시간 매치가 제대로 이루어지지 않는 문제가 발생합니다. 물론 게임의 기획에 따라 달라지겠지만, 너무 이른 새벽이나 출근시간 이후, 혹은 PvP 콘텐츠를 선호하지 않는 유저가 많은 경우에도 같은 문제가 발생하곤 하는데요.

이러한 문제가 예상될 때에는, 비동기 방식으로 콘텐츠를 제공하는 것을 추천드립니다!


정답은 ‘비동기 PvP 매칭 시스템’ 만들기!

PvP 콘텐츠 기획에 ‘랭킹’이 포함되지 않는 개발자님께서는 (2)번 방법에 주목해 주세요?

비동기 PvP 매칭 시스템 예시
비슷한 스펙의 유저 AI를 불러오는, 비동기 PvP 매칭 시스템(예시)

(1) 뒤끝 랭킹 기능으로 만들기 ?

일반적으로 비동기 PvP 콘텐츠는 랭킹을 이용하여 구현하게 됩니다. 뒤끝의 [랭킹]기능을 이용하면, 손쉽게 매칭 시스템을 구현할 수 있는데요. 다만 이 경우 아래 두 가지의 단점이 존재합니다.

① 모든 유저가 랭킹에 등록되어 있어야만 합니다. 랭킹에 등록되어 있지 않은 유저와는 매칭이 되지 않습니다. 즉, PvP 콘텐츠를 한 번도 진행하지 않은 유저라도, 랭킹에 등록되어야 합니다.

② 랭킹을 기반으로 매칭이 되기 때문에 랭킹 순위 외에 별도의 조건으로 매칭할 수 없습니다.
(*랭킹 항목이 아닌 전투력, HP 등의 수치를 이용하여 매칭을 진행할 수 없습니다.)

일반적으로 PVP 콘텐츠 기획에는 랭킹이 포함되기 때문에 위 두 가지 사항이 큰 문제가 되지는 않습니다. 그러나 기획에 랭킹이 포함되지 않는 PvP 콘텐츠의 경우는, 위 방법으로 구현하기에 적절하지 않습니다.

그렇다면 위 경우에, PvP 콘텐츠를 만들 수 있는 또 다른 방법을 알아볼까요?

(2) 랜덤 조회 기능으로 만들기 ?

뒤끝의 [랜덤 조회] 기능을 활용하면, 꼭 랭킹이 아니더라도 유저를 조회할 수 있습니다. 그리고 이것은 PvP 매칭 시스템 제작에도 적용할 수 있습니다!

해당 방법은 ‘랜덤 조회를 이용한 친구 추천’ 콘텐츠에서 상세한 구현 방법을 다루고 있습니다.
아래 콘텐츠 링크를 공유 드리니, 필요하신 개발자 님께서는 확인해 주세요?

*유저 랜덤 조회 기능으로 만드는 친구 추천 기능 알아보기! ? [뒤끝팁] 친구 추천 기능 만들기!

❤️‍? 랜덤 조회 기능, 랭킹 기능과 어떤 점이 다른가요?

① score가 동일하면 동일한 리턴값이 발생하는 랭킹과는 달리 랜덤 조회 기능은 말 그대로 조건은 맞되 리턴되는 유저는 다르게 리턴이 되는 장점이 있습니다.
② 다만 랭킹과는 별개로 랜덤 조회 테이블을 만들어야되고 스코어가 변화할때마다 랜덤 테이블 또한 수정해야하므로, 추가 함수 로직 존재하는 점, 유의해 주시기 바랍니다.

추가로, 랜덤 조회를 잘 활용하면 친구를 추천하는 것이 아닌 원하는 점수의 대전할 상대를 추천하고 자동으로 수락하는 형태의 PvP 콘텐츠도 충분히 구현 가능할 것입니다!

필요한 대로 이리저리 활용해 보시기를 추천드립니다.

*유저 랜덤 조회 기능으로 만들 수 있는 다른 콘텐츠 살펴보기! ? [뒤끝팁] 길드 추천 기능 만들기!


비동기 PvP 매칭 시스템 로직

[유저 랜덤 조회] 기능을 활용하여 PvP 매칭 시스템을 제작하는 로직은 다음과 같습니다.

① PVP 기획에서 유저 검색에 필요한 숫자형 데이터를 추가
예시) 유저 전투력, 유저 레벨

② 유저의 게임 정보에 위에서 기획한 데이터 삽입
& 게임 정보가 갱신될 때마다, 해당 데이터 또한 계속 갱신
예시) 승리/패배 후 전투력 변동, 유저 레벨 업

③ PvP 매칭 시, 위 데이터 중 한 개를 이용하여 랜덤으로 유저 조회

아래는 메타데이터를 이용하여 유저를 랜덤하게 조회하는 간단한 수도 코드입니다.

복사 후 프로젝트에 바로 붙여 넣을 경우 정상적으로 동작하지 않을 수 있고, 모든 로직이 동기식으로 작성되었기 때문에 비동기로 수정이 필요할 수 있습니다.

개발자님의 게임에 맞게 수정하여 사용해 주세요 🙂

int searchRange = 1000;

void UserRandomMatch()
{
  //검색할 테이블과 컬럼명
  string tableName = "PVPData";
  string columnName = "pvpPower";
	// PVPData 테이블의 내 데이터 가져오기
	var bro = Backend.GameData.GetMyData(tableName,new Where());
	if(bro.IsSuccess() == false)
	{
		// 요청 실패 처리
		return;
	}
	
  //해당 데이터의 pvpPower라는 유저의 pvp전투력을 가져오기
	int myPvpPower = (int)bro.FlattenRows()[0][columnName];
  
  //
	bro = Backend.Social.GetRandomUserInfo(tableName, columnName, searchRange, 10);
	if(bro.IsSuccess() == false)
	{
		// 요청 실패 처리
		return;
	}
  if(bro.FlattenRows().Count <= 0)
  {
    // 검색되는 범위를 늘린 후 다시 함수를 호출하도록 설정
    if(searchRange > 2000)
    {
      searchRange += 200;
    }
    return;
  }
	
	// 매칭된 10개의 유저를 UI적으로 표현하여 유저가 PVP을 치룰 다른 유저를 고르도록 하거나
	foreach(JsonData data in bro.FlattenRows())
  {
    Debug.Log("닉네임 : " + data["nickname"].ToString());
    Debug.Log("전투력 : " + data["pvpPower"].ToString());
    Debug.Log("Indate : " + data["inDate"].ToString());
  }
	// 리턴된  중 1개를 다시 랜덤하게 선택해 PVP 시작하기.
  /*
  int max = bro.FlattenRows().Count;
  int randomUser = Random.Range(0,max);
  string EnemyUserIndate = bro.FlattenRows()[randomUser]["inDate"].ToString();
  */
}

* 위 방식을 참고하여 길드 랜덤 조회 기능을 활용하면, 길드전 PVP 매칭 시스템 또한 제작할 수 있답니다!

아래 개발자 문서를 참고하여 함수의 사용방법과 리턴 값을 참고해 주세요.

? 메타데이터로 길드 랜덤 조회
? 게임 정보로 유저 랜덤 조회

뒤끝으로 비동기(로컬) PvP 매칭 시스템 만들기, 성공!?

포스팅을 읽고난 후, 궁금한 부분은 언제든 댓글로 알려주세요.
감사합니다?

1

댓글