월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
오브젝트 생성에 관련해 질문이 있습니다.
예를 들어, 지금처럼 화살을 생성할 때, 서버는 화살이 자신의 Owner를 알지만, 클라에서는 자신의 Owner를 모르는데, 만약 알아야 한다면1. 지금처럼 클라의 ObjectManager - Add() 함수에서 생성할 수 있도록 ObjectInfo에 OwnerId를 추가2. 클라의 Packethandler는 playerId를 알 수 있으니 Packethandler에서 오브젝트를 생성3. 아예 클라에서 Owner를 알 필요없게 코드를 수정어느 방법을 추천하시나요?현재 오브젝트 생성을 Onwer 오브젝트가 가지고 있는 스크립트에서 생성을 하던 방식이어서 여쭤봅니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Json파일의 정보를 proto의 내용으로 DataContents와 연동하는 것을 Unity에서 하는 것이 가능한지 궁금합니다
9:00분 부분처럼 선생님 말씀대로 진행하여 Server 프로젝트 쪽에서는 Json파일의 내용을 .proto에 구현한 StatInfo로 바로 넣는 것이 문제 없이 작동합니다.-protocol.proto-SkillData.Json-DataContents.cs in Server project 그러나, Unity Client 내에서 위 방식으로 데이터를 읽어들이려고 시도하면 데이터가 전혀 들어오지 않고 인게임내에서 사용도 불가능하여 혹시 무언가 다른 부분이 존재하는지 여쭤보기 위해 질문 남기게 되었습니다.-Unity DataMgr.cs-Unity DataContents.cs 혹시 경로나 Json파일 이름 문제인가 싶어 고민해봤지만, Proto파일의 StatInfo를 쓰는 것이 아닌 원래 방식대로 Data modeling하고 그를 사용하면 문제없이 데이터가 받아지고 해당 데이터 사용이 가능한 상태라 그 문제는 아니라고 판단하고 있습니다.Unity 내에서도 proto로 바로 사용이 가능한지, 가능하다면 혹시 추가적인 주의사항이 있는지 여쭤보고 싶습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
git, server, client 파일을 어떻게 넣어서 프로젝트를 생성해야하나요?
구름모양을 눌러서 MMO_Game시작.zip파일은 다운로드했는데, 이걸 드래그해서 프로젝트란에 넣으니까 오류가 뜨는데 어떤식으로 유니티에 적용시켜야하는지는 설명에 나와있지 않아서 ..아시는 분 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
홀펀칭 질문도 괜찮을까요..?
안녕하세요, 루키스님유익한 강의 제공해주셔서 감사합니다항상 감사한 마음으로 수강하고 열심히 프로젝트를 진행해보고 있습니다.현재 프로젝트에서메인 서버에서는 모든 클라 게임 접속을 받고 로그인 및 방 입장 등을 관리합니다.클라가 게임룸을 생성하면 해당 클라에 Host라는 오브젝트가 생성되고, 해당 오브젝트는 서버 코드를 유니티에 호환되도록 수정을 거친 상황입니다.타 클라(로컬 네트워크 환경에서만 테스트 해보았습니다.)에서 방 목록에서 방을 선택하고 입장하면 중앙 서버에서가 호스트와 클라 사이에서 IP와 포트를 알려주는 중개 역할을 하며 두 클라이언트가 연결됩니다.해당 게임의 사이클이 끝나 게임이 종료되면, 클라이언트들은 로비로 돌아가며 1~3의 단계가 계속해서 반복됩니다.현재 프로젝트의 조건을 위와 같이 설정하였고,3번까지는 테스트를 완료했고, 정상적으로 동작하는 것을 확인했습니다. 하지만 4번에서 문제가 발생하는데,다시 방을 생성하면 클라와 호스트 사이에 패킷 전송이 되지 않는 것 같습니다.디버깅을 통해 확인해볼 때에는 호스트측의 OnConnected 메서드는 호출되는 것으로 보아서는 클라측에서 연결에 문제가 발생하는 것 같은데,구글링과 디버깅을 통해 여러가지 해결책을 시행해봤습니다.연결 종료 시 완전히 소켓이 종료되도록 세션 Disconnect()를 했습니다.소켓이 같은 주소의 포트 번호를 공유할 수 있도록 Connector와 Listener 코드의 소켓 설정 코드에Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);이렇게 ReuseAddress 설정을 추가했습니다.(중앙 서버 세션과 호스트 세션은 클라에서 개별적으로 다루고 있습니다)호스트 세션의 연결이 종료될 때, 호스트 세션의 _disconnected 변수를 다시 0으로 만들어,다음 연결 시 RegisterRecv등의 코드에서 if(_disconnected == 1) return;의 조건문에 걸리지 않도록 코드를 수정해보았습니다.2번의 방법을 시행해보기 전에는 '같은 주소의 포트를 사용할 수 없습니다?'와 같은 오류가 발생했었는데,2번을 시행한 뒤에는 오류는 발생하지 않지만 연결이 되지 않는 것은 마찬가지인 상태입니다.그 외에도 잡다하게 정말 많은 시도를 해보았는데,전혀 실마리가 보이지 않아 질문합니다..ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3D 위치 동기화에 대한 질문
안녕하세요. 지금 파트 9까지 전부 수강하고 3D 게임을 제작하고 있습니다.현재 목표는 마우스로 우클릭를 하면 해당 좌표로 플레이어를 이동하는 것입니다.질문은 크게 두가지입니다. 현재는 클라이언트에서 마우스를 우클릭하면 Unity에서 제공하는 NavMesh를 통해 이동하고 있습니다. 그런데 서버에선Unity에서 제공하는 기능을 사용할 수 없기 때문에 따로 길 찾기 연산을 해야 할 것 같은데 이 부분이 감이 안 잡힙니다...서버에서 길 찾기를 어떤 방식으로 해야할까요?클라에서 추출된 NavMesh를 서버쪽에서는 활용할 수 없을까요?? 가령 SharpNav등을 통해서요!무지한 질문을 많이 하는데 항상 성심껏 대답해주셔서 감사합니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
PacketHandler.cs의 PlayerInfo info 변수 질문
PlayerInfo info 변수를 어떻게 쓰는지 모르겠습니다.밑의 코드에서 쓰이지 않았고 달리 사용하는 부분이 없어보이는데아니면 위의 코드만으로 변화하는 부분이 있는건지 잘모르겠습니다. 밑의 코드 - 두 번째 주석 밑의 코드들위의 코드 - 첫 번째 주석 밑의 코드들
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
MMO 컨텐츠 구현의 MapTool에서 Util클래스 정보
이전 강의를 구매를 안해서 그런데, 만들어둔 Util클래스에 대한 코드는 어디서 확인할 수 있나요? 강의자료탭이 안보여서요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
GameRoom 질문드립니다.
안녕하세요. 강의 잘듣고있습니다.! GameRoom을 하나의 스레드로 jobqueue를 사용해서 공유자원을 관리 하면 lock에서는 자유롭지만 하나의 스레드인 만큼 많은 처리를 해야할 경우 딜레이가 생길수도 있을거라고 생각하는데 lock을 타이트하게 거는 방법보다 하나의 스레드에서 처리하는게 속도가 더 빠른가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3D fps 제작 중 질문이 있습니다.
모든 계산은 서버에서 하고실제로 클라이언트는 보여주는 역할만 한다고 배웠습니다.여기서 궁금한점이 있는데유니티는 collider를 만들어서 충돌처리를 하는데서버는 따로 유니티를 통해 키는것이 아니라서 collider게산이 쉽지 않을 것 같다는 생각이 들었습니다. 총의 충돌판정을 검사할 때 총알의 현재위치와 총알의 이전위치를 이용해서 선을 만든 후 충돌처리를 하려고 하는데 여기서 플레이어의 머리 몸통 다리 팔을 각각 collider로 나누고싶다면 직접 서버에서 머리 몸통 팔 다리 위치와 collider를 구상하고 collider를 직접 구현하고.. Raycast를 직접 구현해서 사용한다충돌 계산 및 유니티 기능 이용을 목적으로 하는 클라이언트를 따로 제작한 후 각 위치에 collider를 직접 생산하고 유니티에 있는 기능을 이용한다.플레이어의 모든 위치는 동기화 되어있을테니 총알을 쏜 당사자의 컴퓨터에서 충돌판단을 한 후 서버로 충돌여부를 전달한다보통 어떤 방식이 맞는건가요? 흔히 실무자들이 말하는 모든 계산을 서버에서 한다는 말이 당장 개개인의 클라이언트에선 collider조차 만들지 않는다는 느낌인건가요? 그리고 만약 점프를 한다면점프에서 계산마다 올라가고 내려가는걸 서버에서 직접 계산한 후 (9.8중력, 이동속도 등..) 각 플레이어에 동기화시켜주는게 맞는걸까요?아니면 각 클라이언트의 Rigidbody를 이용해서 계산된 높이값을 서버로 전달하는게 맞는걸까요? 로컬상 이동 - 서버로 전달 - 동기화로컬상 이동명령 - 서버에서 이동계산 - 동기화 및 블랜딩 이 강의에선 2번케이스 같은데 3d게임은 1번이 더 나은 것 같기도 하고 해서 질문드립니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이 강의의 완성본을 커스텀하면 포폴 메인 수준이 가능할까요?
안녕하세요? 오늘은 양해를 구하면서 조금 모호한 질문을 들고 왔습니다. 제목대로 완성본을 커스텀하면 메인 포폴로 내세울 수 있을정도인지 궁금합니다.제가 수강한 강의는 C# Part4. 서버와 Part7. 유니티 연동 입니다. 물론 커스텀 과정에서멀티스레드 이해TCP 통신 과정 이해클라이언트 <--> 서버 간 패킷 송수신 및 로직 이해은 어느 정도 되었다고 자신하고 있고, 저의 주요 변경 사항은Zone 단위 개념 삭제Zone 개념 삭제에 따른 모든 방향 이동 및 모든 방향 투사체 발사이동_Packet / 발사_Packet 등의 결정 주체 변경- ex) 강의에서 결정 주체가 클라이언트였으면, 저는 서버가 결정하도록 변경탑다운 슈팅 게임 방식의 배틀 로얄 컨셉프로토타입 수준의 완성도 (아래 사진)이 정도면 포폴 메인으로 써먹을 수 있을지 조심스럽게 질문 올립니다.. ㅎㅎ답변 미리 감사합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
ServerCore 일부 복붙하는걸 심볼릭링크로 해도 괜찮을까요?
유니티 측에서 사용자정의 심볼을 넣어서위 사진과 같이 전처리기를 사용해Server측에서는 Console.WriteLineClient측에서는 Debug.Log이 호출되도록 구성하였습니다. 에디터상에서 실행하는것까지는 크게 문제없이 잘 되는 것 같습니다! 이러면 어느쪽에서든 로직 사소하게 변경해도복붙 까먹는 일이 없어 좋아보이는데혹시 퍼블리싱단계나 추후에 크게 문제될 부분이 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
15:09 GenPackets.bat
15:09초까지 똑같이 따라하고그래서 최신 버전도 protobuf를 받아서 해봤지만아무리 다시 해보고 찾아 보려해도 아무것도 뜨지 않는데 이유를 알 수가 없습니다 ㅠㅠㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
혹시 게임을 시작할 때 애니메이션이 움직이는거로 시작하는데
22:24의 부분에서부터 말씀해주시는 것 중 루키스님께서 말씀하신것은 2개인거로 사료됩니다.Start에 원하는 애니메이션 플레이 코드 삽입움직일 때 None이 되면 가만히 있는 코드를 역이용하여 사용.이렇게 있는데 잠깐 애니메이터를 만지다가 알게 된 건데 애니메이터의 'Entry' 블록에서 Default state를 IDLE_RIGHT와 같이 원하는 항목으로 지정해도 되더라구요. 혹시 현업에서는 어떻게 이용하는지 궁금합니다.1, 2번처럼 하게 될 때 걱정되는 점은 만약에 도중에 애니메이션 파일 이름을 변경하게 될 때 코드에서 까지 바꿔야 되는 점이 염려스럽습니다.나중에는 애니메이션 파일이 하나 뿐만이 아닐텐데 그것을 일일이 찾기도 어려울 것이라고 판단했습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
리슨서버(호스트) 질문입니다
안녕하세요, 루키스님.개인 프로젝트를 진행하는 중 리슨서버를 구현해보려고 하는데 몇 가지 궁금한 점이 있습니다.리슨서버를 구현하려면 서버 코드를 모두 클라이언트에 이식하고, 컴포넌트로 관리할 수 있도록 수정해야 하나요?만약 1의 가정이 맞다면, 1을 통해 구현된 서버에서 유니티엔진의 기능들을 사용할 수 있지 않을까 생각이 되는데, 만약 된다면 충돌과 관련된 부분을 처리하는데 활용해도 괜찮을까요?유니티 자체에서도 네트워크를 관리해주는 매니저를 제공하는 것으로 알고있는데, 강의처럼 따로 서버를 구현하는 이유는 역시 성능 때문일까요? 현재 생각 중인 방식이 어몽어스와 유사한데요.중앙 서버에서 방을 생성하는 유저(호스트)들의 ip와 방 정보를 가지고 단순히 방 목록을 관리하며 클라이언트들이 접속할 수 있는 역할만 해주고, 클라이언트가 방에 접속하는 순간부터 모든 처리는 호스트가 하게되는... 구조가 맞을까요? 최근 들어 질문을 자주하게 되는 것 같은데..항상 친절히 답변해주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Tilemap_base에서 맵 크기를 불러올 때
제가 설정한 맵 모양이랑 메모장에 나오는거랑 다르게 좀 더 크게 잡히고 있는데 그 이유를 잘 모르겠습니다Tilemap_Base에 가장 끝부분에 상자를 넣어이런식으로 만든후 tools를 켠 다음 실행을 시키면이렇게 상자가 끝애 나오지만 캐릭터가 있는 앞 칸에서 움직이지 못하게 되는데 왜 그런걸까요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3D의 경우 맵 정보
안녕하세요! 좋은 강의 감사합니다!3D 게임의 경우도 마찬가지로 Map에 대한 정보를 서버에서 가지고 있어야 할 것 같다는 생각이 듭니다.그런데 2D의 같은 경우는 좌표를 통해서 저장할 수 있었지만 3D는 어떻게 Map의 정보를 저장하고 관리할 수 있을까요??구체적인 방법이 떠오르지 않아서 질문 글 납깁니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
점프가 동기화가 되지 않습니다..
안녕하세요! 루키스님 강의를 토대로 2D 플랫포머 형태의 멀티플레이어 게임을 만들어보고 있습니다! 항상 감사합니다. 현재 제가 액션들을 구현하고 동기화를 해보고 있는데,걷기, 뛰기, 구르기까지는 동기화가 잘 되는데 점프가 동기화가 되질 않습니다.. 점프는 Rigidbody2D의 AddForce를 사용하여 작동되고,다른 이동 액션들은 루키스님이 보여주신 방식처럼 다음 프레임의 transform.position을 계산하여 PosInfo에 넣어 패킷을 전송하고 있는데요. 점프는 우선 클라이언트에서 AddForce를 통해 점프를 먼저 한 뒤,현재 위치를 PosInfo에 넣어 패킷을 보내는 방식을 써보았습니다..그런데 다른 빌드의 화면에서 볼 때, 점프 애니메이션만 작동하고 실질적인 점프는 작동하질 않습니다. 디버깅 해보았을 때, 클라이언트 -> 서버로 패킷을 보낼 경우에는 패킷이 정상적으로 송신되는 것으로 보이고,서버 -> 클라이언트로 패킷을 보내는 경우에도 정상적으로 송신이 되는 것 같은데,클라이언트에서 서버에서 받은 패킷을 디버깅 하는 방법을 모르겠습니다.. 좀 오랜시간 붙잡고 있던 문제라 장황하게 늘어놓아 버렸는데, 궁금한 점은 아래와 같습니다.Q. Rigidbody를 사용한 물리 작용(점프)을 패킷으로 보내기 위해서 제가 사용한 방법이 틀린걸까요?(정말 될 것 같은데 왜 안되는지 모르겠네요..)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이동 동기화가 너무 어렵습니다..
안녕하세요 루키스님이번 강의 보고 열심히 따라해봤는데 이상하게 똑같이 동작을 안하네요,, 지금 10시간 넘게 강사님의 코드 차이점을 찾고 있는데 못찾았습니다..혹시 몰라서 코드를 복사해서 직접 갖다 붙여도 비슷한 상황이 나오게 됩니다. 물론 강사님과의 코드와 간소한 차이가 있지만 로직틀은 벗어나지 않았습니다. 그나마 차이를 찾자면 유니티 에디터 버전 차이인것 같은데강사님꺼는 2019.3.15f 이고 제꺼는 2022.3.16f입니다. 제 코드로 서버를 돌리고 버전 바꾸고 강사님 코드로 클라를 돌렸을 때는 잘 작동했었습니다. 하지만 클라를 제 코드로 하면 이상하게 CellPos는 정상적으로 바뀌고 Object.Find로 확인해서 이동이 막히는것 까지는 정상 처리가 됩니다. PacketHandler 에서 여러번 확인해봤는데 MyPlayer와 Player의 id가 다른 패킷을 받는걸 봤습니다. 패킷의 내용도 예상대로 잘 받고 있는데 이상하게 Player컴포넌트를 들고있는 오브젝트만 MoveToNextPos로 이동하지 않습니다. 혹시 예상되는 부분이 있으실까해서 적어봅니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
CanGo()의 검증이 다중인 이유가 있을까요?
루키스님 안녕하세요?본 강의 Hit 판정 #1에서 CanGo()로 플레이어 이동간 검증을 해주셨는데요,GameRoom.cs의 HandleMove()에서 CanGo()를 이미 사용했는데HandleMove()가 ApplyMove()를 호출함으로써 ApplyMove() 내에서 CanGo()를 다시 호출하고 있습니다.코스트낭비지 않을까?하고 의문이 들어 질문 올리게 되었습니다.//GameRoom.cs의 HandleMove() public void HandleMove(Player player, C_Move movePacket) { // ...생략 // CanGo 호출 1 // 다른 좌표로 이동할 경우, 갈 수 있는지 체크 if (movePosInfo.PosX != info.PosInfo.PosX || movePosInfo.PosY != info.PosInfo.PosY) { if (_map.CanGo(new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)) == false) return; } // ...생략 // ApplyMove() 호출함으로써 CanGo 호출2 _map.ApplyMove(player, new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)); // ...생략 } //Map.cs의 ApplyMove() public bool ApplyMove(Player player, Vector2Int dest) { // ...생략 if (CanGo(dest, true) == false) return false; // ... 생략 } 강의 재밌게 듣고 있습니다.미리 답변 감사합니다.수강자 올림.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버의 쿨타임 계산 방식이 이해가 가지 않습니다.
루키스님 안녕하세요?본 강의 스킬#2에서스킬 쿨타임은 서버, 클라이언트 둘다 계산을 하는게 맞고,클라이언트는 코루틴 등을 사용해 쿨타임을 계산하는건 이해가 됐습니다. 그런데 제가 이해한게 맞다면,서버에서 쿨타임을 계산하기 위해 CheckUpdateFlag()를 재활용 한다고 하셨습니다. (그 안에 State Info.가 포함되어 있으므로) 그런데 그게 서버가 쿨타임을 계산하는 것과 무슨 상관이 있는지 모르겠습니다.쿨타임 계산이라는 것이 시간 계산에 국한된게 아닌, State 검증을 통해 조건을 확인한다는 말씀일까요? 강의 재밌게 듣고 있습니다미리 답변 감사합니다.수강자 올림