• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

3d 환경 구축 질문입니다

21.11.04 12:10 작성 조회수 212

0

안녕하세요 선생님
선생님 강의를 듣고 저는 3d 환경에서 y축으로 회전하고 xz좌표로 이동하는 움직임을 동기화하려고 합니다.
horizontal 이랑 vertical 인풋을 받아 이동하는 것인데요.
몇 달이 지나도 개발에 진전이 없어서 답답해서 글을 올립니다.
선생님의 2d 움직임 구조랑은 많이 다른것같아서요.. 어디서부터 수정을 하면 좋을까요?? Protocol.proto에도 많이 바꾸어야하겠죠?
 
 
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 3

·

답변을 작성해보세요.

0

info님의 프로필

info

질문자

2021.11.18

저 혹시 질문이 있는데요.

리눅스 환경에서 서버를 구현하고 싶은데요.

1. 리눅스 환경에서 선생님 강좌의 c# 프로그램을 띄울 수 있나요?

2. 리눅스 환경에서 c+로 서버를 개발하고 유니티 게임을 개발한다고 가정할 때, 선생님의 언리얼 서버 강의가 도움이 될까요? 언리얼 서버 강의를 들으려는 이유는 언리얼이 c+이기때문입니다.

0

info님의 프로필

info

질문자

2021.11.11

드디어! 모바일 환경에서 조이스틱을 이용해서 객체 이동 동기화 구현 성공했습니다.

그런데 궁금한 점이 움직일때마다 

고로 dist 가 < movespeed * time.deltatime 보다 작을 때 플레이어의 움직임이 조금씩 끊기는 것 같습니다.

이는 더 움직여도 되는데도 불구하고 transform.position = destpos를 해서 그런걸까요?

위 내용만으로는 저도 바로 알기가 힘들고 디버깅이나 분석을 해봐야 할 것 같습니다.
그런데 이동은 온라인 게임 동기화의 꽃이라서
스스로 엄청 헤딩을 해보면서 연구를 해보시기 바랍니다.
이동만 동기화할 수 있다면, 나머지는 정말 쉽습니다.
제 경우에도 정말 온갖 방법으로 수정해보면서 헤딩한게 두고두고 많은 도움이 됐고
회사를 가더라도 '정해진' 답은 없고 적당히 부드럽게 동기화가 될 수 있도록
이런 저런 반야메(?) 코드를 많이 넣습니다.

info님의 프로필

info

질문자

2021.11.11

넵 알겠습니다. 

그리고 플레이어의 y축 동기화도 position 동기화처럼 가상의 목표치를 설정해서 해야하나요?

그렇게 하시는 이유는 마지막에는 똑같이 동기화 시켜주려고 하는것이죠?

 

그건 게임마다 다릅니다. 높이가 없고 평평한 게임이라면 굳이 안 보내도 되겠지만
보통 3d 게임에서는 높낮이가 있으니 같이 받아주는게
클라에서 렌더링하기 편하겠죠. (그 높이를 참고해서, 해당 위치 Terrain에 올려 놓는 등)

info님의 프로필

info

질문자

2021.11.11

앗 제가말씀드린 부분은 rotation y값을 말한겂니다.

3d 환경에서 케릭터가 회전을 하니

y축 rotation 값을 동기화가 필요할것같아서 말씀드렸습니다

아 네 그건 꼭 필요합니다.

0

질문이 조금 모호합니다.
어느 부분을 어떻게 하려고 했는데 무엇이 안 되었다~ 는 흐름으로
질문을 주셔야 정확한 답변을 드릴 수 있습니다.

기본적으로 3d라고 해도 이동 동기화에 아주 큰 차이가 있진 않구요.
바라보고 있는 방향 (y회전)과 현재 좌표 (x,y,z) 이렇게 4개의 정보를
주기적으로 서버에 보내고, 다른 클라에서 받아주면 됩니다.

다만 강의에서는 그리드 단위로 이동하기 때문에
모든 좌표가 (2,0) (1,1) 이런 식으로 딱딱 정수의 배수로 떨어졌지만
3d에서는 그렇지 않기 때문에
- 방향이 급격히 바뀌거나
- 일정 시간이 지나거나
하는 특정 조건에 의해 패킷을 서버로 보내고, 그것을 broadcast해서 동기화 해줘야 합니다.

만약에 이 부분이 많이 어렵다면,
3d 게임 자체에 익숙하지 않거나, 아니면 기초 코딩이 아직 흔들리는 상황일 수도 있습니다.
그럴 경우 온라인 게임을 바로 만들기보단 
3d 싱글 게임으로 연습을 더 해본 다음 
나중에 온라인으로 쪼개는 쪽으로 해보는 것을 추천드립니다.

info님의 프로필

info

질문자

2021.11.04

먼저 답변 감사드립니다.

현재는 회전값 동기화 보다 이동 동기화만 해결 중에 있습니다.

wasd 와 같은 인풋값을 누르고 땠을 때만 저런 패킷 호출이 나오는 상황입니다.

