월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
학습 커리큘럼 관련 질문
안녕하세요.게임 공부에 입문한 웹 개발자 입니다.관심 있는 분야가 게임서버, unity 쪽 인데unity 강의 3(unity), 4(server), 7(unity + server), 8(entity), 9(mmo) 로 공부하고c++ 강의로 넘어가거나, 유니티 기반 게임을 만들어 봐도 막히는 부분은 없을까요?DB 쪽은 MYSQL 엔진 원리와 트랜잭션, 동시성 문제가 일어나는 이유 등을 알고 고급 쿼리는 좀 공부 해야하고, 웹 쪽은 게임 프로그래밍 코어 공부하는데 크게 지장 없으면 넘어가고 싶은데루키스님 의견이 어떠한지 궁금합니다.(entity는 생산성 때문에 하는게 좋을 것 같아서요.)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
선생님처럼 이동못할때도 정상적으로 애니메이션이 작동을 안합니다
void UpdateIsMoving() { if (State != Define.CreatureState.Moving && Dir != Define.Dir.None) { Vector3Int destPos = CellPos; State = Define.CreatureState.Moving; switch (Dir) { case Define.Dir.Up: destPos += Vector3Int.up; break; case Define.Dir.Down: destPos += Vector3Int.down; break; case Define.Dir.Left: destPos += Vector3Int.left; break; case Define.Dir.Right: destPos += Vector3Int.right; break; } if (Managers.Map.CanGo(destPos)) { if (Managers.Object.Find(destPos) == null) CellPos = destPos; } } } void UpdatePosition() { if (State != Define.CreatureState.Moving) { return; } Vector3 destPos = Managers.Map.currentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f, 0); Vector3 moveDir = destPos - transform.position; float dist = moveDir.magnitude; if (dist < _speed * Time.deltaTime) { transform.position = destPos; State = Define.CreatureState.Idle; } else { transform.position += moveDir.normalized * _speed * Time.deltaTime; State = Define.CreatureState.Moving; } } 이동할 수 없는 구역에 가려고할때 애니메이션이 IDLE과 WALK를 번갈아가면서 부들부들거립니다.UpdateIsMoving에서 State를 Moving으로 바꾸더라도 실제 CellPos에는 적용이 안되어있다 보니 State가 곧 바로 IDLE로 바뀌기 때문인것 같은데 어떻게 해결할 수 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
구글 프로토콜 버퍼 사용 이유
기존의 PDL.xml대신 구글 프로토콜 버퍼를 사용하는 이유가Write, Read 함수의 최적화: 기존에 Write, Read를 사용하면서 역직렬화, 직렬화 하실 때 비트컨버터를 사용하는 방법 말고도 더 최적화 할 수 있다고 해주셨는데 관련 문서를 찾아보니 엄청 복잡한 설계를 통해 최적화가 잘 돼 있다고 봤습니다.현업에서의 업무 적응 능력: 대부분 프로토콜 버퍼 혹은 플랫 버퍼를 쓰기 때문에 나중에 혹시나 사용하는 프로젝트를 만나면 적응이 빠르다.데이터의 직관성: 제가 자주 사용해서 그런진 모르겠는데 xml과 달리 패킷 설계가 직관적이라 쉬운편클라와 서버에 쓰일 공통 데이터 선언: 클라와 서버에서 쓰일 패킷 관련 변수를 매번 복붙안해도됨(정확하지 않음, 패킷 자동화 부분에서 xml에서 프로토콜버퍼로 바뀌면서 자동으로 수행되는 부분인지 프로토콜 버퍼 자체 기능인지는 모르겠으나 using protocol buffer를 사용하면 패킷 변수를 사용할 수 있는 것을 보니 자체 기능 같기도하고..?)샌드 버퍼와 리시브 버퍼의 최적화: 1번의 현상과 마찬가지로 구글 프로토콜 버퍼를 사용시 강의에서 자체 제작하신 샌드 버퍼와 리시브 버퍼는 사용하지 않고 조금 더 최적화된 프로토콜 버퍼의 것을 사용한다.이런 이유로 보이는데 루키스님은 어떤 매력이 있으신거 같나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이중 Job 캡슐화는 오히려 위험한것이 아닌지요??
18:25 설명을 보면 HandleSkill 내부에 있는 EnterGame 도Job 캡슐화해서 push 하는게 좋다고 하셨는데Job 시리얼라이저 특성상 스레드 1개가 Job을 기준으로 순차적으로 처리할텐데 Job 안에 또 Job캡슐화를 하면 이중 Job 부분은 뒤로 밀려나서 나중에 처리되겠죠 그렇다면 그 사이에 있는 다른 Job을 처리하는 과정에서 뒤로 밀려난 애가 처리할 수 없는 상황이 올 수 도 있지 않을까해서 더 불안정하다는 생각이 듭니다그래서 결국 이중 job 캡슐화하는 것보다 18:25에 나오는EnterGame 도 바로 처리하게 push 를 안하는 방향이 더 낫지 않나 싶습니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버도 ObjectPool 사용해야하나요?
서버도 오브젝트 풀링 써야하는지 궁금합니다. 일단 생각대로라면 장르에 따라 수많은 Projectile이 생성되고 삭제될텐데 아무리사용하지 않는다 하더라도 가지고 있는것과 가지고 있지 않는 상태는 차이가 있잖아요? 그렇지만 또 할당하고 해제하는 단계는 더더욱이 비용이 많이들어가는것도 사실이 이니깐포톤네트워킹은 사용했던걸로 기억하는걸봐서 사용하는게 맞나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
같은 네트워크 안에서 다른 컴퓨터와 연결
안녕하세요. 강의 들으면서 이것저것 실험 중에 질문 드립니다.제 컴퓨터(서버)와 노트북(클라이언트)을 같은 와이파이에 연결해서 둘이 통신을 해보려고 하는데서버쪽클라이언트쪽 이렇게 ipconfig를 쳐서 서버컴퓨터의 무선 LAN 어댑터 Wi-Fi의 IPv4 주소를 넣어주었습니다.그런데 노트북에서는 감감 무소식이었습니다. 같은 와이파이에 연결되어 있는건 확인했습니다.너무 기초적인 문제 같아서 여쭤보기도 부끄럽지만 도저히 모르겠어서 질문드립니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
두가지 질문이 있습니다.
●제가 서버의 대한 이해도가 완벽하지 않아, 제 의견이 들어가는 부분엔 문장 앞에 '●' 넣도록하겠습니다. 틀리다면 지적 부탁드리겠습니다. 어제 GroundObject[]를 사용해서 맵충돌은 결국 이동동기화 강의의 맵타일추출을 인용하여 진행하였습니다.내가 가려고하는 방향의 앞타일을 가져와 갈수 있는곳인지 없는 곳인지를 판단하여 캐릭터를 이동하였습니다. 서버에서 체크하여 BroadCast하였습니다.그 결과물입니다. https://youtu.be/tjzA_VzAKb0 ※Map 수정 ※room.HandleMove 수정 해당방법은 괜찮은 방법인지 여부와 영상에 보시면 패킷전송량이 어마어마 합니다. 실제로 Client에서 패킷 전송량을 보자면 누르고 있을 때마다 패킷을 전송하게 되겠죠.(Dir의 _update 의해서 ) ●"현직에 있을때 Photon 서버로 게임을 만든적이 있는데 클라는 최소한의 패킷 전송으로 최대한 많은 결과물을 받아야 한다고 생각하고 있습니다." 고작 내 포지션에서 스피드만큼 거리를 가려고 엄청나게 많은 패킷을 보내고 있습니다. ●또한 이 많은 전송량을 처리하려고 TickRoom을 16ms (60fps)로 설정 하였으니 서버에 좀더 과부화가 오지 않을까 생각합니다. 저렇게 실시간으로 움직여야 하는 방식에서 더 좋은 방법이 있는지 알고싶습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
횡스크롤 맵추출 질문입니다.
몇시간을 고민하다가.... 도저히 아이디어가 떠오르지않아 질문드립니다.횡스크롤 2D 포트폴리오 제작중입니다..강의 다르게 바람의 나라 형식의 이동이 아닌 메이플스토리와 같은 이동방식을 선택했습니다.맵은 타일맵으로 만들려고합니다. 여러가지 아이디어는 있는데 이게 긴가민가합니다. 생각해둔 아이디어는 타일맵의 오브젝트 좌표를 하나하나 따와서 Rect로 만들어 DirectX 방식으로 right.x, top.y ,left.x , buttony 좌표로 만들어 GroundObject[] 배열로 담아둡니다. ※ GroundObject1 의 좌표 (TileMap) 최초 캐릭터 생성시 Ground 라는 bool 값을 주어 이것을 True 생성하고 이동 패킷이 올때마다, GroundObject[] 모든 Object를 돌면서 하나라도 True되는곳이 있다면 Ground 의 bool 값은 편하지않고 서버에서 낙하처리를 하지 않는것입니다. 만약 모든 GroundObject[] 타일이 false 값이라면 캐릭터는 낙하하면서 GroundObject[]배열을 순차적으로 돌면서 True값이 있는지 찾는겁니다. 떨어지다가 GroundObject[]에 하나라도 다시 True 변환이 되는 되는 것이 있다면 Ground bool 값을 Ture 반환한후 캐릭터는 낙하를 멈추는 방식을 생각해 봤습니다. 하지만 Direct 나 API 같은경우야 ... Rect 충돌 함수가 있으니 편하다고 하지만은.... 이방법은 필요시 모든 GroundObject를 돌아야하는 시간복잡도 O(n) 최악이 나올수도 있다는 것입니다. ※확실하진 않지만 여러 사람이 동시에 진행했을때 서버 과부화가 걸리지 않을까 생각이 듭니다. 또 하나의 걱정은 저의 짧은 지식으로 저 타일맵 안에 있는 그라운드 오브젝트의 좌표를 유니티에서 추출할수 없다는것이죠. 서론이 길었는데 질문입니다. 가장 걱정인것은 해당방법을 채용 하더라도 서버에 과부화가 오지 않는가?2.정답이 아니더라도 다른 아이디어가 있는지? 입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
EventSystem 에러
안녕하세요 루카스님 강의를 듣고 있다가 위 사진과 같은 에러가 나옵니다. 커뮤니티 게시판에 저와 똑같은 에러를 가지는 분의 글을 보고말씀해주신 대로 해당 경로에 EventSystem이 있는지 확인해 보았는데 위 사진과 같이 있습니다. 아무리 해도 해결이 안되어 질문 남깁니다. 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
RegisterSend 의 NullReferenceException 오류
유니티에서 NetworkManager static Instance를 통해 Send를 하면 다음과 같은 오류가 발생합니다. 어떤 이유인지 알 수 있을까요? ㅠㅠServerSession에서 로그를 찍으면 문제가없습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
게임 장르에 따른 서버 선택 여쭤보고 싶은 게 있습니다.
안녕하세요.게임서버 웹서버 강의 두 개를 듣고 있는 수강생입니다.강의를 마치고 작은 방치형 게임을 하나 만들어 보고자 합니다. 게임 설계에 따라 전부 다르겠지만,보통 방치형 게임은 웹서버, 게임 서버 중에 어떤 서버방식으로 사용되는지 알 수 있을까요? 제가 만들 게임은 온라인 서버에서 싱글플레이어로 진행되는 게임이기에 실시간 연결서버가 필수는 아닐 것으로 보입니다. 다만, 미래지향적으로 컨텐츠에 따라 게임서버가 좋지 않을까 싶은데 보통 방치형 게임에서는 웹서버를 사용하는지, 게임서버를 사용하는지, 어떤 형태로 설계되는지 궁금합니다.실제 개발 환경 경험이 없다보니... 정보를 얻기 쉽지 않네요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
.sln 서버 프로젝트 로드가 정상적으로 되지 않습니다.
안녕하세요?2강(환경 설정)의 서버쪽 .sln 파일을 visual studio(2019기준)으로 열 시 다음과 같은 오류가 발생하면서 프로젝트가 로드되지 않습니다.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\Server\Server.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\ServerCore\ServerCore.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\DummyClient\DummyClient.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\PacketGenerator\PacketGenerator.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. 일단 넘어가고 클라쪽은 잘 따라갔는데, 해당 강의(Protobuf 이식)의 강의자료 Server쪽 .sln파일을 열 때는 또 다른 오류가 추가로 발생합니다.'GenProto.bat'을(를) 여는 동안 '<MiscFiles>'에서 오류가 발생했습니다.'C:\Rookiss\MMO_Game\Common\protoc-3.12.3-win64\bin\GenProto.bat' 경로의 일부를 찾을 수 없습니다. 어떤 절대경로와 SDK 호환? 문제인건 알겠는데, 해결책을 모르겠어서 질문 올립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
비주얼스튜디오 에서도 툴 만들기가 지원될까요?
강사님 안녕하세요?이번 강의를 들으면서 유니티 내부에서 툴을 커스텀할 수 있는 방법 잘 배웠습니다. 비주얼스튜디오에도 해당 기능 이용하여 메뉴 등을 추가할 수 있을까요? 잠깐 구글링 해봤는데, 검색 키워드가 안맞아서 그런지 없는 것도 같습니다. Q. 비주얼스튜디오에서도 Tool 만들 수 있는 기능이 있는지? 있다면 구글링 검색 키워드는?궁금합니다. 미리 답변 감사합니다.수강자 드림.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
커맨드 패턴의 이해
커맨드 패턴을 정확히 이해하고 싶은 학생입니다. 강의를 정말 많이 돌려보고 구글링도 해본 결과 저는 다음과 같이 커맨드 패턴을 이해했고 적용해봤습니다.기존의 방식은 클라이언트에서 요청이 들어오면 서버의 쓰레드들이 일을 처리하기 위해 쓰레드들이 락에 의한 대기를 함으로써 대기 시간이 길어져 메모리 낭비가 됐지만커맨드 패턴을 활용하여 클라이언트의 요청을 캡슐화하여 서버에 전해줌으로써 기존에 락에 의해 대기만 하던 쓰레드들이 대기하는 시간이 줄어들게 됩니다.단점으로는 2가지가 있습니다.플레이어의 죽음과 종료가 거의 동시에 일어났다고 가정해보겠습니다. 종료가 됨으로써 플레이어의 room이 null로 밀렸는데 잡큐에서 실행된 죽음 함수에서 플레이어의 room에 관한 정보로 접근하려 하니 null 크래쉬가 나게됩니다. 따라서 null 체크를 꼼꼼히 해줘야 합니다.또 다른 문제는 로직 동작 순서의 불명확함입니다.. 코드의 순서가1번. 잡큐로 밀어넣은 함수 12번. 잡큐와 상관 없는 코드3번. 잡큐로 밀어넣은 함수 2이런 상태에서 로직이 존재한다고 가정할 때큐에 넣은 일이 바로 실행되는 것이 아니기 때문에 1번과 3번이 밀려 2번이 먼저 실행되는 일이 발생될 수도 있습니다. 따라서 이런 문제를 해결하기 위해선 잡큐에 넣는 커맨드 패턴 방식이 아닌 기존의 락으로 잡아가던 방식으로 함수를 사용하는 것이 좋습니다.이 정도로 정리해봤는데 혹시 다른 점 있을까요? 커맨드 패턴 부분의 이해가 정말 안됐어서 질문 드립니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
a* 비용계산
A*알고리즘이 G는 시작점에서 해당 좌표까지 이동하는데 드는 비용이고 H는 목적지로부터 얼마나 가까운지를 따지는 비용이라고 알고 있었는데맵매니저를 만들 때 G를 왜 0으로 두는지 잘 이해가 안되고 H는 원래 (목적지까지 남은 X 방향의 타일 + Y 방향의 타일)로 계산했었는데 (목적지까지 남은 X 방향의 타일^2 + Y 방향의 타일^2)으로 바뀐건지 잘 이해가 안됩니다ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
처음 등장했을때 죽지 않는 경우가 발생합니다.
https://blog.naver.com/we5046/223172915438강사님께서 진행하신대로이동할때 Map에게 모든 정보를 넘기므로 충돌을 관리하는데, EnterGame 부분에 Map.ApplyMove를 추가하여 플레이어가 아무 이동을 하지 않고 0,0 좌표에 있을때 화살 타격이 불가능하여 추가 할 경우 타격을 입게 될 것임이 분명한데 해당 영상을 보시면 Unity에서 실행 하는 Player는 타격을 입고, 그뒤 추가로 생성하는 Player또한 타격을 입는데, 맨 처음 같이 생성된 Player들중 한명을 움직이지 않고 냅두면 화살을 피하는 문제가 발생합니다.이러한 오류가 발생하는 이유가 무엇인지 궁금합니다. 해당 오류가 왜 발생하는지 생각해보니, 처음 실행된 Player1에게는 새로 등장한 Player2의 정보가 Player1의 맵으로 전달이 되지않은 것인가 라는 문제 점을 생각해보게 되었습니다.그래서 기존 EnterGame에서 해당 플레이어의 등장을 타인한테 정보전송하는 부분에 해당 플레이어의 위치를 Map에 전파하도록 작성하니 정상적으로 작동하게 되었습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Rename 바를 여시는 단축키가 뭔가요
14:21초 처럼 강사님처럼 원하는 함수가 사용된 경로를 찾고싶은데 해당 기능을 사용하고자 하면 어떤 단축키를 사용해야할까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Broadcast() 함수는 Push()로 캡슐화하지 않는 이유가 궁금합니다
public Player FindPlayer()는 리턴값 Player가 당장 필요해서 호출하는 함수니까 Push()를 안 하는 건 이해했습니다.근데 public void Broadcast()도 FindPlayer()와 같은 케이스라고 하셨습니다. 이게 무슨 뜻인지 이해가 안 갑니다.리턴값이 있는 것도 아니고 그냥 room.Push(room.Broadcast, packet) 처럼 Push로 고쳐도 상관없을 것 같은데 아닌가요?혹시 Broadcast()는 엄청 많이 호출되는 특수한 함수니까 성능상 이유 때문에 Push()를 생략하고 호출한다거나 그런 건가요?왜 FindPlayer()와 Broadcast()가 같은 케이스인지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
넓은 범위 충돌관련 질문드립니다.
만약 넓은 범위의 광역 공격을 구현하고자 한다면 cell단위로 N x N의 범위를 탐색하는 것과 Physics2D의 BoxCast를 사용해 탐색하는 것 중 어느 것이 성능적인 측면에 더 유리한지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
GameObject에 작성한 PosInfo, Stat 프로퍼티에 궁금한 게 생겼습니다.
선생님께서 작성하신 GameObject.cs 코드에 이런 부분이 있었습니다. public ObjectInfo Info { get; set; } = new ObjectInfo(); public PositionInfo PosInfo { get; private set; } = new PositionInfo(); public StatInfo Stat { get; private set; } = new StatInfo(); public GameObject() { // 링크를 이어준다 Info.PosInfo = PosInfo; Info.StatInfo = Stat; } 근데 위 생성자에서 저 '링크'를 이어줬는데 그 후로Info.PosInfo = new PositionInfo();라는 코드를 부주의로 실행시킨다면 링크가 깨지지 않나요?그 후로는 PosInfo.PosX = 0;같은 걸 실행해도 PosInfo와 Info.PoInfo는 별개이니 게임오브젝트에 적용이 안 될 것 같은데이렇게 이해하고 있는데 이게 맞는지 궁금합니다.그리고 아래처럼 고친다면 이 링크 깨짐 문제가 해결되는지 궁금합니다. public ObjectInfo Info { get; set; } = new ObjectInfo() { // 이걸 안 하고 쓰면 크래시가 난다 PosInfo = new PositionInfo(), StatInfo = new StatInfo() }; public PositionInfo PosInfo { get { return Info.PosInfo; } set { Info.PosInfo = value; } } public StatInfo Stat { get { return Info.StatInfo; } set { Info.StatInfo = value; } }