월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
수업 외 개인적인 질문 하나 해도될까요?
엄청난 퀄리티 강의를 너무나도 잘듣고있고 재미를 느끼고있는 개발입문자입니다 . 2d 유니티 mmo클라,서버 돌릴수있는 노트북을 구입하려고 여기저기 알아보는데 마땅한정보가 없어서 질문드립니다. 2d 유니티 mmo클라,서버 를 돌릴떄 그래픽카드가 중요하게 작용하나요? 픽셀아트 그래픽으로 테일즈위버,에버플래닛,트릭스터 같은 mmo 목표로 하고있습니다. 아니면 cpu만 빵빵하고 내장그래픽으로 버틸수있을까요? 혹시 추천해주시는 노트북이 있으시면 추천부탁드립니다. 여기저기 알아봐도 정보가 너무없어서 질문드립니다..ㅠ 수업 외 사적인내용 너무죄송합니다.. 정보가너무없고 개발경력이 엄청나시니 조언좀부탁드립니다 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버 vs 클라 데이터 정책
서버와 DB공부를 하면서 서버, 클라에서의 데이터 정책(?)에 대해서 궁금한 점이 생겼는데요 선생님 수업을 듣기전에는 클라에서 컨텐츠 관련된 데이터들을 외부 파일로 읽어서 사용했었습니다. (캐릭터, 아이템 같은 정보들) 서버관련된 Part에서 치트방지 차원에서 데이터들을 서버단에서 관리한다고 들었던거 같은데요 관련해서 데이터정책을 어디서 어떻게 처리해야할지 고민에 빠졌습니다. Q1) 게임마다 케바케가 있겠지만 서버와 DB를 둔 게임에서는 이런 데이터들을 서버에서만 담당하는지 양쪽에서 담당하는지 아니면 각각 필요한곳은 필요한곳에다가 사용하는지 궁금합니다. Q2) 게임중에 간혹 아이템이나 유닛정보들을 볼 수 있는 백과사전 시스템 같은경우에는 어떻게 처리하는지 궁금합니다. (결국 Q1과 같은 질문인거 같네요) Q3) Part7에서는 같은json파일을 서버,클라에서 같이 사용을 했었는데 서버에서만 사용할경우 json이 아닌 DB에서 작성된 테이블을 사용 할 수도있을까요? 클라만 쭉 공부해 오다가 서버부터 DB까지 처음해보는 것들을 공부하려다 보니 이런저런 정책들을 어떻게 처리해야할지 머리가 복잡해지네요 ㅠㅠ 읽어주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
FindPlayer에 관한 질문입니다.
제가 잘 이해하고 있는것이 맞는지 확신이 안서서 질문드립니다. 우선은 JobSerializer에서 Push를 할때 하나의 쓰레드가 접근하여 멤버변수(Flush)를 바꾸고 자신이 들어가서 Flush를 통해 Que안에 있는 잡들을 실행하는것이 JobSerializer이 하는 일이라고 이해했습니다 그렇기 때문에 JobSerializer를 상속받아서 사용하는 클래스들이 Player들을 수정하더라도 큐에 담겨져 있는 순서대로 실행되기때문에 FindPlayer를 호출해도 안전하다고 생각 할 수 있는 것이고, 관련이 없는 ( JobSerializer 상속 X ) 클래스들은 Player를 읽는것이 아니라 수정을 하게 된다면 JobQue를 비워줄때, 데이터가 변하기 때문에 사용을 하면 안된다고 생각하면 되는걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
26분 14초 부분에 ApplyLeave(gameObject)는 가능여부 체크후 실행하는 것이 좋을 것같습니다!
안녕하세요, 선생님. 애청하는 학생 중하나입니다. 다시한번 정주행중인데.. 수정하였으면 하는 부분이 하나 생겨 문의를 드려봅니다. 아래 부분에서 ApplyLeave(gameObject); 는 목적지에 갈수 있는지 체크한 이후에 넣는게 맞지 않나 생각이듭니다! - 몬스터가 플레이어를 쫓다가 막혔을때 (물론 막히면 다른데로 갈수도있으나 그러지 않은 상황이 지금단계에서는 생기더라구요. ) ApplyLeave는 계속 하고 있으나, return이 되어 게임상 _object list에는 저장이 되지 않고 있는 상황이 생겨서용.. 별거 아니지만.. 테스트중 오류가 발견되어 코멘트 남겨봅니다! 늘 감사하게 강의 듣고있습니다. 감사합니다. => AS-IS public bool ApplyMove(GameObject gameObject, Vector2Int dest) { ApplyLeave(gameObject); // 예외를 처리한다. if (gameObject.Room == null) return false; if (gameObject.Room.Map != this) return false; // 목적지에 갈 수 있는지 체크 if (CanGo(dest, true) == false) return false; PositionInfo posInfo = gameObject.Info.PosInfo; // 목적지에 나를 텔레포트 시킴 { int x = dest.x - MinX; int y = MaxY - dest.y; _objects[y, x] = gameObject; } => TO-BE public bool ApplyMove(GameObject gameObject, Vector2Int dest) { // 예외를 처리한다. if (gameObject.Room == null) return false; if (gameObject.Room.Map != this) return false; // 목적지에 갈 수 있는지 체크 if (CanGo(dest, true) == false) return false; // (순서조정) 나의 위치 체크와, 공간에서 사라지게 하고 하는게 다 ApplyLeave에 들어가있다. ApplyLeave(gameObject); PositionInfo posInfo = gameObject.Info.PosInfo; // 목적지에 나를 텔레포트 시킴 { int x = dest.x - MinX; int y = MaxY - dest.y; _objects[y, x] = gameObject; } // 실제 좌표 이동 | 사실 왜 바꿔주는지는 아직 모르겠음 return도 안하는데 posInfo.PosX = dest.x; posInfo.PosY = dest.y; return true; }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
10:27 분에 설명해주시는 추측 항법시에 대한 차이점이 궁금합니다
현재 그리드 방식과 이동한 만큼 이동하는 방식에서 차이점이 있다고 하셨는데요그럼에도 불구하고 S_Move를 보내고 받는 과정에 대해서는 유사하다고 설명해주신 부분에 대해서 궁금한 점이 있습니다현재 그리드 방식의 S_Move에 대한 데이터는이동 목적좌표 x,y 이동 방향 dir 현재 상태 state이렇게 포함되어있는데요같은게 아니라 유사하다고 말씀해주신 이유가 데이터 관점에서 추가적인게 필요한건지 궁금합니다기존처럼 목적지 ,방향 ,상태 말고 더 생각이 나질 않네요 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
화살 삭제에 관련된 질문입니다.
선생님처럼 저도 처음에는 캐릭터가 화살로 나가서 당황을 했엇는데, 캐릭터가 벽이나 화면 끝에 도달하지 않았는데 삭제가 될때 뻑이 나고 서버가 종료가 되서 원인을 찾아보니 화살의 CellX Y와 CellX Y를 토대로 얻어낸 배열 인덱스값을 화살이 움직일때마다 출력해 줬더니 위와같이 나왓습니다. 클라에선 벽이나 맵끝에 도착하지 않았지만 서버에서는 이미 도착한것으로 인식되었다는걸 확인했습니다. 제가 파악하기론 foreach문에 진입하고 나서 화살의 Update문을 실행햇는데 화살이 벽에 도착하거나 맵 끝에 도착해서 이 부분에서 삭제가 된 후 빠져나오면서 위처럼 조건을 다시 검사할때 여기서 에러가 납니다. 정리해보면 첫번째로는 서버에서는 화살의 움직임의 연산이 끝낫지만 클라에서는 물체의 속력이 빠르지 않아서 벽이나 맵끝에 닿기도 전에 삭제되는데, 서버의 프레임과 클라의 프레임을 맞추지 않아서 발생하는 문제인가요? 두번째로는 뻑이나는 부분인 foreach를 이용해서 ProjectTiles를 순회하는도중에 순회대상인 ProjectTile이 안쪽에서 삭제가 되어서 바깥쪽으로 나올때 에러가 나는것 같은데 이부분은 어떻게 해야 할까요..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티쓰레드 관련 질문입니다.
C_MoveHandler에 진입햇을때 ClientSession.MyPlayer나 Room이 다른 쓰레드에 의해서 null값으로 바뀔수 잇으니 지역으로 빼서 크래쉬가 안나게 해주는것은 이해가 됏습니다. ClientSession은 안전한것인가요? 위처럼 Recv처리하고 잇는 와중에 Send요청할때 혹시나 기타 이유로 인해 Disconnect가 호출되서 ClientSession이 null이 될 경우가 생길것 같은데 ClientSession이 null이 될 경우는 없는것인지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Room내 BroardCast시 질문입니다
룸에서 BoardCast로 패킷을 보낼때Send시에 lock을 걸어야할 이유가 있을까요?lock(_lock){ 임시 list에 players의 player를 넣는다 } foeach (player in 임시 list ) { player.Send 호출 } 로 했을때도 문제가 없는것 같은데 제가 발견하지 못한 문제가 있다면 어떤 문제가 있는지 궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
스레드 관련 문의드립니다
수업 중 C_MoveHandler에서 멀티 스레드 환경에서 clientSession.MyPlayer와 GameRoom에 대한 방어코드가 필요하다고 설명을 해주셨는데요. 수업에 사용되고 있는 시점의 코드와 테스트 환경에서는 멀티스레드에 의하여 하나의 client session에서 C_MoveHandler을 수행하는 시점에 MyPlayer나 Myplayer가 가르키고 있던 Room을 지우는( session disconnect처리) 경우는 OnSendCompleted(다른 client session에서 요청한 broad cast 메시지 처리 중 에러 발생 케이스)함수에서의 문제 발생에 의한 예외 처리(disconnect) 시점에서만 발생할 수 있다고 생각되는 데 이외에 생각할 수 있는 조건이 있을까요? ( 각 client session별로 session disconnect가 이뤄 지는 곳은 Receive Thread나 Send Thread인데 Receive Thread의 경우 해당 client의 C_MoveHandler를 실행하는 주체이기 때문에 멀티스레드에 의해 해당 client의 정보를 수정하게 될 수 있는 곳은 Send를 처리하는 thread밖에 없을 것 같아서요.)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
ProtoBuf 요청 사항
안녕하세요. 요청사항이 있는데요. 저의 경우 서버강의도 수강했었습니다. 그래서 제가 작성한 코드에 직접 이식하고 싶은데 중간에 5-10초뒤에 프로젝트를 변경한다고하면서 코드가 변경되는 장면이 있었는데 해당부분 어떤부분이 변경되었는지 가이드를 문서나 이런것으로 받아 볼 수 있을까요? 저는 직접작성하고 싶습니다..
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Managers는 어느 오브젝트에 붙어있는건가요?
안녕하세요 MonoBehavior를 상속받은 클래스는 오브젝트에 붙어서 사용해야 한다고 이해했는데 Managers는 어디에 붙어있는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
클라이언트의 소스 자체를 해커가 바꿀경우..
안녕하세요, 스승님.. 질문이 있습니다. Speed를 서버를 통해 받아오더라도., updateMoving()의 소스 자체를 해킹 당하면 캐릭터 이동속도 핵은 생기지 않나 궁금합니다. 예를 들어 스르륵 이동하는 코드의 Speed를 서버에서 받아오더라도, transform.position += moveDir.normalized * Speed * Time.smoothDeltaTime ; => transform.position += moveDir.normalized * Speed * Time.smoothDeltaTime *2; 이렇게 수정한다면, Destination 에 더빨리 도착하여 더 빨리 이동하겠다는 패킷을 빨리 보낼 수 있지 않나 싶어서요.. 이 경우 서버에서도 스르륵 부분을 구현하여 대략 어느정도 도착할 시간을 비교해서 구별하는 부분을 추가하여 대처를 해야하는 것이 맞는 것인지 궁금합니다.. 늦은 시간 질문드려 죄송합니다! 늘 상세히 답변 주시어 정말 감사드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
FindPlayer 외부에서 호출
JobQueue 강의 14분 쯤에 FindPlayer같이 GameRoom과 관련된 함수들은 완전 엉뚱한 외부에서 호출되면 크래시가 난다고 하셨는데, 이부분이 이해가 잘 안됩니다. 이제 따로 주방장이 있으니 일감을 던져주기만 하는 식으로 로직의 스타일이 변한거는 알겠는데, 전혀 엉뚱한 곳에서(ClientSession) FindPlayer를 호출 한다고 하더라고 주방장은 주방장대로 JobQueue에 담긴 일을 처리하고 있고, FindPlayer를 쌩으로 호출한 스레드는 알아서 FindPlayer를 처리할 것 같고, FindPlayer의 경우는 또 _players(Dictionary)를 foreach로 순회하면서 Read만 해서 Lock을 안걸어줘도 문제가 안될거 같은데 왜 쌩으로 호출을 하면 안되나요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
유니티 package Manager 창이 정상적으로 뜨질않는데 왜 그럴까요?
이렇게 빈창만 나오네요 아무것도 없는 빈프로젝트를 만들어도 똑같이 빈창만 뜨더라구요 혹시나해서 2020.3.6f버전 빈프로젝트를 생성하니까 여기서는 잘뜨더라구요 유니티 버전을 이 버전으로 바꿔서 해야할까요? 아니면 다른 해결책이 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
protobuf 적용 중인데 ToByteArray() 가 지원되지 않습니다.
https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.3 해당하는 사이트에서 protoc-3.12.3-win64.zip 파일을 다운로드 받고 강좌대로 설치했습니다. preson 객체를 만들고 진행하는 중인데, preson.ToByteArray() 가 적용이 되지않아서 다음을 진행하기가 어렵습니다. 혹시 방법이 있을까요? 강의 시간 23:18 쯤 됩니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강사님 질문있습니다
대규모 rpg서버인걸 고려할때 1. 맵이동을 구현할려고하면 제가 생각하기에는 3가지 방법이 나오더라구요 첫번째로, 한씬에서 여러맵을 붙여서 플레이어 좌표를 이동한다 두번째로, 프리팹으로 하나씩꺼낸다 세번째로, 맵마다 씬하나를 생성해 맵이동을하면 씬이 바뀐다. 어떤 방식을 주로 활용하나요? 2. 일대일대전이나 파티퀘스트같은 컨텐츠경우 맵이 하나로 구현되어있잖아요 (예를 들면 와우 던전) 같은경우에 파티를 이룬사람들만 보이게 되고 각각 다른파티들의 진행상태가 수시로 다를껀데 이것의 경우 파티마다 쓰레드를 생성하여 파티구성원들에게만 패킷을 보내주는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Util이 참조가 되질 않습니다.
Util 이 참조되지 않습니다. 따로 설정해야할 것이있나요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강사님 질문드립니다
지금은 화살이 위아래로 논타겟팅으로 구현되었는데 타겟팅 스킬이나 나중에 기획이 바껴서 화살이 타겟팅된 적에게만 나가는 방식으로 구현하려면 vector3int 를 vector3로 바꿔서 구현해야하나요?? 즉 대각선에 있는적도 타겟팅이 된다면 공격이된다는 식으로 구현하려면 어떤식으로 해야할지 힌트부탁드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이동 동기화 관련 문의
안녕하세요. 좋은 강의 잘 보고 있습니다. 이동을 할때 패킷을 한칸 이동하는 애니메이션이 끝날때 보내는 것으로 설명하신거 같은데요. 이동 시작할때 보내는 것과 차이가 있을까요? 예를 들면, 나와 상대의 위치 사이에 한칸의 빈 공간이 있고, 거의 동시에 (상대가 미세하게 먼저 이동) 빈 공간으로 이동한 경우라 하면... 이동 애니메이션이 끝났을 때 패킷을 보내게 되면 나의 캐릭터가 빈공간에 거의 도착을 했을 때 상대 이동 패킷을 서버에서 받게 되므로 내 위치가 원래 위치로 복귀하게 되고 상대가 이동을 시작하게 되는 것 같네요. 만약 이동 시작할 때 패킷을 보내는 경우라면 나의 캐릭터가 이동중에 패킷을 받게 되므로 상대 캐릭터도 이동하여 빈공간에서 겹쳐보이다가 서버 판정으로 내 캐릭터가 원래 위치로 복귀하게 될 거 같네요. 이렇게 생각하는게 맞는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Player의 MoveDir, PosInfo 관련 문의 (C_MoveHandler)
안녕하세요?좋은 강의 제공 주셔셔 감사합니다. 코드를 따라 가면서 궁금한 사항이 있어 글 남기게 되었습니다. 서버와 클라가 서로 연결 될 때 ClientSession.cs의 MyPlayer의 정보가 MyPlayer.Info.PosInfo.State = CreatureState.Idle; MyPlayer.Info.PosInfo.MoveDir = MoveDir.None; 으로 정의 되는걸로 보입니다. (코드 하단) public override void OnConnected(EndPoint endPoint) { Console.WriteLine($"OnConnected : {endPoint}"); MyPlayer = PlayerManager.Instance.Add(); { MyPlayer.Info.Name = $"Player_{MyPlayer.Info.PlayerId}"; MyPlayer.Info.PosInfo.State = CreatureState.Idle; MyPlayer.Info.PosInfo.MoveDir = MoveDir.None; MyPlayer.Info.PosInfo.PosX = 0; MyPlayer.Info.PosInfo.PosY = 0; MyPlayer.Session = this; } RoomManager.Instance.Find(1).EnterGame(MyPlayer); }궁금한 사항은 하기 부분 입니다. 연결 된 이후에 MyPlayer가 어디서 변경 되기에 public static void C_MoveHandler(PacketSession session, IMessage packet) 에서 session 정보를 받아다가 쓸 수 있는지 알 수 있을까요 ?? ㅜㅜ 특히 C_MoveHandler 코드 중에서 PlayerInfo info = clientSession.MyPlayer.Info; 부분이 이해가 안되는데, 현재 MyPlayer가 정보 중 Move Dir 은 None으로 계속 유지되고 있는게 아닌가요 ? 어디서 MyPlayer정보가 업데이트 되는지 알 수 있을까요 ? ㅜ //일단 서버에서 좌표 이동 PlayerInfo info = clientSession.MyPlayer.Info; info.PosInfo = movePacket.PosInfo; //다른 플레이어한테도 알려준다. S_Move resMovePacket = new S_Move(); resMovePacket.PlayerId = clientSession.MyPlayer.Info.PlayerId; resMovePacket.PosInfo = movePacket.PosInfo; clientSession.MyPlayer.Room.Broadcast(resMovePacket);