문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.
- 뒤끝 SDK 버전 :
- 프로젝트명 : 머니게임
- 스테이터스 코드 :
- 에러 코드 :
- 에러 메시지 :
매칭방 생성 하면 간혈적으로 예외가 뜹니다.
매칭서버 잘 들어가있고
게임 시작할 때부터 이 현상이 나타납니다.
2월부터 문의했는데 해결 안되는데 해결 안하시나요??
문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.
매칭방 생성 하면 간혈적으로 예외가 뜹니다.
매칭서버 잘 들어가있고
게임 시작할 때부터 이 현상이 나타납니다.
2월부터 문의했는데 해결 안되는데 해결 안하시나요??
안녕하세요 개발자님,
간헐적으로 서버의 연결이 실패하거나 응답처리가 원활히 이루어지지 않을 수 있습니다.
이러한 경우는 재호출이 이루어지도록 처리해 주시면 감사하겠습니다.
이전 문의에 제공해주신 로직에 대해 한차례 수정된 로직을 제공해드렸는데요,
Not connect와 관련한 내용을 추가하여 수정하였으니 확인하여 이용해 주시면 감사하겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BackEnd;
using BackEnd.Tcp;
using UnityEngine.SceneManagement;
public class BackEndMatch : MonoBehaviour
{
ErrorInfo errorinfo;
[SerializeField]
bool isConnectMatchServer;
string RoomToken;
WaitForSeconds repeatTime = new WaitForSeconds(0.1f);
MatchUserGameRecord MyStartData, EnemyStartData;
[SerializeField]
GameObject WaitStartGame;
AsyncOperation op;
bool isReCreateMatchRoom = false;
private void Awake()
{
{
//WaitStartGame.SetActive(true);
//GameObject.FindWithTag("MyStart").GetComponent<StartProfile>().Init("운영자", 1024, Skin.None);
//GameObject.FindWithTag("EnemyStart").GetComponent<StartProfile>().Init("시", 1402, Skin.None);
}
try//전판 인게임서버에서 나오지 못했을 경우를 대비
{
Backend.Match.LeaveGameServer();
}
catch
{
}
//StartCoroutine(Poller());
Matchready();
Backend.Match.OnMatchMakingRoomCreate = (args) =>
{
Debug.Log("OnMatchMakingRoomCreate : " + args.ErrInfo); // [뒤끝] - 디버깅
print("매칭룸");
};
Backend.Match.OnMatchMakingResponse = (args) =>
{
print(args.ErrInfo);
switch (args.ErrInfo)
{
case ErrorCode.Match_InProgress:
print("매칭 신청 성공");
MatchingEventScript.Instance.MatchMaking();
break;
case ErrorCode.Success:
print("매칭 성공");
JoinInGameServer(args.RoomInfo.m_inGameServerEndPoint.m_address, args.RoomInfo.m_inGameServerEndPoint.m_port);//1단계
RoomToken = args.RoomInfo.m_inGameRoomToken;//인게임 서버접속시 안쓰이고 게임방 입장에 쓰임
break;
case ErrorCode.Match_MatchMakingCanceled:
print("매칭 취소");
MatchingEventScript.Instance.MatchMakingStop();
break;
default:
print(args.ErrInfo);
break;
}
};
void JoinInGameServer(string serverAddress, ushort serverPort) // 임의의 함수
{
bool isReconnect = false;//재접속한건지. 디폴트값은 false
//ErrorInfo errorInfo = null;
if (!Backend.Match.JoinGameServer(serverAddress, serverPort, isReconnect, out ErrorInfo errorInfo))//2단계
StopMatching();
}
Backend.Match.OnSessionJoinInServer = (args) =>
{
if (args.ErrInfo != ErrorInfo.Success)
{
Debug.LogError(args.ErrInfo); // [뒤끝] - 디버깅
}
Backend.Match.JoinGameRoom(RoomToken);//3단계
};
Backend.Match.OnMatchMakingRoomCreate = (args) =>
{
isReCreateMatchRoom = false;
Backend.Match.RequestMatchMaking(MatchType.Random, MatchModeType.OneOnOne, "2022-02-10T04:34:45.143Z");
};
Backend.Match.OnSessionListInServer = (args) =>//겜방 들어가자마자
{
MatchDoor.instance.isClose(true);
op = SceneManager.LoadSceneAsync("Ingame");
op.allowSceneActivation = false;
CharacterFromWeb.Instance.userRecord = new List<MatchUserGameRecord>(args.GameRecords);
foreach (var a in args.GameRecords)
{
print(a.m_sessionId);
}
if (args.GameRecords.Count == CharacterFromWeb.FullCount)
{
CharacterFromWeb.Instance.isLast = true;
print("im last");
CharacterFromWeb.Instance.SetUserCharacters(2);
}
};
Backend.Match.OnMatchInGameAccess = (args) =>//다른애들 들어올 때마다
{
print(args.GameRecord.m_sessionId);
if (!CharacterFromWeb.Instance.userRecord.Exists(x => x.m_nickname == args.GameRecord.m_nickname))//중복시 넣지않음
CharacterFromWeb.Instance.userRecord.Add(args.GameRecord);
};
Backend.Match.OnMatchInGameStart = () =>
{
Debug.Log("OnMatchInGameStart 호출"); // [뒤끝] - 디버깅
op.allowSceneActivation = true;
};
Backend.Match.OnJoinMatchMakingServer = (args) =>
{
if (args.ErrInfo != ErrorInfo.Success)
{
Debug.LogError($"OnJoinMatchMakingServer : {args.ErrInfo}"); // [뒤끝] - 디버깅
}
isConnectMatchServer = true;
print("매칭서버 입장(람다식)");
if (isReCreateMatchRoom)
{
FastMatchMaking();
}
};
Backend.Match.OnLeaveMatchMakingServer = (args) =>
{
if (args.ErrInfo != ErrorInfo.Success)
{
Debug.LogError($"OnLeaveMatchMakingServer : {args.ErrInfo}"); // [뒤끝] - 디버깅
}
isConnectMatchServer = false;
print("매칭서버 퇴장(람다식)");
if (isReCreateMatchRoom)
{
Matchready();
}
};
}
void Poll()
{
Backend.Match.Poll();
}
public void Matchready()
{
if (Backend.Match.JoinMatchMakingServer(out errorinfo))
{
Debug.Log("매칭서버진입성공");
Debug.Log(errorinfo);
}
else
{
Debug.LogError($"에러 : {errorinfo.ToString()}"); // [뒤끝] - 디버깅
Debug.Log(errorinfo);
isReCreateMatchRoom = false;
}
}
public void FastMatchMaking()
{
//if (!isConnectMatchServer)
// Matchready();
try
{
Backend.Match.CreateMatchRoom();
}
catch (System.Exception e)
{
Debug.LogError(e.Message);
ReCreateMatchRoom();
//SceneManager.LoadScene("startscene");
}
}
public void ReCreateMatchRoom()
{
isReCreateMatchRoom = true;
Backend.Match.LeaveMatchMakingServer();
}
public void StopMatching()
{
Backend.Match.CancelMatchMaking();
}
// IEnumerator Poller()
// {
// while (true)
// {
// Backend.Match.Poll();
// //print(Backend.Match.Poll());
// yield return repeatTime;
// }
// }
private void OnDestroy()
{
Backend.Match.LeaveMatchRoom();
}
}
이대로 넣어서 하니까 오류 발생 시 아예 멈춥니다. RECREATING ROOM이 계속 반복되고 계속 오류나서 멈추는거 같은데요. 아무래도 연결상태가 좋지 않을 때마다 발생하는 것 같은데 문제는 그 기준이 너무 까다롭다는 것입니다. 와이파이 풀일때도 어쨋서인지 발생하네요. 해결책을 하루빨리 강구해주시길 바랍니다. 최소한 무슨 오류인지라도 확인하게 해주세요. 무작정 Not Connected.라고 뜨니까 원인 파악이 안되는것ㅅ 아닙니까
원인으로 추정되는 부분을 일부 수정 및 로그파악이 될 수 있도록 SDK를 수정하여 DM을 통해 전달드렸습니다.
다만 서버 통신 불량으로 인해 Not Connected가 발생하는 이슈는 완전히 픽스되는 것은 불가능하며,
이부분은 개발자님께서 예외처리 로직을 통해 보안을 해야하는 점 참고해주시면 감사하겠습니다.
현재로서는 개발자님이 이전에 작성하신 Not Connected가 발생하면 초기화면으로 돌아가 Backend.RequestMatchMaking()부터 호출하는 로직으로 구성하는 것을 추천드립니다.
명쾌한 답변 드리지 못해 죄송합니다.