그럼 저 같은 경우에는 회전을 확인하는 Protocol.proto에서 MoveDir이 필요가 없겠군요.

 

이동 동기화를 하려 해도 방향이 필요합니다.
실시간으로 모든 좌표를 다 서버에서 보내고 받을 수 없기 때문에,
현재 가는 방향(회전값)도 같이 보내주고
이를 토대로 다른 클라에서도 그쪽 방향으로 가도록 Update를 해줘야 합니다.
아니면, 바로 앞에 있는 목적지를 찍어서 그 좌표를 공유하고
그 좌표를 향해 움직이도록 하는 방법도 있습니다.
추측 항법 (Dead Reckoning) 관련해서 자료를 찾아보면 도움이 될거에요.

info님의 프로필

info

질문자

2021.11.04

그럼 저같은 경우에는 방향벡터를 동기화해줘야하기 때문에, (float x float y float z) 세 개의 변수를 동기화하면 되겠네요??

그건 어떤 방식의 이동을 구상하는지에 따라 조금씩 다릅니다.
방향만 동기화해서 각자 클라에서 해당 방향으로 이동시켜도 되고요.
그런데 그러면 조금씩 좌표가 틀어지는 문제가 생길 수 있기 때문에
현재 좌표 + 이동 방향 두개를 동시에 보내는 경우도 있습니다.
어느 정도 오차를 허용할 것인지가 관건입니다.
중요한건 서버에서 모든 정보를 보내주는게 아니라, 핵심 정보만 보내주면
클라에서 그럴싸하게 보정해서 그려준다! 입니다.

info님의 프로필

info

질문자

2021.11.04

감사합니다. 개념은 이해했는데 코딩이 조금 어렵네요...

디버그를 확인해보니깐

이 곳이 안찍히더라고요...

 

이 부분을 삭제하긴했는데 여기가 문제가 될까요?

myplayer가 이동한 거리를 안더해줘서 계속 제자리였던걸로 보이네요...

 

이런식으로 처리했습니다.

 

그럼 이곳을 제 입맛에 수정을 해야할 것 같습니다.

스르륵 처리니깐 일단 MoveToNextPos(); 남겨둬도될것같습니다. 그러니 좌표는 아주 잘나옵니다ㅠㅠ

3D로 하고 이동 동기화 로직이 바뀐다면
그냥 날리고 처음부터 새로운 마음으로 짜는게 날 수도 있습니다.
강의 코드는 그리드 단위의 게임이라서 개념이 완전히 다릅니다.
(즉 실제 좌표는 정수 배수이지만, 중간에 스르륵 움직이게끔 보이는 것)

info님의 프로필

info

질문자

2021.11.04

그래도 크게 바뀌지않는다고 생각했거든요. 그럼에도 불구하고 잘 안돼네요ㅠㅠ

패킷도 잘 주고 받고 오브젝트 동기화까지 되는데 왜 이동 동기화가 안되는지 의문입니다

원래 온라인 게임에서 이동 동기화가 가장 어렵고
그것만 넘으면 그 다음 짜잘한 컨텐츠는 싱글 게임이랑 크게 다를 바 없습니다.
디버깅을 통하거나 로그를 남겨서 좌표는 잘 받아오는지,
그리고 오브젝트 하나의 좌표를 실시간으로 찍던가 이동 로직 쪽에 뭔가 추적해서 살펴보시기 바랍니다.
이쯤되면 디버깅 영역으로 넘어가네요.

info님의 프로필

info

질문자

2021.11.05

넵.. 답변 감사드립니다.

저 추가 질문이 하나 있는데요..

선생님 강의를 듣고 방을 개설하고 사람들 입장하는 식의 시스템도 구현 가능할까요?

만약 가능하다면 참고할 강의는 파트4가 될까요?

네. 마침 연초에 그런 류의 게임을 하나 테스트해서 만들어봤는데요.
일단 가능하지만 정말 내용을 깊이 이해하고 응용할 줄 알아야 합니다.
참고할 강의는 4, 7, 9가 핵심인데 구조를 '그대로' 사용할 수는 없습니다.
말씀하신 류의 게임에서는 어느 방으로 갈지를 결정해주는 MatchMaking Server가 있어야 하고
그것이 실제 게임을 진행하는 GameServer랑 통신을 하고 있어야 합니다.
Client는 처음에 MatchMaking 서버에 붙어서, 어느쪽 GameServer로 붙을지를 받아준 다음
해당 주소로 접속을 하는 식으로 유도를 해야 합니다.
GameServer는 처음부터 다 띄워놓고 방 단위로 관리해서
몇번 방으로 가라는 식으로 구현할 수도 있지만
아예 배그처럼 실시간으로 AWS 인스턴스를 띄워서 하는 방법도 있는데
이쯤되면 혼자서 구현하긴 매우 어렵습니다.

info님의 프로필

info

질문자

2021.11.05

크레이지아케이드 처럼 방 만들고 사람들이 접속하는 식의 구조를 생각했는데,

그것만 하더라고 어마어마하군요...