묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
동일한 질문이 있는 것 같은데 이해가 잘 안되서 다시 질문 드립니다
transform.position += transform.TransformDirection(Vector3.forward); Vector3.forward는 (0,0,+1) 이것을 TransformDirection을 통해 월드좌표로 바꾸면 월드 +z축 방향으로 이동한다는 의미 아닌가요?? 저희가 원하는건 Player를 기준으로 한 로컬좌표에서 +z축 방향으로 이동하고 싶은것인데 말이죠 실제로 TransformDirection을 사용하지 않으면 그냥 월드좌표를 기준으로 진행하는데 여기서 TransformDirection을 통해 월드로 바꾼다는 것이 이해가 잘 되지 않습니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이동 동기화들을 보면서 생각한게 있는데요.
만약에 애니메이션 이나 따로 동기화 하는 부분이라면 애니메이션 동기화를 예를들면, 파라미터 데이터를 하나씩 보내는거 보다는 한 캐릭터에 모든 파라미터 데이터를 모았다가 한번에 서버로 보내는게 최고에 방법인가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티쓰레드와 관련해서 질문이 있습니다.
멀티쓰레드를 학습하게 되면서 나름대로 정리를 해보았는데요. 멀티쓰레드 환경에서는 쓰레드가 공유하는 자원에 대한 일관성이 보장되어야 한다. 즉, 특정 쓰레드에서 공유 자원의 데이터를 변경하면 다른 쓰레드에서도 똑같이 변경된 데이터를 다뤄야한다. 이러한 문제를 해결하기 위해 쓰레드가 공유 자원에 접근하기 전 Lock을 걸고 들어가서 다른 쓰레드가 해당 자원에 접근하지 못하도록 막고, UnLock을 통해서 다른 쓰레드가 접근할 수 있게 해준다. 이 때 접근한 쓰레드는 변경된 공유 자원 데이터를 사용하게 된다. 이렇게 이해한게 맞는건가요 ? 원자성이라는 개념을 이해하기를 하나의 작업을 처리할 때 수행되는 모든 과정들을 일련의 한 묶음으로 보고 이것은 마치 더이상 나누어지지 않는 것처럼 모두 수행되거나 모두 수행되지 않아야 한다. 그런데 Lock을 통해서 원자성을 구현한다고 이해하고 있는데 이게 맞는건지 궁금합니다... 왜냐하면 Lock을 통해서 공유자원에 다른 쓰레드가 접근을 못하게 막는것은 맞지만 Unlock을 할 때까지 여러가지 작업을 할 수 있는데 그것은 원자성을 보장하지 않는 거 같다고 생각해서입니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코어와 프로세스, 쓰레드간의 관계에 대해서 궁금합니다
그림판 비유를 보면 컴퓨터에서 동시에 사용하는 프로그램마다 최소한 하나의 프로세스와 쓰레드를 가지고 있는데 컨텍스트 스위칭이 일어난다고 하면 코어 하나만 갈구는거 아닌가요? 그리고 아직 쓰레드를 직접 사용해본적이 없어서 잘 모르겠지만 메모리의 동기화를 보장하기 위하여 멀티스레드 프로그래밍에서 lock를 적극적으로 사용하는데 이러면 어느부분에서 성능향상이 일어나나요? lock을 사용하면 사용할수록 싱글코어와 다를것이 없다고 생각되서요 Web에서 종종 다루는 비동기적 처리를 하기 위해서 스레드를 사용하는건가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강의자님의 지식과 역량에 감탄중입니다
아직 3번째 단계의 강의를 듣는중이지만 강의의 구성요소와 강의내용 그리고 강사님의 역량에 감탄하고 있습니다. 단순히 게임엔진에 대해서만 배우는 것이 아니라 데이터베이스, 운영체제, 자료구조, 알고리즘, 컴퓨터구조등 컴퓨터공학의 기저에 있는 여러가지 내용들을 짚어주고 넘어가신다는게 좋은 강의 같습니다. 거두절미하고 몇몇 여쭤보고 싶은 내용이 있어 질문 드립니다. 강의 내용을 듣다 보면 중간중간 보간법등에 대한 내용이 나와있는데 수치해석에서 나오는 개념들이더군요 수치해석과목같은경우에는 저희학교는 컴퓨터공학에서 다루지 않고 기계공학이나 수학과쪽에서 다루고 있는데 타학과 수치해석 과목을 듣는게 클라이언트 지망 개발자한테 도움이 될까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문있습니다!
안녕하세요. 좋은 강의를 보고 패킷모아 보내기를 테스트 해보고 있습니다. 강의와 같이 ServerSession을 500개 만들어서 테스트를 해보면 500개 까지 Connect가 안되고 400좀 넘어서 끝나버리는데(실행할때마다 달라요) 이게 피씨 사양과도 관련이 있나요? 아님 다른 이유가 있을까요? (선생님 파일을 받아서 실행해봐도 비슷해서요)
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
System.ArrayTypeMismatchException:
Map.cs -> ApplyMove 및 ApplyLeave 함수 부분에서 오류가 간헐적으로 발생합니다. public bool ApplyMove(GameObject gameObject, Vector2Int dest) { ApplyLeave(gameObject); PositionInfo posInfo = gameObject.PosInfo; if (CanGo(dest, true) == false) return false; { int x = dest.x - MinX; int y = MaxY - dest.y; _objects[y, x] = gameObject; // 이 부분에서 오류 발생 함 } // 실제 좌표 이동 posInfo.PosX = dest.x; posInfo.PosY = dest.y; return true; } System.ArrayTypeMismatchException: 'Attempted to access an element as a type incompatible with the array.' 이라는 오류가 발생합니다.... 첨부파일에 있는 프로젝트 실행해도 마찬가지입니다 .NET Core 3.1 Protobuf( 3.12.3) Newtonsoft.Json (12.0.) 입니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
if (s_instance == null) 을 체크하는 이유는 뭔가요?
싱글턴 구현을 위해서 한번만 인스턴스하기 위해 넣는것이라고 이해했는데 맞나요? 다소 이해가 안가는 것은, GameObject go = GameObject.Find("@Managers"); 를 한 다음에 if (go == null) 을 체크해서 게임오브젝트를 하나만 생성하도록 제한해 두었기에, 다른 파일에서 강제로 여러번 인스턴스를 하더라도 어차피 결과적으로는 한번만 인스턴스가 되는 것 같아서요. 굳이 if (s_instance == null) 를 체크해야 하는 이유가 잘 이해가 안갑니다. ㅠㅠ 알려주세요!
-
미해결[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: 게임 서버
3d 게임에서의 이동 동기화 패킷 관련해서 질문드려요.
1. 보통 3d게임에서 이동 동기화 패킷을 클라이언트가 ms단위로 보내는 걸로 알고 있는데 보통 초당 몇번의 이동 패킷을 서버로 보내야 케릭터 움직임이 부드럽게 동기화가 되는지 궁금합니다. 실무에서 어느 정도 정해진 평균치 같은게 있는지도 궁금해요. 2. 꼭 ms단위로 보낼 수 밖에 없는지 궁금합니다. 캐릭터의 다이나믹한 움직임 및 언덕 올라가기등.. 서버에서도 똑같이 시뮬레이션 할 수있다면 서버 클라 각자 이동 시뮬레이션을 돌려서 도착지점에서 동기화 해주면 될 것같지만 현실은 서버에서 그런 시뮬레이션 하기가 어렵기 때문에 클라가 그냥 무식하게 이동패킷을 막 쏘는 것 같은데 이런 경우는 현실적으로 어쩔 수 없는 부분일까요..? 이동 패킷 처리 비용이 너무 아깝네요.. 실무에서는 이런경우 어떤 식으로 대처하는지 궁금합니다. 타일 단위로 움직이는 2d나 턴제 게임서버 개발하고 싶네요.. 강의 항상 감사드립니다~!
-
미해결[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: 게임 서버
lock과 send 질문!
public void Send(byte[] sendBuff) { lock (_lock) { _sendQueue.Enqueue(sendBuff); if (_pendinglist.Count == 0) RegisterSend(); } } // private void RegisterSend() { while (_sendQueue.Count > 0) { byte[] buff = _sendQueue.Dequeue(); _pendinglist.Add(new ArraySegment<byte>(buff, 0, buff.Length)); } _sendArgs.BufferList = _pendinglist; bool pending = _socket.SendAsync(_sendArgs); if (pending == false) { OnSendCompleted(null, _sendArgs); } } 처음에 send에서 lock을 걸고 pendinglist의 Count가 0일 때만 RegisterSend()를 호출하는데, RegisterSend() 내부에서 while문을 돌며 sendqueue의 count만큼 pendinglist에 sendqueue 데이터를 넣어주고 있잖아요? 근데, sendqueue의 count가 2이상인 경우가 가능한지 궁금합니다.. 위의 Send에서 lock을 걸어두면 RegisterSend()의 호출이 끝날때까지 다른 Session이 접근 못하지 않나요?
-
미해결[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: 유니티 엔진
시점 이동 관련 질문
현재 내가 보고 있는 시점으로 카메로 이동이 되는 것과는 반대로 카메라가 보고 있는 시점으로 내가 이동 하는 방법이 있을까요?