묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ArraySegment 질문입니다
안녕하세요 ㅎㅎ ArraySegment 의 신기한 점을 발견하고 질문드립니다. Q.1 Session.cs에서 RecvBuffer 객체를 생산하고 다음과 같이 _recvArgs.SetBuffer의 인자로 WriteSegment의 반환값을 넣어주고 있습니다. WriteSegment의 반환값이 _buffer의 값을 이용해 새로운 인스턴스를 생성했다고 생각했습니다. 왜냐면 new를 통해 만들었으까요.. 일종의 값의 복사만 일어났다고 생각을 했거든요.. 근데 로직상 _recvBuffer.WriteSegment의 반환값이 RecvBuffer 객체의 맴버변수인 _buffer에도 영향을 주기에 가능하다고 생각하니 단순 값의 복사만 일어난건 아니라고 생각했습니다. 실제 테스트 해보니 _buffer를 통해 만든 newBuffer의 값을 변경하니 _buffer의 값 또한 변경됐습니다.. 이게 어찌 가능한 일인가요? ArraySegment 생성자의 첫번째 인자가 신비로운 문제의 해답인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
세션과 소캣 질문
안녕하세요 ㅎㅎ 세션과 소켓에 이 정확히 무엇인지 이해가 잘 안돼서 질문드립니다. 제가 이해한걸 정리하면 소캣은 서버와 클라가 통신할 수 있는 수단 혹은 통로라고 생각합니다. 그렇다면 세션은 무엇인가요? 소캣을 포함하며 구조적으로 설계가 잘 된 사용자 정의 인터페이스라고 봐도 되는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Disconnect 함수의 임계영역
안녕하세요 ㅎㅎ 궁금증이 생겨 질문드립니다. 강의 21분에 "Disconnect 함수를 동시 다발적으로 실행하거나 같은 Thread가 두 번 한다면" 이라고 말씀하셨습니다. Q.1 Disconnect 함수를 동시다발적으로 실행할 수 있나요? 다르게 말하면 DisConnect함수가 실행하는 내용이 임계영역인가요? 여러번 고민해봤는데 Disconnect를 호출하는 OnAcceptHandler는 인자로 스레드마다 독립적으로 하나씩 가지고 있는 clientSocket을 받고 clientSocket으로 Session.Start(clientSocket); 을 통해 Session 클래스의 객체를 초기화 해주기에 임계 영역이 아니라고 생각합니다. 후자로 말씀하신 하나의 Thread에서 실수로 코드에 두 번 기입해서 Disconnect를 하지 않는 이상 별다른 문제가 없다고 생각합니다. Q.2 매번 코드를 작성할 때마다 임계영역인지 아닌지 고민하면서 코딩하다 보면 머리가 터질 것 같습니다. 선생님께서는 눈에 보이는 임계영역에만 상호배제를 해주고 후에 배포 전에 테스트 단계에서 문제가 발생하면 그때 수정하는것도 현명한 방법이라고 생각하시나요? 조언 부탁드립니다!!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Parallel.Invoke 호출시 메인스레드 사용 이유
안녕하세요 의아한 점이 생겨 질문드립니다. 메인에서 MaxThread의 수를 3개로 지정한 상태에서 Invoke를 호출하고 ManagedThreadId를 확인하면 Invoke시에 메인 스레드인 1번을 사용하는 이유가 무엇인가요?.. MaxThread를 (1,1)로 설정해도 무조건 한 번은 메인 스레드를 사용하고 그 다음부턴 풀에서 스레드를 꺼내쓰더라구요.. 왜 한 번은 메인스레드가 사용되는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 할당관련 질문
안녕하세요 ㅎㅎ 강의를 듣다가 여러 궁금증이 생겨 질문드립니다. Q1. 메모리 할당에 관한 질문입니다. 질문드리기 앞서 무성의한 변수 작성에 사과드립니다. static 변수(a)는 Data영역에 멤버변수(b)는 Heap영역에 멤버함수(Func)는 Code영역에 멤버함수 내에 존재하는 지역변수(c)와 t2는 Stack영역에 할당된다고 알고있습니다. 실제 Main에서 Test라는 클래스를 인스턴스화후에 메모리 구조에 대해서 몇 가지 질문드리고 싶습니다. Test t2 = new Test(); 이 코드를 실행하게 되면 Stack에 t2라는 변수가 생기고 Heap에 할당된 메모리를 가리키고 있을거라 생각합니다. 궁금한건 Func함수입니다. 질문속의 작은 질문들을 정리해서 말씀드리면 Q1.1 t2라는 변수를 통해서 저희는 멤버변수인 b에도 접근하고 Func라는 함수도 호출합니다. 다만 t2는 heap의 주소를 가리키는 포인터인데 heap영역에 있지 않는 Func라는 함수를 어떻게 가리키는건가요? 한 가지 추정을 해보면 heap어딘가에 Func의 Stack 시작점 주소를 저장할 공간이 있고 Stack에 함수가 할당되면 그곳으로 매핑을 시켜주는 건가요? Q1.2 Code영역이 궁금해서 검색하다가 지역변수는 함수 호출시에 Code영역에 저장되는 함수 정의를 활용하여 초기화 된다. 라는 글을 발견했습니다. Code영역에 함수가 정의된다는것과 Stack에 함수가 할당되는게 구체적으로 어떤 연관성이 있는지 이해가 잘 안됩니다.. 정의를 활용한다는게 어떤 의미안가요? Q1.3 클래스 내부에서 Static Test t1 = new Test(); 코드를 실행해봤습니다. static변수는 클래스가 메모리에 올라갈때 할당 된다고 배웠는데 t1이라는 변수가 Data영역에 할당되자마자 Heap에도 데이터가 할당되는건가요? Q1.4 이러한 메모리 할당에 대한 의문이 생기면 실제로 실험해보고 검증하고 싶은데 Stack Heap Data Code 영역을 실제로 확인할 수 있는 방법이 무엇인지 모르겠습니다 ㅠㅠ.. 디버깅처럼 이러한 것들을 확인할 수 있는 방법이 있을까요..?? Q2. ReaderWriterLock에 관한 질문입니다. WriteUnLock 부분에서 Exchange를 사용하지 않고 _flag = EMPTY_Flag;를 해주면 문제가 발생할까요? 제 스스로 고민해본 결과 WriteUnLock은 어쨋든 Lock을 잡은 상태에서만 호출을 한다고 가정했으니 임계영역이 아니라고 생각했습니다. 재귀적으로 호출을 해도 별 문제가 없다고 생각한건 싱글스레드가 독보적으로 호출할 수 있는 영역이니까요. ReadUnLock의 경우는 여러 스레드가 동시에 값을 변경하니 Interlocked.Decrement(ref _flag);를 호출하는게 맞다고 생각하는데 WriteUnLock을 _flag = EMPTY_Flag;이와 같이 작성해도 별 문제가 없을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Thread와 Context Switch에 대한 질문
안녕하세요 ㅎㅎ강의 잘 듣고 있습니다. Q1. 유저레벨 스레드? 커널레벨 스레드? 선싱님 강의를 수강하니 운영체제 수업에서 배운 내용들이 하나 둘씩 기억나서 매우 반갑네요. 제가 기억하는 내용을 적어보면, 일반적으로 IO나 인터럽트에 의해 발생하는 프로세스 문맥 교환과 매우 유사하게 쓰레드도 레지스터나 캐시의 정보들을 주 메모리로 옮기는 과정을 운영체제가 도맡아 담당하게 됩니다. 때문에 쓰레드간의 문맥 교환시에 Kernel모드로 진입한다고 말씀하신거겠죠. 궁금한점은 쓰레드의 구현 방식에 따라? (아마 유저 레벨 쓰레드와 커널 레벨 쓰레드로 구별하는 것 같습니다.) 문맥 교환의 비용이 차이가 난다고 어디선가 배운 기억이 납니다. 본 강의에서 사용한 쓰레드는 생성시 라이브러리 함수를 사용했고.. 아마 내부적으로 시스템 콜을 호출했고 결과적으로 유저가 아닌 Kernel이 스케쥴링하니 커널레벨 스레드인 것 같은데요.. 그렇다면 유저레벨 스레드라는건 어떤걸까요? 유저(개발자)가 문맥교환을 담당하고 스케쥴링도 담당하는, 모든걸 개발자가 도 맡아하는 스레드인가요? 실제 유저 레벨 스레드가 많이 사용되는 경우는 어떤 경우인가요? Q2. AutoResetEvent는 Kernel단으로 내려가서 문맥교환으로 인해 spinlock보다 성능이 저하될 수 있다고 말씀하셨습니다. 궁금한건 sleep 혹은 yield또한 cpu의 점유권을 포기한 상태에서 다른 스레드를 실행할 수 있기때문에 kernel로 진입후에 문맥교환이 발생하고 이에따른 성능 저하가 일어날 수 있을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Thread의 실행순서를 잘 이해한건지 모르겠어요
처음에 메인에서 t.Start();가 Console.WriteLine("Hello World!")보다 먼저 와 있어서 제 생각에는 먼저 Hello Thread!가 먼저 찍힐 줄 알았는데, 실행해보면 Hello World!가 먼저 찍히고 Hello Thread!가 찍히더군요. 그렇다는건 이 Thread라는 일꾼은 메인이 끝난 뒤에야 실행된다는 건가요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Bind 함수 관련 질문 - 이해하기 너무 어렵네요 ㅠ
안녕하세요 Bind 함수를 이해하려고 해도 너무 어려워서 아래와 같이 Bind 함수의 개념도(?)를 그려보았는데 제대로 이해한 것인지요? 아울러 추가적인 두 가지 질문에도 답변해 주시면 감사하겠습니다. 늘 강의 잘 듣고 있습니다. 고맙습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
RayCasting 관련 질문
안녕하세요 UnityChan이 몬스터를 클릭했을 때 제대로 attack이라는 판정이 안들어가는 것 같아서 확인해봤는데 raycasting이 몬스터에 가까워질수록 하늘을 주시하더라구요 무슨 문제인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Animation 질문
안녕하세요 강의에서 사용하신 Knight가 없어서 다른 애니메이션을 가져왔습니다. attack 애니메이션을 unityChan에 적용하면 왜인지 모르겠지만 땅에 박혀있더라구요 auto로만 사용했을 때는 잘 되는 것 같은데 auto와 Unity model이 정확히 뭐가 다른건가요?..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Json 파일 추가시 에러
안녕하세요 Json파일을 추가하고 긁어온 데이터를 Log를 찍는 과정에서 프로젝트가 다음과 같이 에러를 뱉어냅니다. Unity에서 StatData.json을 더블클릭해서 열면 한번 외부에서 수정했다는 문구가 뜨면서 솔루션 탐색기에서 아이콘이 변경되고 이후부터는 UNITY에 연결도 안되고 디버깅도 안됩니다..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오류가 떴는데 뭐가 문제인지 모르겠어요
Assets\Script\Managers\Managers.cs(16,19): error CS0246: The type or namespace name 'UIManager' could not be found (are you missing a using directive or an assembly reference?) 이런 오류가 떴는데요 Managers 스크립트에서 UIManager _ui = new UIManager(); public static UIManager UI { get { return Instance._ui; } } 이 두 줄이 문제라고 떴습니다. 문제를 찾고 싶어서 강사님이 올려놓은 코드+정리와 비교해봤는데 도저히 못찾겠어서 질문적어봅니다.. 아래는 오류난 유니티 파일 링크입니다. https://drive.google.com/file/d/16Ayu9tOwC4CKTQcAKrsrTuPx1Sa3Rh_5/view?usp=sharing
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
FindObjectOfType 질문입니다.
GameObject.FindObjectOfType<BaseScene>(); 해당 함수가 Object를 찾는 기준이 궁금해서 유니티 도큐먼트를 검색해 봤는 데요 Description Returns the first active loaded object of Type type. first active loaded <- 이 말이 참 흥미롭더라구요 BaseScene이라는 컴포넌트는 유니크하기에 잘 찾겠지만 여러 게임 오브젝트가 동일한 컴포넌트를 들고있는 상태에선 어떤 게임오브젝트를 반환하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
웹서버와 게임서버의 활용에 관하여 질문이 있습니다.
좋은 강의 만들어주셔서 감사합니다. 정말 잘 가르쳐주셔서 너무 익혀나가고 있습니다. 다름이 아니라 혹시 웹서버와 게임서버의 활용에 관하여 질문이 개인적인 질문이 있는데 어디에 문의를 드려야 할지 모르겠어서 여기로 질문드립니다... 친구들과 같이 진행중인 프로젝트가 있는데 서버를 처음 다루다보니 AWS를 활용한 웹서버 + 클라이언트 구조로 활용하여 게임을 개발하려 하였습니다. 그런데 이제 OT에서 웹서버와 게임서버의 활용법을 얘기하셔서 저희 게임의 기획에 맞게 게임서버를 활용하기로 하였습니다. 다만, 웹서버와 게임서버를 병행하여 랭킹시스템, 유저정보 등은 웹서버를 활용하여 매치메이킹을 해주는 등에 활용하고 실제 게임이 매치되어 진행하는 동안에는 게임서버를 사용하는 것으로 구상중에 있습니다. 이제 로딩시 버전체크 등 파일 확인에도 웹 서버를 활용하면 괜찮을거 같아서 이렇게 진행을 하고 싶은데 하나의 게임 안에서 서버를 교체하여 매치를 진행한다는 것이 가능한 것인지가 궁금합니다. 저희가 아직 학생신분을 가진 상태라서 서로가 공부목적으로 진행하는 프로젝트이다 보니 웹서버에 관심을 가지고 있는 친구가 있어 포기할 수는 없는 상태인데 이게 이중연결이 진행이 되는 것인지 아니면 웹서버의 연결을 끊고 게임서버로 다시 연결시켜주는게 괜찮은 방식인가 싶습니다... 강의와는 무관한 질문 정말 죄송합니다 ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
transform에 대한 질문
안녕하세요 강의 잘 듣고있습니다. 이전 강의를 들으면서 transform이라는 변수를 통해 child에도 접근할 수 있고 gameObject에도 접근할 수 있음을 알게 되었습니다. 궁금한건 아래 코드와 같이 girdPanel.transform을 foreach에 넣어주면 자동으로 자식들의 transform이 child라는 변수에 들어가나요?.. 너무 신기합니다. 어떠한 원리에서 가능한걸까요..? 개발자의 편의를 위해 저런식으로 동작하게 구현해놓은걸까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
AddComponent와 UI_Popup.cs에 대한 질문
안녕하세요 강의 너무 잘 듣고 있습니다. 강의를 들으면 들을수록 기초 개념이 부족하다는 생각이 듭니다. 1. 이미 되게 자연스럽게 쓰고있던 AddComponent 함수에 대한 질문입니다. 를 실행하면 ShowPopupUI에 들어가 GetOrAddComponent<UI_Button>(go) 함수를 호출한 셈이 될테고, 만약 go에 UI_Button 컴포넌트가 없다면 Add를 하게 될텐데 Add될 컴포넌트는 UI_Button.cs인가요? 더 궁금한건 실제 Prefabs/UI/Popup 안에도 UI_Button이란 prefab이 존재하는데 Unity가 이 둘을 잘 알아서 구분하나요? (물론 prefab이 컴포넌트로 붙을 수는 없다고 생각하지만 예를 들어 같은 이름의 스크립트 파일이 다른 파일에도 여러개 존재할 수 도 있을텐데 이럴땐 어떻게 구별하나요?) 2. UI_Popup의 init함수에 들어가는 내용이 Start에서 실행되지 않기에 UI_Button.cs의 Start()->Init()->base.Init()를 통해 간접 실행하게 되는데 UI_Popup에 있는 gameObject가 UI_Button으로 뜨는 이유가 아리송합니다. gameObject가 Component라는 조상클래스의 맴버 변수이며 UI_Button이 UI_Popup을 상속받았기에 가능한 일인가요? 3. ClosePopupUI함수를 virtual 키워드로 작성하신 이유를 알 수 있을까요? UI_Base에서 재정의하여 사용하는 경우가 있나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
바인딩 질문입니다.
바인딩 부분에서 FindChild가 component를 반환하고 실제 그 값을 UnityEngine.Object타입의 objects에 넣고있습니다. 문득 든 의문은Dictionary<Type,UnityEngine.Object[]> _objects 로 선언하여 componet를 UnityEngine.Object[] 배열에 담는 이유가 다형성을 이용하기 위함인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Componet에 대한 질문
안녕하세요 Component에 대한 질문입니다. Utill 코드를 작성하다 든 의문입니다. (지금부터 작성하는 질문에 제가 잘못 생각하고 있는 부분이 있다면 말씀해주시면 감사하겠습니다.) UI_Button PointButton PointText ScoreText 현재 계층도가 이렇게 있다고 했을 때, 자동화 하는 이유가 PointButton, PointText, ScoreText 이 셋을 코드상에서 찾기 위함으로 이해했습니다. 곰곰히 생각해보니 GetComponentsInChildren, GetComponent 이 함수들은 Component를 반환하는 함수이지 UI_Button 산하에 있는 PointButton, PointText, ScoreText와 같은 GameObject를 찾는 함수는 아니라고 생각했습니다. 유니티 공식 문서를 찾아보니 결국 반환값은 GameObject에 부착된 componet를 반환하더군요. 질문1 구현하려는 목적이 GameObject가 아닌 GameObject에 달린 컴포넌트를 찾는 것이 맞나요? 실제로 그런지 확인을 하려고 디버깅을 하는데 두번째 궁금증이 생깁니다. 저 base는 어떤걸 나타내는 건가요? base에 PointText라고 적혀있어서 값이 componet가 아닌 GameObject라는 다소 엉뚱한 생각이 조금 듭니다. 저 base는 컴포넌트가 부착된 GameObject에 대한 정보를 담고있는 건가요? 사적인 질문) 선생님은 호드인가요 얼라이언스인가요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
캐릭터에 심어진 콜라이더에 대해 재질문 및 추가 질문입니다.
너무 궁금해서 질문올립니다. 구글 검색해보니 PlayerController를 쓰는 예제도 있고 뭐 여러가지가 있는데 캡슐 콜라이더를 붙이고 정상적으로 이동이 되는 걸 보고 싶어서요. 강사님께서는 키네마틱이 꺼져있어서 물리 적용을 받아서 그런거 같다고 하는데 제 생각도 같습니다. 다만 키네마틱을 켜는 순간 다른 오브젝트들과 물리 상호 작용을 하지 않는 것으로 알고 있어서 물리 상호 작용하면서 정상적으로 구현하고 싶네요. 예전에도 만들다가 결국 PlayerController써서 중력 적용 시켜서 만들었는데 뭔가 안되서 포기하고 만들었던거라 찜찜한게 남아있거든요. 부탁드립니다 ㅠㅠ 아 그리고 강의 중반부터 섹션 5부터 섹션 6으로 넘어갈때 캡슐콜라이더가 꺼져있고 메쉬콜라이더가 켜져서 움직이던데 스킨메쉬렌더러라서 메쉬정보 없어서 convex가 안되는 것으로 알고 있는데 어떻게 plane위에 서있는지도 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Raycast 질문
안녕하세요 강의 너무나 잘 듣고있습니다. 강의에서 CameraController의 Raycast에서 origin(플레이어) direction(카메라 방향)으로 구현하셨습니다. origin을 카메라로 direction을 플레이어 방향으로 구현하지 않으신 특별한 이유가 있을까요? 몇 가지 이유를 생각해봤는데 계산이 어렵다는 생각이 들더군요 (벽이 두껍다던지 다수의 오브젝트가 카메라를 막고있다던지..의 상황에서요) 다른 이유가 또 있을까요?