서버 전송 구조

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

질문입니다.

한번 게임이 끝날 때
Backend.Match.MatchEnd(matchGameResult);
이 함수만 호출하면 뒤끝 매치가 종료되나요?

문제 상황

게임 종료 함수를 호출하고 다시 매칭을 찾고 시작 하면
SceneManager.LoadScene("loadseen"); 호출
서버에 정보 전달이 안 됩니다.

오류는 안 뜹니다.

안녕하세요 개발자님,
매치 게임 종료에 따라 결과 메시지를 전송하는
Backend.Match.MatchEnd(matchGameResult); 함수를 호출하는 경우,
결과를 서버로 전송하게되며, 결과 종합이 완료되는 경우
OnMatchResult(게임 결과) 이벤트와 OnLeaveInGameServer(인게임 서버 접속 종료) 이벤트가 함께 호출됩니다.

이후 다시 인게임 서버에 접속하며 매칭 과정을 진행해 게임을 진행해주셔야 하는데요,
최종적으로 OnMatchInGameStart (게임 시작) 이벤트가 호출된 이후에 데이터 전송이 가능합니다.

좋아요 1

Backend.Match.OnMatchRelay += (MatchRelayEventArgs args) =>
는 호출이 됩니다만,
args.From.IsRemote == false 이 값이 True 가 누구든 나옵니다.

추가 문의하신 내용은 확인 중에 있습니다.
다소 시간이 소요되고 있는 점 양해 부탁드립니다.

좋아요 1

기다려주셔서 감사합니다.
IsRemote는 채팅 혹은 매칭 인게임 접속 시에 자신의 세션인지 확인하는 기능이며,
OnMatchRelay에서는 args.From.SessionId == myPlayerIndex 와 같이 자신의 세션 아이디를 캐싱하여 전송자가 자신인지 다른 유저인지 판별해야합니다.
참고하여 이용 부탁드립니다.

좋아요 1

myPlayerIndex 는 어느 함수에서 가져와야 하나요?

        Backend.Match.OnSessionListInServer = (MatchInGameSessionListEventArgs args) => {
            

            for (int i = 0; i < args.GameRecords.Count; i++)
            {
                print(args.GameRecords[i].m_sessionId + " 1");

                print(args.GameRecords[i].m_nickname);
                if (args.GameRecords[i].m_isSuperGamer)
                {
                    if (Backend.UserNickName == args.GameRecords[i].m_nickname) //나
                    {
                        _dataBase.superGamer = true;
                        _dataBase.m_sessionId1 = args.GameRecords[i].m_sessionId;
                        print(_dataBase.m_sessionId1);
                        print(_dataBase.m_sessionId2);
                    }
                    else//다른 사람
                    {
                        _dataBase.m_sessionId2 = args.GameRecords[i].m_sessionId;
                        _dataBase.you_name = args.GameRecords[i].m_nickname;
                    }

                    //자신이 슈퍼게이머인지 확인
                    //이 사람이 나인지 확인
                    //상대라면 2에 저장
                        
                }
                if (Backend.UserNickName != args.GameRecords[i].m_nickname) //나
                {
                    _dataBase.m_sessionId2 = args.GameRecords[i].m_sessionId;
                }

            }
        };

이거랑

Backend.Match.OnMatchInGameAccess = (MatchInGameSessionEventArgs args) => {

            if (Backend.UserNickName == args.GameRecord.m_nickname&&_dataBase.superGamer)
            {
                _dataBase.m_sessionId1 = args.GameRecord.m_sessionId;
            }
            if ((Backend.UserNickName != args.GameRecord.m_nickname && _dataBase.superGamer))
            {
                _dataBase.m_sessionId2 = args.GameRecord.m_sessionId;

            }
            if (Backend.UserNickName != args.GameRecord.m_nickname)
            {
                _dataBase.you_name = args.GameRecord.m_nickname;
                print($"상대의 이름은 {args.GameRecord.m_nickname}");
            }///////////////////////////////////////////////////////////////////////////////////
        };

이 코드를 이용하여 플레이어의 세션 ID와 플레이어 이름을 얻습니다.

이렇게 하는 게 맞나요?

그리고 hmim님이 말해주셨던 myPlayerIndex 의 값을 이 부분에서 얻는 건가요?

이렇게 했을 때 플레이어의 이름과 세션 ID를 못불러오는 경우도 있습니다.

개발자님, 아래의 코드를 참고하여 확인해 주시면 감사드리겠습니다.

Backend.Match.OnSessionListInServer = (MatchInGameSessionListEventArgs args) => {
            

            for (int i = 0; i < args.GameRecords.Count; i++)
            {
                if(Backend.Match.IsMySessionId(args.GameRecords[i].m_sessionId)) {
                    myPlayerIndex = args.GameRecords[i].m_sessionId;
                }
            }
}
좋아요 1

예제 코드 감사합니다.

image

IsMySessionId에서 빨간 줄이 떠요 ㅠㅠ
image

개발자님, 아래의 코드 참고 부탁드립니다.

if(Backend.Match.GetMySessionId() == args.GameRecords[i].m_sessionId)) {
myPlayerIndex = args.GameRecords[i].m_sessionId;
}
좋아요 1

보내주신 코드를 보며 저의 코드를 대부분 수정하는 데 시간이 오래 걸렸습니다… ㅠ.ㅠ

서버에서 받아온 정보가 자신의 것인지 확인하는 부분은 완벽하게 된 것 같습니다.!

테스트하던 어느 날 갑자기 P1에서 2개의 정보가(나의 정보, 상대의 정보) 와야 하는데 상대의 정보를 못 가져오는 경우가 생겼습니다…
(P2는 잘 2개의 정보가 잘 받아집니다)보내는 부분은 잘 호출이 되었고, 받는 부분이 이상한 것 같습니다.
콘솔 창에 뜨는 오류는 따로 없었습니다.

그리고 OnMatchInGameAccess 의 ErrInfo가 Success가 뜨지만 GameRecord는 Null입니다
image

추가로 버전 때문에(SDK - 5.12.1) 생기는 문제일 수도 있다고 생각하여 버전을 바꿔서(SDK - 5.11.9) 실했했을때 RequestMatchMaking이 부분에서 잘못된 값이 변환됩니다.


Debug.Log("OnMatchMakingResponse : " + args.ErrInfo + " : " + args.Reason);
OnMatchMakingResponse : Exception : Invalid match making. status code: 404, reason: 404 page not found

예제 게임에서도 같은 오류가 뜹니다.

답변 부탁드립니다. 감사합니다…

안녕하세요 개발자님,
게임 서버로의 무작위 공격 방어를 위해 네트워크 규칙을 강화 과정에서
네트워크 연결 문제 발생을 확인하여 조치하였습니다.
이용에 불편을 드려 죄송합니다.

좋아요 1

저번 댓글에 문의 했던

이 문제를 해결했습니다~~! ^_^

뒤끝 베이스 버전이 5.12.0버전 이상부터 이러한 현상이 생깁니다.

SDK 버전을 5.11.9버전으로 실행을 하면 위의 문제가 해결됩니다.

이러한 문제를 해결 해주세요.

감사합니다.

답변 부탁 드립니다.

안녕하세요 개발자님.

해당 오류의 원인이 확인되어 다음 버전에서 수정될 예정입니다.
이용에 불편을 드려 죄송합니다.

좋아요 1