뒤끝매칭 비호스트 이동 문제 문의드립니다

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

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

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

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

안녕하세요
1:1매칭을 제작중이고 뒤끝 샘플 프로젝트를 베이스로 작업중입니다 (구조는 거의 그대로 했습니다)
문제는 매칭 후 이동 동기화 과정에서 다음과 같은 문제가 있습니다

호스트 이동시 → 비호스트 기기에서 호스트의 이동 성공
비호스트 이동시 → 호스트 기기에서 비호스트의 이동 실패

로그를 찍이보며 확인 중인데,
제일 의심 가는 부분이 월드매니저에서 플레이어 초기화 셋팅 부분에서
저는 Player 와 Enemy 프리팹을 다르게 가져와야 해서 다음과 같이 바꿨습니다

foreach (var sessionId in gamers)
        {
            // 1. 호스트인 경우
            if (BackEndMatchManager.GetInstance().IsHost())
            {
                // A. Player 캐릭터
                if (BackEndMatchManager.GetInstance().IsMySessionId(sessionId))
                {
                    int index = 0;

                    GameObject player = Instantiate(playerPrefeb, new Vector3(statringPoints[index].x, statringPoints[index].y, statringPoints[index].z), Quaternion.identity, playerPool.transform);
                    players.Add(sessionId, player.GetComponent<PlayerController>());

                    myPlayerIndex = sessionId;

                    players[sessionId].Initialize(true, myPlayerIndex, BackEndMatchManager.GetInstance().GetNickNameBySessionId(sessionId));
                    players[sessionId]._isWorldManagerReceiveHost = true;
                }

                // B. Enemy 캐릭터
                else
                {
                    int index = 1;

                    GameObject player = Instantiate(EnemyPrefeb, new Vector3(statringPoints[index].x, statringPoints[index].y, statringPoints[index].z), Quaternion.identity, playerPool.transform);
                    players.Add(sessionId, player.GetComponent<PlayerController>());

                    players[sessionId].Initialize(false, sessionId, BackEndMatchManager.GetInstance().GetNickNameBySessionId(sessionId));
                    players[sessionId]._isWorldManagerReceiveHost = false;
                }
            }

            // 2. 호스트 X
            else
            {
                // A. Enemy 캐릭터
                if (BackEndMatchManager.GetInstance().IsMySessionId(sessionId))
                {
                    int index = 1;

                    GameObject player = Instantiate(EnemyPrefeb, new Vector3(statringPoints[index].x, statringPoints[index].y, statringPoints[index].z), Quaternion.identity, playerPool.transform);
                    players.Add(sessionId, player.GetComponent<PlayerController>());

                    myPlayerIndex = sessionId;

                    players[sessionId].Initialize(true, myPlayerIndex, BackEndMatchManager.GetInstance().GetNickNameBySessionId(sessionId));
                    players[sessionId]._isWorldManagerReceiveHost = true;

                }

                // B. Player 캐릭터
                else
                {
                    int index = 0;

                    GameObject player = Instantiate(playerPrefeb, new Vector3(statringPoints[index].x, statringPoints[index].y, statringPoints[index].z), Quaternion.identity, playerPool.transform);
                    players.Add(sessionId, player.GetComponent<PlayerController>());

                    players[sessionId].Initialize(false, sessionId, BackEndMatchManager.GetInstance().GetNickNameBySessionId(sessionId));
                    players[sessionId]._isWorldManagerReceiveHost = false;

                }
            }

이렇게 작업했고, Player 와 Enemy 프리팹이 양 기기에서 동일한 위치에 잘 배치는 됩니다만
말씀드린대로 비호스트(Enemy) 캐릭터의 이동시 호스트 기기에서 비호스트 캐릭터가 움직이지를 않습니다

  1. 어떤걸 체크해봐야 할까요?
  2. BackEndMatchManager.GetInstance().IsMySessionId <-해당 id 는 매칭 당 1개씩인가요?
  3. if (BackEndMatchManager.GetInstance().IsMySessionId(sessionId)) ← 이 조건을 체크하는 이유가 궁금합니다

추가로
비호스트 기기에서 Enemy 캐릭터 이동시
BackEndMatchManager.GetInstance().SendDataToInGame(msg);
해당 메세지 전송은 정상적으로 되는걸로 확인됩니다만

비호스트 기기의 월드매니저에서
if (BackEndMatchManager.GetInstance().IsHost() != true && args.From.SessionId == myPlayerIndex)
{
return;
}
여기서 걸려서 진행되지가 않습니다

로그 찍으며 확인중인데

비호스트 기기의 월드매니저에서

public bool IsMyPlayerMove()
{
return players[myPlayerIndex].isMove;
}

해당 호출을 하는 대상이 myPlayerIndex 을 전달받은 EnemyPrefeb 이 아니고
playerPrefeb 을 호출하고 있네요.ㅠ

만약 EnemyPrefeb 과 myPlayerIndex 의 값을 로그해봤을 때 123 으로 나오고
playerPrefeb에서 456 으로 나온다고 하면

if (BackEndMatchManager.GetInstance().IsHost() != true && args.From.SessionId == myPlayerIndex)
{

여기 부분을 EnemyPrefeb 이 통과화는게 아니라 playerPrefeb 이 통과되는걸로 확인됐습니다.

안녕하세요 개발자님,
뒤끝매치 예제 게임의 경우,
비호스트는 자신의 클라이언트에서 발생한 조작 조차도 바로 적용하지 않고,
호스트에게 보낸 후에 호스트가 가공하여 값을 다시 보내주어야 자신의 클라이언트에서 행동합니다.

따라서 호스트가 아닌 모든 클라이언트들은 호스트가 준 패킷에 의해서만 동작하게 됩니다.

세션 아이디는 매칭당 하나씩 이지만, 유저가 게임을 나간 후 재접속을 하였을 때에는 달라질 수 있습니다.
세션 아이디를 계속 체크하는 이유는 자신이 보낸 패킷 또한 응답 핸들러를 통해 받기 떄문에,
호스트가 보낸 값 외에는 전부 행동하지 않기 위함입니다. :D

뎃글달아주셔서 감사합니다!
혹시 위의 상황에서

비호스트 기기에서 비호스트 캐릭터의 이동 → 호스트 기기에서 비호스트의 기기가 이동되지 않는 문제가 발생중인데
어떤 내용을 체크해봐야할까요?ㅠㅜ

안내드린것과 같이 호스트가 모든 요청을 처리하게 되는데,
호스트가 비호스트 캐릭터의 이동을 인지하지 못한다면 비호스트에게서 패킷을 정상적으로 수신하여 처리하고 있는지 확인해 주세요.

빠른 답변 감사합니다.ㅠㅜ 막막했는데 말씀주신 내용 위주로 확인해보겠습니다.