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

김지수님의 프로필 이미지
김지수

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

MyPlayer 분리

player의 이동에 대하여..

작성

·

356

0

안녕하세요!! 언제나 고생많으십니다.

오랜만에 질문드립니다!!

 서버 작동되는 흐름 파악하면 클라이언트를 까먹고 클라 공부하면 또 서버 까먹어서 상당히 어렵네요..ㅎ

오랜만에 다시 클라 작동방식 다시 복습하고 있는데 예전에 정확히 알아보지 않고 넘어갔던 흐름을 디버깅하면서 다시 보고 있습니다..

지금까지 혼자 파악한 흐름을 잠시 정리해보면...(MyPlayer가 움직을 때 기준)

코드 흐름 상 처음에 방향키를 한 번 받아 Dir가 바뀌면

① 그 턴의 Update문에서 UpdateController를 호출하면서 UpdateIdle을 호출하고 거기에서는 State만 Moving으로 바뀌고 return 해준 다음

② 다음 턴의 Update문의 UpdateController에서 UpdateMoving으로 가게 되고 그 턴에서는 아직 destPos가 아직  바뀌지 않았으므로 MoveToNextPos로 바로 들어가게 되어 CellPos를 방향키 칸으로 바꾸어 준 다음

③ 다음 턴의 Update의 UpdateController에서 UpdateMoving으로 가서 스르륵 동작을 시작하고 

④ 몇 번의 UpdateMoving 반복 끝에 목적지에 도착하면  그때는 Dir 가 None 이기 때문에 State를 Idle로 돌리고 return하는 것으로 파악하였습니다.

여기서 정말 이해하기 힘들었던건 UpdateMoving에 처음 진입할 때는 이미 기본 Update문이 (UpdateIdle 실행으로) 한 번 돌고 난 후인데도  MoveToNextPos로 넘어갔을 때 여전히 Dir가 Up을 유지하고 있어서 

if (Dir == MoveDir.None)

{

State = CreatureState.Idle;

CheckUpdatedFlag();

return;

}

에서 CreatureState.Idle로 바뀌고 바로 return 하지 않은 점 입니다..

너무 궁금해서 일일이 로그를 찍어 확인하니 아무리 키를 사아알짝 눌러도 키가 눌리는 로그는 2~3번이 찍히는 것으로 보아  2~3번의 Update 문이 돌 때까지는 MyPlayerController.cs의 UpdateController의 CreatureState.Moving 케이스에서 GetDirInput()을 호출하더라도 키 값이 입력되어 Dir이 Up을 유지하는 것을 파악하였습니다...

(틀린 부분이 있다면 길어서 죄송하지만 지적 부탁드립니다..)

Q. 라이브 코딩식으로 강의를 진행하시면서 이런 부분까지 어떻게 생각하면서 진행을 하시는건 지 궁금합니다...역시 많이 해봐야 감각이 생기는 걸까요??  (예를 들면 'MoveToNext는 두번째 Update에서 진입할테지만 KeyInput은 두세번은 연타로 눌리니 아직까진 Dir가 MoveDir.None이 아닐꺼야... if 에 (Dir == MoveDir.None) 를 써도 괜찮아!' 이런식의 생각을 하시는 걸까요..?)

또 한 가지 더 궁금한게 있는데요!!

MyPlayer가 한 칸 움직일 떄 Dir, State, cellPos까지 세팅된 패킷이 한 번 가고 State가 Idle로 바뀔 떄 또 한 번 패킷이 보내져 두 번의 Broadcasting이  되는 것으로 파악됩니다..

Q 이때 타 클라이언트의 화면에 뜬 MyPlayer 게임오브젝트를 보았을 때

MyPlayer 클라이언트에서 처음 보낸 패킷에 의해

타 클라이언트의 MyPlayer 게임오브젝트에 붙은 CreatureController의 UpdateMoving으로 스르륵 움직이는 동작이 else문에 의해 반복되다가 if(dist < _speed * Time.deltaTime) 에 걸려 transform.position = destPos; 으로 설정되기도 전에

 CreatureState.Idle을 담고 있는 다음 패킷이 전송되어 타 클라이언트의 MyPlayer 게임오브젝트의 움직이는 애니메이션이 도중에 뚝 끊기지 않으리라는 보장을 어떻게 하는걸까요..? 

질문이 쓸데없이 길고 읽기도 귀찮으시겠지만 혼자 좀 잘못 된 방향으로 가고 있는게 아닌가라는 불안감이 커서 이렇게 라도 질문드립니다..! 한 번 읽어주시고 시간 나실 때 답변 부탁드립니다!!

답변 2

0

김지수님의 프로필 이미지
김지수
질문자

일단 만들어보고 이상하면 고치는 방식으로 하는게 좋겠군요!ㅎㅎㅎ 감사합니다!!

0

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

1)
완전한 라이브 코딩은 아니고 저도 어느 정도 완성된 샘플을 갖고 있습니다.
다만 첫 포폴부터 이런 류의 게임을 많이 만들어봤고
훗날 테라와 같은 라이브 서비스 프로젝트에서도 문제가 터지는걸 보다 보면,
무엇 무엇을 신경써야 하고 어느 부분에서 문제가 되는지 미리 감으로 알 수 있게 됩니다.
그렇다고는 하나 이동 동기화와 같은 부분은 정해진 답은 없어서
조금씩 어색한 부분은 조절해가면서 만들어야 합니다.

2)
렉이 있거나 기타 등등의 이유로 상태가 빨리 변하건다 하면
실제로 어색해보이거나 문제가 일어날 수도 있습니다.

그리고 아직도 코드를 볼 때 너무 디테일에 신경쓰는게 느껴지는데요.
이동 동기화 부분만 툭 떼서 본인이 처음부터 한 번 아무렇게 만들어보시기 바랍니다.
실무에서도 마찬가지지만 정해진 답은 없기에
굉장히 많은 방법과 야메들이 뒤섞여서 만들어지는거라
제가 샘플로 제공해드린 코드를 그 정도로 심도 있게 분석할 필요까진 없습니다.

김지수님의 프로필 이미지
김지수

작성한 질문수

질문하기