인프런 커뮤니티 질문&답변

ChaYong님의 프로필 이미지
ChaYong

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)

DummyClient #3

화살이 안사라지는 증상과 관련하여 하나 여쭙고 싶습니다.ㅜㅜ

해결된 질문

작성

·

367

2

영상을 찍고 많은 정보를 알려주신 루키스님 너무나 감사합니다.

루키스님의 영상을 열심히 보며 MMORPG에 대해서 하나씩 하나씩 배워나가고 있습니다.

그런데 아직 버그를 잡는 능력이 미숙하여 도무지 해결방법을 못찾기에 도움을 요청드리고자 합니다.

우선 루키스님의 강좌를 보시면 똑같이 따라서 프로젝트를 만들면서 진행 중 화살이 사라지지 않는 버그가 나타났습니다. ㅠㅠ

제가 분명 뭔가 잘 못따라 했겠거니 생각해서

루키스님이 올려주신 프로젝트를 다운받아서 다시 시도해 보았습니다.

다행이 화살이 잘 사라지는 것 같아서 제가 따라한 코드를 비교해보았는데요.

VisionCube.cs파일의 제일 하단에 

Owner.Room.PushAfter(100, Update);

이 코드줄이 제가 작성한 값과 다른 것을 발견했습니다.

저는 

Owner.Room.PushAfter(500, Update);

이렇게 작성을 하였는데요.

 500이라는 수치를 100으로 낮춰보니 제가 강좌를 따라 작성한 프로젝트에서도 화살이 사라짐을 발견하였습니다.

그런데 가만히 생각해보니, 단순히 시간을 0.1초에서 0.5초로 VisionCube의 Update함수 주기를 약간 늘렸다고해서 화살이 사라지지 않는다는게 뭔가 이상하다고 생각됬습니다.

이번엔 루키스님이 올려주신 예제프로젝트에서 시간값을 0.5초로 늘려보았습니다.

그랬더니 화살이 사라지지 않는 현상이 동일하게 나타났습니다.

그 때부터 하나씩 살펴보면서 어디에서 문제가 있는지 열심히 로그를 남겨보았습니다.

처음에는 클라에서 디스폰패킷을 제대로 받는지부터 확인작업에 들어갔습니다.

아니나 다를까 화살의 디스폰 패킷이 날라왔다가 안날라왔다가 이러는 현상을 발견하게 되어 서버 쪽이 원인으로 생각되었습니다.

서버의 어느 부분에서부터 이런 현상이 일어나는지 찾아보려고 일주일 넘게 머리를 싸맸지만 제 능력으로는 도무지 원인을 알길이 없어서 바쁘신 걸 알지만 어렵게 질문을 드리게 되었습니다.

이것때문에 일주일 내내 가슴에 고구마100개가 박혀있는 느낌을 받다보니 너무나 힘들어 질문을 드립니다. ㅜㅜ 도와주십시요

답변 4

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

그렇군요 ㅎㅎ
강의에서는 다른 오브젝트코드에 얹혀(?)가기 위해 코드를 그렇게 만들었지만
사실 화살이나 마법 투사체 같은 오브젝트는 서버에서 일일히 소멸까지 관리하지 않고,
클라 / 서버 각자 계산을 하는게 일반적입니다.
그래도 버그를 잘 찾아주셨네요!

ChaYong님의 프로필 이미지
ChaYong
질문자

아하!!!!! 루키스님 말씀 듣고보니 대충 땜빵한 저 코드를 앞으로 어떤 식으로 짜야할지 방향이 보입니다 ㅠㅠ 넘나 감사드립니다. 

1

ChaYong님의 프로필 이미지
ChaYong
질문자

ㅜㅜ 말씀해주신 부분을 듣고 다시 차차 코드를 읽어보니

역시나 루키스님 말씀대로 VisionCube에서 디스폰시키는 부분이 문제였습니다.ㅠㅠ

넘나 감사합니다.

문제의 원인을 보니,

VisionCube에서 Update문을 돌면서

디스폰을 하기위해 존에 있는 화살 오브젝트를 긁어와야하는데

Update속도가 느려지면 인접존을 벗어난 화살 오브젝트를 잡아채지 못했고

때문에 VisionCube에서는 플레이어에게 화살디스폰패킷을 날리지 못했던 것이었습니다.

 

화살 Update문에

 if ((CellPos - Owner.CellPos).magnitude > GameRoom.VisionCells)

{

        S_Despawn despawnPacket = new S_Despawn();

        despawnPacket.ObjectIds.Add(Id);

        Owner.Session.Send(despawnPacket);

        ((Player)Owner).Session.Send(despawnPacket);

 }

이처럼 화살의 주인님과 거리를 체크하여 시야범위를 벗어나면 

주인님에게 디스폰 패킷을 날리도록 만들어서 해당문제를 임시로 해결했습니다.

루키스님 덕택에 진짜 속시원히~~ 해결하고 갑니다. 

정말 정말 감사합니다.^^

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

음~ 이 부분은 저도 답변 알기 힘듭니다.
이런 100% 재현이 아닌 타이밍 류의 버그는
원래 찾기가 어렵고 오래 걸리는게 맞습니다.
저라고 물론 예외가 아니고, 각 잡고 몇 시간 정도 디버깅을 해봐야 찾을 수 있을 것으로 보이는데,
당장은 그 정도로 우선순위가 높은 버그는 아니라고 판단됩니다.
그리고 와우나 테라같은 큰 규모의 게임에서 근무하면,
놀랍게도 해결되지 않은 이런 자잘한 컨텐츠 버그가 몇백개씩 쌓여 있습니다.

우선 예상으로는..
Owner.Room.PushAfter(500, Update);
VisionCube를 천천히 Update할 때 더 빈번하게 발생하는 타이밍 문제라면,
VisionCube 관련된 버그로 예상이 되긴 하는데요.
현재 코드는 이전 상태 / 현재 상태를 비교해서 사라진 물체를 Despawn시키는데
이 부분에서 놓친 부분이 없는지 고민이 필요할 것 같습니다.
그런데 의외로 Room의 JobSerializer 쪽의 버그일 수도 있습니다.

먼 기억을 되살려보면 연초에 강의 코드 기반으로
간단한 샘플 게임을 만들어서 출시를 해봤는데,
비슷하게 물체가 사라지지 않는 버그가 있었고
JobSerializer쪽 정책을 수정하다가 알아서 치유된 기억이 있긴 합니다.

0

ChaYong님의 프로필 이미지
ChaYong
질문자

헛! 그렇군요. 

그렇다면 루키스님이 내주신 연습문제라고 생각하고 말씀해주신 부분부터 차근차근 파보겠습니다^^

바쁘신 와중에도 정성스런 답변을 해주셔서 정말 정말 감사합니다.^^

좋은 하루 되세요.~

ChaYong님의 프로필 이미지
ChaYong

작성한 질문수

질문하기