묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
파일 생성이 안됩니다
15:12 에 GenPackets.bat 파일 실행하면 .cs 파일이 생성이 안됩니다... 내용을 몇번이고 다시 확인하면서 대소문자까지 구별해서 재시도 해봤는데 아무 변화가 없네요 관리자 권한으로 해보고 별걸 다해봐도 아무 변화가 없습니다 Blazor 강의부터 제대로 되는게 없어서 좌절하게되네요...
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
19:00 쯤 Player를 찾고 로그를 남기는 테스트에서
19:00 쯤 Player를 찾고 로그를 남기는 테스트에서 chatPacket.chat를 로그로 남긴 후에 GameObject를 Find할 때 메인 쓰레드에서 사용하라는 예외가 발생합니다. 혹시 제가 잘못 작업했나 해서 올려두신 자료를 받아서 해보아도 똑같이 try catch에서 넘어가질 못하네요 유니티 버전 2021.1.0b1에서 안되서 2019.4.17f1까지 낮춰봤는데도 안됩니다. 무언가를 빠트린거 같은데 찾기가 힘드네요 혹시 조언좀 해주실 수 있을까요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C++ IOCP서버와 Unity Client 연동 관련
안녕하세요. 제가 C++을 이용한 IOCP서버와 Unity C# Client 연동해서 게임을 제작해야하는 상황에 있습니다. 사실 C++로 구현된 서버인줄 알고 구매했는데 C# 서버에 대한 강의인거 같더라구요.. C++서버와 C#을 사용하는 Unity와의 연동 그리고 Unity 자체에 대한 이해도 부족 이것이 저의 가장 큰 걱정거리인데요. 이 강의를 들어면 Unity 서버에 대한 이해도가 생겨서 C++로 독자 서버를 구축하는데 있어서 괜찮을까요??.. 그리고 여쭤보고 싶은것이 있습니다 ㅠㅠ 서버도 배운지 얼마 안되고 더더욱 Unity는 잘 몰르는데 프로젝트는 진행해야하고 처음 서버 설계 과정부터 궁금한 점이 너무 많았고 검색을 해도 잘 나오지 않아서 어려움이 많았고 항상 궁금해했는데 도움을 주시면 정말 감사하겠습니다.. 1. C++을 이용한 IOCP 서버와 Unity C# Client 연동을 위해서 어떠한 것을 고려하고 작업을 해야하는지가 궁금합니다. Byte Stream 외에도 고려해야할 부분이 뭐가 있을까요? 2. Visual Studio와 Unity 연동 이라는 것이 Visual Studio에서 서버를 키고 Unity Client를 키면 접속이 되게 하면 끝인건가요? 처음 기본 환결설정에 대해서도 궁금합니다. 3. Unity는 사실상 싱글 스레드만을 사용할 수 있는 것으로 알고 있습니다. 멀티 스레드가 지원된다고는 하나 유니티 객체에 접근하는 순간 에러가 난다고 알고 있습니다 (주워 들은 내용인데 맞는지는 모르겠습니다) 그런데 멀티스레드 사용이 필요하게 될 경우 유니티에서는 단순한 연산 작업외에는 멀티스레드를 사용하면 안되는 것인가요? 코루틴 이라는 기능이 멀티쓰레드와 비슷하다고 알고 있는데 멀티스레드 기능을 코루틴이 대체해서 사용하면 되는건가요? 4. IOCP서버를 이용하는데 싱글스레드?? 제가 C++ IOCP서버를 구현해야 하는데 이 이유에 대해 타당하게 설명을 해야하는데 저부터가 의문이 듭니다. IOCP를 사용하긴 할건데 Unity에서 멀티쓰레드를 사용하지 못한다면 IOCP로 하는것이 의미가 있을까에 대한 의문입니다. 3번 질문과 연관이 되는 질문이긴 한데요.. 간략하게 제가 만들어야 하는 게임을 설명드리자면 RPG와 FPS 장르가 합쳐진 RPS 게임으로 다중접속이 필요합니다. FPS게임이기는 하나 반응에 민감한 전통 FPS 방식은 아니라 매 프레임마다 패킷을 전송은 하지 않아도 됩니다(TCP를 사용할 것이라는 뜻이기도 합니다) 어느정도 많은 인원의 동시접속을 받아야 하기 때문에 IOCP를 사용하긴 할 것인데 이 부분에 대해서 궁금합니다. 5. 1000명이 접속하더라도 로비에 모여서 4명의 플레이어가 파티를 맺고 4명의 플레이어가 오픈월드 및 던전에 들어가게 됩니다. 즉, 유저 입장에서 보기에는 4명의 파티만을 위한 1개의 오픈월드가 펼쳐지는 것이고, 서버 입장에서는 그러한 오픈월드가 250개가(250x4 = 1000명) 펼쳐지게 되는 것입니다. (Ex.배틀 그라운드) 이러한 게임을 만들고자 할 때 게임 서버를 처음에 어떤식으로 설계해야할지 잘 모르겠고 막막합니다.. 서버와 DB를 연동하는 방법은 간략하게 배워서 DB를 사용해야한다는 점은 알겠는데 그 외의 부분에 있어서 어떤식으로 구현을 해야할지 궁금합니다. 처음부터 너무 많은 질문을 적었는데 죄송합니다. 궁금한게 너무 많았는데 질문이라도 할 수 있는 상황이 생겨서 너무 길게 적게 되었네요. 질문에 대한 도움을 주시면 정말로 감사하겠습니다..!
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 듣던 중 궁금한 점이 있습니다.
지금까지 강의를 듣던 중에 가비지컬렉터 부분이 궁금합니다. C#은 가비지컬렉터가 작동하는데, 가비지컬렉터로 인해 반응성이 좋지 않을 수 있다고 들었습니다. 그래서 가비지 컬렉터가 최대한 작동하지 않도록 해야 한다고 생각했습니다. 따로 관리를 하는 게 맞나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
12:54분 관련해서 질문드립니다.
C# 문법에 관련된 질문이긴 한데, new GameObject { name = "@Managers"}; 의 의미를 모르겠습니다. 분명 매개변수가 하나인 생성자인 것 같긴 한데, GameObject 클래스의 생성자는 public GameObject(string name); 되어있습니다. 그럼 제 생각에는 new GameObject("@Managers"); 이렇게 만들어야 하지 않나 하고 생각하고 있습니다. new GameObject { name = "@Managers"} 와 new GameObject ("@Managers")와 차이가 있습니까?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강사님 포폴에 대하여 질문이 있습니다.
안녕하세요. 일전에 취업준비때문에 질문을 드렸던 수강생입니다. 다름이 아니라 제가 전에 학원을 다닌다고 말씀을 드렸는데요. 학원에서는 포폴을 우선적으로 유니티 즉, 디비나 서버 연동 없이 유니티를 우선적으로 해야한다고 그러더라고요.( Text 를 콘솔로 보여주는 것은 쉽지만, text를 렌더링해서 움직이는것 자체가 어렵다) 는 말씀을 하셔서 이 작업만 해도 오래 걸린다고 그러시더라고요.. 그래서 걱정이 많습니다. 제가 타분야 개발직군을 공부하다가 넘어왔는데 타 개발분야는 포폴을 기본적으로 프론트엔드, 백엔드, DB 이 세가지를 이용해 만들었는데.. ex) CRUD 게시판 그런데 정말 유니티만 가지고 취업에 성공할 수 있을 지가 의문입니다. 그리고 강사님의 내년정도 쯤에 나오는 취업을 위한 언리얼 엔진을 듣고 싶지만 저에게 시간이 많지 않습니다... 내년 3월 목표로 취업준비중입니다.( 취준생 생활이 어느덧 1년 11개월 째네요.) 그래서 정말 진지하게 궁금합니다. 강사님 요약을 하자면 1. 유니티만을 이용해 취업이 가능한지? (서버x 디비x) 2. 만약 1번이 불가능 하다면 어떤걸 준비해야 할지? (참고로 강사님의 강의 1, 2, 3 파트를 사서 현재 듣고 있고, 따로 C++ 공부중입니다. 아마 취업을 준비하게 된다면 유니티엔진을 중점으로 포폴을 만들 것 같습니다.) 끝으로 바쁘실텐데.. 너무 많은 질문과 제 허접한 글을 읽어주셔서 감사합니다...
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Util에 짠 코드가 잘이해 안됩니다.
Transform transform = go.transform.GetChild(0); 여기에서 게임오브젝트의 직속자식을 가지고 오는데 transform을 사용 한다는게 잘이해가 가질 않습니다... tansform은 위치와 관련된 컴포넌트 아닌가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
17:30 초 부근에 QueueUserWorkItem 테스트하는 부분에서
ThreadPool.SetMinThreads(1, 1); ThreadPool.SetMaxThreads(5, 5); for (int i = 0; i < 4; i++) ThreadPool.QueueUserWorkItem((obj) => { while (true) { } }); ThreadPool.QueueUserWorkItem(MainThread); for문 체크하실 때 5에서 4로 바꾸셨는데 저도 똑같이 했는데 출력이 안됩니다. 3이하로 내리니까 출력이 됩니다. 디버그로 쓰레드가 몇개 있는지 확인해봤는데 주 쓰레드 포함 5개밖에 없다고 뜹니다. 왜이럴까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ArraySegment관련 질문
6분쯤에 ArraySegment가 Struct라서 스택영역에 할당되고 BufferList에 Add할 때 복사되어 전달된다고 설명하셨는데 struct가 스택영역에 할당되려면 몇가지 조건이 있는 것으로 알고 있습니다. 예를들면 16바이트 미만이고 멤버변수로 class가 없어야한다 등등... 그런데 위의 조건과 상관없이 Rookiss님이 설명하신 내용대로 되는 이유가 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
시점 이동 관련 질문
현재 내가 보고 있는 시점으로 카메로 이동이 되는 것과는 반대로 카메라가 보고 있는 시점으로 내가 이동 하는 방법이 있을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
void Start()
강의 내에서는 Init()로 순서와 상관없이 매니저 오브젝트를 생성하고 불러올 수 있게 했지만, 또 이후에도 비슷한 방법으로 처리를 하면 되겠지만 유니티 동작 순서를 알고 싶어서 질문드립니다. Managers.cs와 Player.cs 처럼 여러 오브젝트에 여러 스크립트가 있을 경우 void Start()와 Update()를 호출하는 순서가 궁금합니다. 그리고 이 순서가 맘에 들지 않는다면 순서를 바꾸는 방법이 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptAsync() 수행시 항상 오류...
안녕하세요 마지막 DummyClient에서 ServerCore로 계속해서 요청 보내는 부분에서 이상한 에러가 나서 문의드립니다. ServerCore 쪽에서는 RegisterAccept에서 pending이 True 로 반환되고, DummyClient에서는 Connection refused Exception이 발생하네요 ㅠ System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (61): Connection refused 192.168.35.35:7777 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Connect(EndPoint remoteEP) at DummyClient.Program.Main(String[] args) in /Users/hun/Projects/Server/DummyClient/Program.cs:line 28 혹시 의심될만한 부분이 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
타일맵의 크기 변경하기
Tilemap_Collision의 영역이 저렇게 크게 설정되어있는데, 저 네모 영역을 줄이고 싶으면 어떻게 설정해야 하나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님, 이동 동기화에 대한 질문 있습니다.
혹시, 이동 동기화에 대한 방법이 두 가지 있다고 하셨는데, 1) 서버에서 허락 패킷이 왔을 때 2) 클라이언트가 먼저 이동하고 있다가 서버에서 응답이 오면 보정(보간) 먼저, 2)은 배틀그라운드 게임이 제가 기억하기에 이동을 하다가 갑자기 순간적으로 뒤로 가는 현상이 발생하는데 이 방법을 사용한 것인가요?? --- 첫 번째 질문 1)의 경우에 대해서는 어떤 상황인지 잘 모르겠습니다. 혹시 예시가 있을까요?? --- 두 번째 질문 그리고, 제가 두달 전에 Unity의 WebGL 플랫폼을 사용하여 실시간 멀티플레이어 축구 게임을 만든 적이 있습니다. Unity Client + Node.JS로 만든 서버를 사용하였습니다. 저는 동기화에 대한 지식이 없었기에 생각해낸 방법이 Client에서는 숨겨진 '분신'을 만들어 절대 위치 패킷을 받으면 '분신'이 움직이고 실제로 보이는 캐릭터는 따라가도록 구현하였습니다. 그리고 서버에 보내는 좌표는 실제로 보이는 캐릭터의 좌표를 보냈습니다. (RagDoll Component를 사용하여서 다른 클라이언트와의 물리적 충돌이 활발하기 때문에 조금 늦게 모두 같이 이동시킬 방법을 생각하다가...) 물론 '분신'은 보이지 않고 Colider, Rigidbody도 없기 때문에 많이 애먹으면서 많은 런타임 버그들을 잡았었습니다. 혹시 이런 물리적 충돌이 많이 일어나는 경우의 실시간 멀티플레이어 게임들은 두 가지 동기화 방법 중 어떤 방법을 사용하나요? 또는 어떤 방법을 더 많이 사용하나요? --- 세 번째 질문 그리고 수업 너무 좋았습니다. 아직 더 배워야 겠다는 생각과 함께 뿌듯합니다. 감사합니다!! 답변부탁드리겠습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Connect를 이용하여 여러소켓 생성후 문제점
안녕하세요 루키스님 정말 강의 도움 많이 받고 있어요 !!소켓을 10번 생성과함께 커넥트를 요청하는 부분에0.1초 딜레이를 주면 (*대부분*) 잘작동하더라구요 하지만, 저 딜레이를 빼면 아래 그림과같은 에러가 나와요! 저는 이것을 비동기에서 발생하는 문제점이라고 생각했습니다. 그래서 Receive에 _lock을 걸어서 실험도해봤지만여전히 같은 오류를 내고 있더라구요 혹시 이런 에러가 발생하는 부분의 가능성이나해결방법이 어떤게 있을까요? 딜레이를 주는경우대부분 잘되는것은 비동기 문제가 맞는걸까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
transform.TransformDirection()에 대한 질문입니다.
안녕하세요 강의를 듣다 의문점이 생겨 질문을 드립니다 Debug.DrawRay()와 Physics.RaycastAll()은 월드를 기반으로 되어있고 레이저를 유니티짱이 바라보는 방향(로컬)으로 쏘기위하여 Vector3 look = transform.TransformDirection(Vector3.forward);로 좌표를 대체하셨는데, 1. Vector3.forward는 월드벡터를 나타내고, transform.TransformDirection()은 로컬벡터를 월드벡터로 바꾸는 기능을 한다고 알고 있습니다. 이것은 월드벡터를 월드벡터로 바꾸는 작업이라고 생각되어 이해가 잘 가지 않습니다. 2. 또, look 대신 Debug.DrawRay()와 Physics.RaycastAll()에 transform.forward를 집어넣어도 같은 기능을 하는 것 같은데 이렇게 써도 되는건지 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Input Manager 강의를 듣고 이해가 안되는 부분이 있어 질문드립니다
안녕하세요 유니티 처음이라 이해가 잘 안되는 부분이 많아 다시 강의를 복습하던 도중에 이해가 안되는 부분이 있어 질문드립니다 Input Manager 강의 5분 30초 쯤에 보면 Manager 클래스에 InputManager를 생성할려고 InputManager _input = new InputManager(); public static InputManager Input { get { return s_instance._input; } } 이런 코드를 작성하셨는데 이 부분이 이해가 잘 안됩니다 1. Mangers 객체인 s_instance 는 static 변수로 선언을 했는데 왜 InputManager 객체인 _input은 static 변수로 선언하지 않았는지 그 이유가 궁금합니다 Manger 객체와 똑같이 입력을 처리하는 InputManager 객체는 1개만 필요할텐데 static이 아닌 일반 변수로 선언한 이유가 궁금합니다. (InputManager를 static 변수로 선언하면 안되나요??) 2. InputManager _input = new InputManager(); public static InputManager Input { "get { return s_instance._input; }" } "get { return s_instance._input; }" 이 코드에서 s_instance.input을 한 이유가 궁금합니다 그냥 get { return _input; } 을 하면 안되는 이유가 궁금합니다 Input을 사용할때 Mangers.Input.KeyAction 이런식으로 사용될텐데 Managers 클래스 안에 _input이라는 변수가 정의되어 있는데 왜 굳이 s_instance. 을 붙이는 이유가 궁금합니다 매번 친절하고 자세한 설명 감사드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
백그라운드/메인 쓰레드 그리고....
1. PackatQueue를 OnRecvcallback을 통해 거치게되면 유니티에서 사용되는 메인쓰레드로 사용할 수 있다는 얘기로 들리는데. 유니티에서 그렇게 작동하도록 만든것인가요? 즉 유니티 오브젝트와 서버를 연동시키려면 쓰레드는 무조건 큐(Push,Pop)를 거쳐서 와야한다? 라고 유니티 측에서 규칙을 정해둔거? 그리고 2. 전 강의에서 설명하셨을 수도 있는데 너무 많은게 지나가서 질문 드립니다... HandlePacket만으론 유니티와의 연동이 되지않은 걸로 보이는데 HandlePacket을 자동화해서 사용하는 이유가 있나요. 제가 이해한 바로는 1번에 해당하는 경우에만 유니티가 제대로 작동되는 걸로 보여져 HandlePacket은 뭘하는지 잘 모르겠습니다. 3. 기존에는 (유니티 연동 전) 백그라운드 풀에서 쓰레드를 뽑아와서 쓴다고 하셨는데.. 이 부분은 제가 잊은건지 모르겠지만.. 쓰레드 풀 자체를 어디서 생성해줬는지 기억이 가물가물합니다... 분명 첫수업시간 때 Task를 이용해 쓰레드 풀을 만드는 건 어렴풋이 기억이 나는데 그런 코드는 여기서 작성한 기억은 없고... 쓰레드 자체가 어디에서 왔는가에 대해 알려주실 수 있나요.. 메모하면서 진행해왔는데 찾기가 어렵네요. 4. 그리고 복습하는 도중에 알려주신 모든 부분을 응용해서 학습할 수 있게 해주신점 감사드립니다. 그런데 한가지 ThreadLocal을 이용한 최적화는 파이널 프로젝트에 응용한게 없는듯한데 파트 7정도 때에나 이런 것들을 한꺼번에 볼 수있을까요. 감사합니다. ---------------------------------------------------
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TCP Remote Access 관련 질문입니다.
강사님의 서버개발 강의를 다 보고 완성해서 Windows App, Android App을 만들어 테스트를 해보려고 했는데 원격지에서 TCP 접속이 계속 Timeout이 발생합니다. 서버와 클라이언트(Windows, Android)는 동일한 Hub 내에서 동작하고 있어요 고정 IP 하나에서 DHCP로 내부 아이피 할당받아 사용중입니다. 예로 서버의 내부 아이피는 192.168.0.40 이고 포트는 7777번 사용 중이고 Client는 192.168.0.40:7777로 접속을 시도하는 중이에요. 혹시나 Server 쪽에서 In/OutBound 정책을 설정을 안했나 싶어서 TCP 7777번 포트를 모두 열어놓았으나 Timeout이 발생해 모든 포트를 다 열어서 테스트했는데 동일하게 Timeout이 발생합니다. 원격지에서 TCP서버로 접속하려면 다른 설정이나 코드가 필요한것인가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom 관련 질문입니다.
아무리 보고 또 봐도 생각을 아무리 해봐도 이해가 잘 안돼서 질문 남깁니다. 질문이 너무 잦아 부끄러운 마음이 먼저 드네요..ㅠ class ClientSession : PacketSession { public GameRoom Room { get; set; } public override void OnConnected(EndPoint endPoint) { Console.WriteLine($"OnConnected: {endPoint}"); Program.Room.Enter(this); // 1 } public override void OnDisconnected(EndPoint endPoint) { SessionManager.Instance.Remove(this); // 2 if (Room != null) { Room.Leave(this); Room = null; } Console.WriteLine($"OnDisconnected: {endPoint}"); } ... OnConnected 메소드에서 주석 1번과 OnDisconnected 메소드에서 주석 2번 영역인데요. OnConnected 에서는 Program 의 Room에 입장을 시키는데 어째서 OnDisconnected 에서는 Room에 Leave를 하는지 아무리봐도 모르겠습니다.코드대로 읽어보면 Enter는 Program영역이고 Leave는 ClientSession의 영역이라 서로 다른 처리를 하고있는게 아닌가 하는 생각이 들고요. 또 하나 신기하면서도 이해가 안되는 부분은 public static void ClientChatHandler(PacketSession session, IPacket packet) { ClientChat chatPacket = packet as ClientChat; ClientSession clientSession = session as ClientSession; // 여기! if (clientSession.Room == null) return; clientSession.Room.Broadcast(clientSession, chatPacket.chat); } clientSession에는 Room을 넣어준 적이 없는데 if를 통과하는 부분이에요. 분명 어디선가 초기화가 되고 있다는 뜻인데 암만 봐도 모르겠습니다... ㅠ 심지어 ClientSession의 Room 은 초기화 되는 곳이 그 어느곳을 찾아봐도 없어요.ㅠ