월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
3D 게임 이동 동기화
안녕하세요 파트 3부터 9까지 전부 완강을 하고 지금은 3D MMO를 제작하고 있는데 이동 동기화에 관련해서 질문이 있어 글 남깁니다. 현재 제가 구상한 것이 올바른지 확신이 서지 않습니다. 흐름은 다음과 같습니다.플레이어는 A,B가 있다고 했을 때(클라이언트) 1. A가 만약 지정한 좌표(마우스 우클릭 등의 입력으로 이동을 원하는 좌표)로 가고 싶다면 그 좌표가 이동 할 수 있는 위치인지 클라이언트에서 선 판별하고 갈 수 있다면 서버로 지정한 좌표 값을 패킷으로 보냄2. 서버에 도착한 좌표 패킷이 이동 할 수 있는 위치인지 한번 더 판별한 뒤 정상적인 좌표라면 같은 공간에 있는 클라이언트 A,B에게 A의 이동 허가 패캣을 보냄3. 이동 허가 패킷을 받으면 A는 본인을 B는 A객체를 Navigation mesh를 통해 길을 찾아 목적지로 이동.4. A가 목적지에 도착하면 서버에게 도착 좌표를 건네주고 서버에서 그 값이 초기 목적지랑 같은 좌표인지 확인해서 검증함.현재는 이렇게 구상하고 있는데 서버쪽에서 길찾기 연산을 하지 않고 클라쪽 Naviagtion Mesh에 의존해도 되는지 궁금합니다.만약 서버쪽에서도 길찾기 연산이 필요하다면 클라에서 Navagation mesh로 bake한 값을 서버쪽에서 파싱해서 같이 연산을 해줘야할까요?3D에서 이동 동기화(롤이나 스타처럼) 하는 부분을 어떻게 구현해야할지 감이 잘 안잡히네요.항상 좋은 강의 감사합니다.!!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
GameLogic 쓰레드에서 모든 GameRoom을 처리하나요?
안녕하세요.강의를 듣다보니 궁금한 점이 생겨 질문 남깁니다.GameLogic을 담당하는 쓰레드가 있고 이 쓰레드에서 모든 GameRoom(GameRoom이 여러개 있을 때)의 코드들을 전부 실행하는게 맞을까요?? GameLogic에서 Update를 통해 자신의 Job을 Flush함과 동시에 소유한 GameRoom의 Update를 통해 쌓은 Job을 처리한다고 이해했습니다.그렇기 때문에 부하가 큰 Send 등의 처리를 다른 쓰레드(GameLogic 쓰레드에서 다른 쓰레드로)에게 넘기는 작업을 한거로 생각합니다.그런데 위처럼 하면 만약 GameRoom이 많아진다면 속도가 매우 느려질 거 같은데 따로 처리할 수 있을지 궁급합니다.제대로 이해하지 못하고 질문을 남겨 문맥이 이상할 수 있으니 감안해주세요 ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
Async와 Job방식의 차이가 궁금합니다.
이전 강의에서 PacketHandller 부분에서 Async를 사용하지 않고 Blocking 방식을 사용하는 이유가 EAP 기반이기 때문에 이미 패킷마다 할당된 쓰레드에 의해 I/O가 이루어지기 때문이라고 이해했습니다.하지만 GameRoom같은 경우엔 GameRoom 담당 쓰레드가 존재하고 GameRoom 쓰레드의 동기화를 위해 JobSerialize를 이용하여 각 쓰레드가 GameRoom의 Job을 Push하여 동기화를 진행하는데이때 Job 안에서 DB I/O가 Blocking으로 이루어질 경우 GameRoom 쓰레드가 Blocking이 되고 그렇게되면 GameRoom이 느려지는 상황이 되기때문에 DB I/O 전용 쓰레드(JobSerialize)를 만들어 쓰는것으로 이해했습니다.결국 개념적으로 봤을때 GameRoom 쓰레드는 메인쓰레드 역할을 하고 DB I/O 처리는 서브쓰레드에게 맡기고 완료됐을때 결과만 다시 메인쓰레드에 돌려받는 NonBlocking I/O 방식인데Async/Await 역시 호출한 쓰레드를 Blocking 하지 않고 서브쓰레드에게 I/O를 맡긴뒤 작업이 완료되면 메인쓰레드에 결과를 반환하여 Await 이후에 처리한다고 이해하고 있습니다.그렇다면 복잡하게 DB I/O 전용 쓰레드를 만들어주지 않고 Async/Await만 사용해도 될것같은데 이렇게 하는 이유가 있을까요?아니면 이후에 강의에 이에 대한 개선이 나오는걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
EF사용시 async사용
EF 변경사항을 저장할 때 SaveChangeAsync가 아닌 SaveChange를 사용하게되면 해당 쓰래드는 blocking이 발생할텐데 괜찮나요? 제 추측으론EAP 기반 IO 통신이기때문에 어차피 패킷요청마다 개별의 쓰래드에서 처리가되니 굳이 async를 사용안해도 다른 패킷(Thread)에 대한 blocking이 이러나지 않으니까 그냥 SaveChange를 사용한건가? 라고 생각하긴 했는데 선생님의 답변을 듣고싶습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
해당 강의를 듣고있는 학생입니다.
강의를 기반으로 포트폴리오를 만들고있는데요. 파티를 만들어서 던전에 입장할때 하나의 새로운 Room으로 만들고그 Room에 들어온 파티원들을 새로운 던전Scene으로 이동시킬때. Unity에서 scene전환을 동기시킬 방법이 뭐가있을까 궁금하여 질문드립니다. 항상 좋은강의 올려주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
해당 강의를 완강하면 실제 여러 대 PC의 환경에서 MMO구현이 가능할까요?
안녕하세요. 간단히나마 실제 멀티게임 구현을 목표로 이전 강의(Part7)들 듣고 있습니다. 아직 Part7을 듣고 있어서 그런데 해당 강의 Part9를 들으면 실제 서버 전용 PC를 두고 여러개의 클라PC가 각 .exe파일을 실행하는 환경을 구축하는 내용이 포함되어 있을까요? 만약 그렇지 않다면, 다른 강의에서는 혹시 위 내용이 포함된 강의가 있을까요? 루키스님은 물론이고, 다른 수강자 선배님들, 인프런 AI 인턴 답변 모두모두 환영합니다. 답변 미리 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
Room마다 Thread를 만들기
안녕하세요 루키스님 덕분에 서버개발자로 취업하였습니다.루키스님의 강의를 체화하기 위해서 간간히 코드를 보면서 잊어먹을랑 말랑한 것들을 다시 강의로 듣곤 합니다그러다가 아래 코드를 보면서 문득 의문이 들었는데요.while(true) { GameLogicTask.Instance.Update() }게임 실행 시 위 로직을 타면서 메인쓰레드 하나서 모든 Room의 Update를 담당하고 있는데Room에 유저수가 많아지게 되면 메인 쓰레드에 점점 부하가 더 많아지는게 아닌가해서 질문을 드립니다.메인쓰레드 부하가 많아지면 컨텍스트 스위칭이 생겨도 Room마다 Thread를 생성하여남은 자원을 Update가 바쁘게 돌아가는 Room쪽에 쓰레드를 조금 더 할당해 주어도 될까요?(밑에 질문에 답변해 주셨네요 ^^; Room마다 쓰레드를 더 만들겠습니다.) 심리스 월드에서 Actor마다 JobSerializer를 할당하는 방법을 쓰면,쓰레드를 너무 많이 만들게 될것 같은데 컨텍스트 스위칭 외에 또 생기는 성능적인 사이드 이펙트를 뭘 또 고려하면 좋을까요?Actor마다 JobSerializer를 쓴다고 하면 Actor단일로서는 lock을 걸지 않아도 되지만서로 상호작용이 일어나는 상황에서는 어쩔수 없이 lock을 걸어줄수 밖에 없을 것 같은데, 그러면 결국은 JobSerializer를 쓰지 않아도 되지 않나 부족한 지식으로 어렴풋이 생각이 듭니다.또한 JobSerializer를 Flush 하기 위해선 Actor마다 while(true) 루프를 돌면서 계속해서 잤다가 깼다가 확인 하는 과정과 컨텍스트 스위칭비용이 점점 더 늘어날 것 같은데 이런 비용을 감안하면서 사용하는 것인지요. 아니면 딱히 신경쓰지 않아도 될만한 부하인지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
DB연동, Connector, Session, Packet
안녕하세요. 강의 정말 잘 듣고있습니다.DB연동 부분에서 궁금한 점이 있어서 질문드립니다. 네트워크는 사용하지 않고, DB만 사용하는 게임을 만드려고 합니다. Connector로 Server와 Client를 연결하고, Session을 두고 Packet 을 보내는 작업이 꼭 들어가야 하나요?EFCore를 사용하려면 꼭 해야 하는 부분일까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
20분35초 Broadcast 관련 질문 입니다.
안녕하세요. Broadcast에서 패킷을 보낼 때 마다 컨텍스트 스위칭이 일어난다 하신게 이해가 어렵습니다.현재 코드에서 GameRoom이 JobSerializer의 상속을 받아서 모든 행동을 큐에 넣고 특정 타이밍에 현재 쌓여있는 큐에 있는 내용을 실행합니다.특정 타이밍에 GameRoom을 Flush하려고 접근한 스레드가 쌓여있는 큐에 있는 행동을 모두 수행하면서 쌓여있는 Broadcast들도 모두 수행하는데, 여기서 어떻게 컨텍스트 스위칭이 일어나는지 모르겠습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
Cannot resolve destination host 오류가 뜹니다
AccountServer #2 강좌에서 유니티 클라와 웹서버 연동 테스트하는 부분이 있는데테스트로 GameScene에다가 다음 두줄을 넣고 테스트하는 부분입니다. Managers.Web.BaseUrl = "https://localhost.5001/api"; WebPacket.SendCreateAccount("AAA", "1234"); 브레이크 걸고 확인해보니 웹서버에는 CreateAccount([FromBody] CreateAccountPacketReq req)가 실행조차 되지 않았습니다.웹서버에 연결 자체가 안되는 것 같은데 구글에 쳐봐도 잘 모르겠고어디가 문제인지 모르겠습니다.심지어 웹서버쪽 코드와 유니티쪽 WebManager.cs, Webpacket.cs 코드는 죄다 복붙으로 만들어서 오타가 있을 리가 없을텐데...로그가 생긴 함수는 다음과 같습니다.uwr.isNetworkError가 true라서 로그가 발생했습니다. IEnumerator CoSendWebRequest<T>(string url, string method, object obj, Action<T> res) { string sendUrl = $"{BaseUrl}/{url}"; byte[] jsonBytes = null; if (obj != null) { string jsonStr = JsonUtility.ToJson(obj); jsonBytes = Encoding.UTF8.GetBytes(jsonStr); } using (var uwr = new UnityWebRequest(sendUrl, method)) { uwr.uploadHandler = new UploadHandlerRaw(jsonBytes); uwr.downloadHandler = new DownloadHandlerBuffer(); uwr.SetRequestHeader("Content-Type", "application/json"); yield return uwr.SendWebRequest(); if (uwr.isNetworkError || uwr.isHttpError) { Debug.Log(uwr.error); } else { T resObj = JsonUtility.FromJson<T>(uwr.downloadHandler.text); res.Invoke(resObj); } } } 유니티 로그는 다음과 같습니다. Cannot resolve destination hostUnityEngine.Debug:Log (object)WebManager/<CoSendWebRequest>d__5`1<CreateAccountPacketRes>:MoveNext () (at Assets/Scripts/Managers/Contents/WebManager.cs:46)UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
17분 30초 부분 질문드립니다.
안녕하세요 선생님, 항상 좋은 강의 감사드립니다.다름이 아니라 강의 17분 30초경에S_CreatePlayer newPlayer = new S_CreatePlayer() { Player = new LobbyPlayerInfo() };newPlayer.Player.MergeFrom(lobbyPlayer);부분에서 질문드립니다.여기에서S_CreatePlayer newPlayer = new S_CreatePlayer() { Player = lobbyPlayer}; 와 같이 위에서 만들어 놓은 lobbyPlayer를 바로 사용하여 코드를 작성하지 않고, 새롭게 LobbyPlayerInfo 객체를 생성해 MergeFrom(LobbyPlayerInfo)를 하는 방식으로 해야 하는지가 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
비밀번호 암호화 질문
안녕하세요 강사님!다름이 아니라 비밀번호 암호화와 관련한 질문이 있습니다.실제로는 비밀번호 암호화가 필요할텐데 일반적으로 클라에서 비밀번호를 암호화 한 상태로 서버에 넘기는지, 클라에서는 비밀번호를 쌩으로 넘기고 서버에서 암호화를 해서 DB에 저장하는지 궁금합니다 !
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
아이템 드랍 확률 조정 질문
안녕하세요 강사님! 다름이 아니라 지금 강의에서는 probability를 백분율 기준으로 세팅한다고 하셨는데 만분율이나 1억만분율 기준으로 세팅하고 싶으면 코드의 어느부분을 손대야하는건지 궁금합니다. 사실 지금 백분율 기준으로 세팅했다고 하셨는데 그 부분도 어디서 세팅하는건지를 모르겠어서..ㅠㅠ 급한 마음에 질문이 앞서 이와 관련해 뒷 강의 부분에 나오면 그거 참고해서 하겠습니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
서버가 로직 도중에 중단되는 상황을 테스트가 가능할가요?
6분쯤에 코드가 중간에 서버가 크래시 나거나 db실행이 도중에 중단되어 로직이 반만 실행됬을때 ~ 라고 하셨는데 바쁘다보면 정신놓고 기계적으로 코딩하는 상황이 올테고 그러다보면 저런 실수가 충분히 가능할거 같은데 발생한다쳐도 테스트가 너무 어려울거 같더라구여.. 혹시 코드에 도중에 멈추면 큰일나는짓을 했는가 같은걸 알수있는 방법이 있을까요? 혹은 회사에서 실무코딩 하시는분들은 저런걸 테스트 가능한 환경이 구성되어 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
마우스 이벤트 처리방법(오브젝트간 인터렉션)
안녕하세요. 강의 잘 보고 있습니다.마우스 이벤트 처리 관련해서 현업에선 어떤식으로 처리하는지 궁금해서 여쭤봅니다.(web개발자라.. 게임개발은 생소하네요.) 먼저 구현하고 있는 게임은 2d mmo 게임입니다. mmo 필수 마우스 이벤트들이 있을텐데요.. 가령 상대방 케릭 또는 몬스터 좌클릭(공격), 우클릭(스킬공격) ui 상에서 아이템 클릭 후 타 케릭쪽으로 드롭하는 행위 등.. 이벤트 처리시 자신의 케릭정보와 클릭?된 오브젝트간에 데이터를 가지고 공격로직같은걸 구현해야할 것으로 보입니다. 구글링해보니 gameobject 에 마우스이벤트 처리를 위해 onenter 와 같은 핸들러를 구현 할 수 있더라구요.. 오브젝트 마다 하나하나 구현하자니 다른 방법이 있을거 같아 혹시 다른 방식이 있는지요?(제가 생각해본건 마우스이벤트 처리 클래스 생성 후 오브젝트에 마우스 이벤트 핸들러에서 이벤트를 넘겨줄때 해당 오브젝트 정보를 넘겨 처리하면 되지않을까.. 라고 어렴풋 생각해봤습니다.) 현업에선 어떻게 처리하는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
RecvArgs_Completed에서 lock을 안하는 이유
RecvArgs_Completed에서 lock을 안하는 이유는 하나의 클라이언트당 하나의 thread로 recv를 받기 때문인가요?그래서 PacketHandler에서 연관된 작업을 모두 처리한 후 (공유 자원을 참조할 땐 job으로만 저장)다시 RecvArgs_Completed으로 돌아와 RegisterRecv를 호출 하여 threadpool에서 하나의 thread로 recv를 받는게 맞나요?recv는 하나의 thread로만 작업하는지 궁굼합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
Entity framework 질문드립니다.
entity framework로 db 생성하면 sqlserver에는 만들어지지 않나요?보통 프로젝트 할 때 ado.net와 entity 중 어떤 걸 많이 사용하는지 궁금합니다.(다른 방법이 있다면 키워드만 알려주실 수 있으면 감사하겠습니다.) 제가 질문드리는 이유는 sqlserver에서 직접 테이블을 만들고 프로시저등을 만들어서 프로그램과 연동하고 싶기 때문입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
json 직렬화
제가 작업을 하다가 키 값이 프론트 코드에 그대로 남는게 조금 그렇기도 하고 보안을 강화하고 싶어서키 값을 json 파일로 보관하고 유니티에서 로드해서 읽어오는 방식(이게 직렬화 맞죠?ㅎ)으로 변경한 후에빌드를 했습니다.azure를 이용한 key vault 라는 서비스가 있다는 걸 알게됐지만이정도만 해도 어느정도 보안성이 있을까요?? 이렇게 하면 장점이랑 단점은 뭘까요답변을 드릴만한 분이 없으셔서 여쭤봅니다 루키스님!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
mmo 와 pvp
이번 강의를 통해 하나의 메인스레드와 여러가지 특정일들을 나누어 다른 스레드에서 담아놓고 효율적으로 사용할수있도록 변경이된것같은데요 저같은 경우 클래시로얄과 비슷한 인디게임을 먼저 제작중에있는데 제가 지금 생각하는 방향으로는 게임 입장 쓰레드 게임판정 쓰레드 그리고 각각의 룸마다 쓰레드를 재생성 하여 만들면되는것인지 혹시나 다른 방법이있을까 궁금하여 질문 드립니다. 아 한가지더 여쭤보고싶은것은 로비같은경우 게임과 무관하게 뽑기와 캐릭터 레벨업 같은경우 디비에 넣고 빼기를 하나의 트랜잭션으로만 사용하면 될거같은데요 이부분도 따로 쓰레드를 만들어 푸쉬와 같은 방식으로 해야할필요는 없는것같은데 맞을까요? 왜냐하면 트랜잭션 한번으로 모든데이터를 털어버리는 방식으로 다른 유저가 관여하지 못하게 하려고 합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
github로 프로젝트를 push, pull할 때 질문
안녕하세요 강사님이번에 대형구조 베이스로 해서 프로젝트를 깃허브에 올려놓고 사용중인데요. 노트북으로 하다가 데스크탑 포맷하고 다시 pull한 후에 실행시켰더니 에러가 많이 뜨더라구요.그대로 테이블 만들어주고 해봤지만 사진처럼 에러가 뜨던데 깃허브로 프로젝트를 관리할 때 데이터베이스에 있는 유저, 아이템, 계정 등의 정보는 어떻게 연동할 수 있을까요?