묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Tile collision에 관한 질문입니다.
.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock을 거는 것과 await 키워드를 사용하는 것는 어떤 차이가 있을까요?
제목 그대로 lock과 await의 차이가 궁금합니다. C#에서 제공하는 await 키워드 또한 lock과 비슷한 느낌적인 느낌인데 혹시 차이가 있을까요? lock은 임계구역을 생성해서 보호막을 만드는 느낌이라면 await은 task가 끝날 때까지 잠시 대기 해주는 역할을 하는 것 같은데 먼가 둘의 차이가 정확하게 와닿지가 않아서요! 좀 더 정확하게 잘 이해가 안되는 부분은 "동시 다발적으로 await이 걸려있는 task를 처리한다고 했을 때 어떤 식으로 동작을 할까?"인 것 같아요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
c# 스크립트에서 한글 주석을 달면 깨지는 문제
Unity에서 스크립트를 추가하고 코드를 작성할때, 한글 주석을 작성하고 저장 후 Unity로 돌아오면 한글 주석 부분이 깨져서 나옵니다. 인터넷에 검색해본 결과 스크립트 파일을 메모장으로 열어서 UTP-8로 다시 저장하면 된다고 하여서 시도 해봤더니 한글로 잘 뜨긴 합니다만, 매번 이 방식으로 한글 주석이 달린 모든 스크립트들을 새로 저장하기는 너무 번거롭습니다. 혹시 다른 해결 방법 없을까요? visual studio와 unity 모두 업데이트 해보았으며, unity에서 한글도 설치 했습니다. visual studio에서 도구 - 옵션 - 텍스트 편집기 - 일반 에서 '시그니처 없는 utp-8 인코딩 자동 검색'을 체크 해제 해보기도 하였고 다시 체크 해보기도 하였으나 한글 주석은 계속 깨졌습니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티스레드 와 Lock 질문
안녕하세요. 항상 양질의 강의 감사합니다! 복습중 이해가 확실히 안되는 부분이 있어 질문드립니다. 서버에서 다양한 곳에서 Player를 이동시킬 수 있기 때문에(다른 플레이어가 스킬로 Player를 밀쳐내는 등..) Player를 이동시키는 부분은 한 곳에 몰아서 Lock을 걸고 실행시켜 준다고 설명해 주셨습니다. 그래서 위처럼 GameRoom에 Player가 움직이는 로직을 몰아서 Lock을 걸어주셨는데, 제가 궁금한 점은, HandleMove멤버함수에서 특정 Player를 참조(?) 하고있는 인자 player를 가지고 Lock을 걸고 작업을 하고 있을 때, 다른 클래스의 맴버함수에서도 똑같은 Player를 참조해서 Lock을 걸고 작업하려고 한다면 Lock이 걸리나요? Lock을 건다는건 메모리상에 실제로 생성된 객체(?)를 기준으로 걸리는 건가요? 설명이 많이 미흡한 점 죄송합니다 ㅜ.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
딜리게이트 이해 질문입니다
제가 완벽하게 이해못한거같아 질문드립니다! 질문1. 대리자 딜리게이트를 쓰는이유 함수나 클래스내에 수많은 기능이 있고 그 모든 기능을 전부 쓸필요가 없다면 필요한 기능(함수)만 입력하여 반환 받아 사용하는 편리성? 역할이 맞는가요 질문2. 대리자 사용방법 수업을 들으며 3가지를 만들어야하는거 같았습니다 1. 대리자 delegate 2. 대리자가 사용할 함수(이걸 인자로 넘김) 3. 대리자 함수를 인자로 받으면 그에맞는 값을 반환하는함수 ================================== ( 수업에선 delegate int OnClicked(); ) (우리가 인자에 넣을)함수를 전해주는 대리자 delegate + 반환형식 + 대리자이름(); 여기서 대리자와 같은 형식이며 대리자와 같은 클래스내 함수들을 s라고 하면 메인함수에서 대리자 대 = new 대리자(); 로 객체 생성하고 대리자 대 = new 대리자(s); 또는 대 = s ; 대리자에 함수 전달 =================================== (수업에선 ButtonPressed(Onclicked clickedFunction)) 함수를 지닌 대리자 혹은 함수 자체를 인자로 받는 함수 하나 더 생성 static void Result( 함수 혹은 [함수가 담긴 대리자] ) { 함수(); } 역할은 인자로받은 함수내 필드값을 반환 해주는 함수 ====================================== 끝으로 대리자에 들어가는 함수들은 대리자와 같은 형식이어야하고 (같은 반환형식) 각 함수마다 필드내용은 다르게 설정가능?!? (콘솔명령어로 테스트해보니 그런거같아보여서요) static int test1(){ return 1; } static int test2(){ return 2; } 가 있다면 대리자에 test1함수를 넣고 대리자 혹은 test1함수를 result(대리자 인자)의 인자로 넣을시 1의 값을 반환 대리자에 test2함수를 넣으면 2의 값이 반환되는것이 맞나요?====================================
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unity 실행이 안됩니다..
NetworkManager 에 script를 추가하고 실행을 하면 Unity가 멈춥니다. NetworkManager를 빼고 실행하면 실행이 되는데 뭐가 문제인지 잘 모르겠네요.. 노트북으로 실습하고 있습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
25 x 25 질문입니다
강사님 while(true) 로 하고 강사님의 코드와 똑같이하고 실행하면 마우스 커서 포인트가 0,0 에서 25*25 계속 생성이 안되고 쭉 내려오는식으로 계속 생성이 됩니다. using System; namespace Algorithm { class Program { static void Main(string[] args) { Console.CursorVisible = false; const int WAIT_TICK = 1000 / 30; const string CIRCLE = "●"; int lastTick = 0; while(true) { #region 프레임 관리 // FPS 프레임 ( 60프레임 OK 30프레임 이하로 내려가면 뚝뚝 끊긴다) int currentTick = System.Environment.TickCount & Int32.MaxValue; // 만약에 경과한 시간이 1/30 초볻 작다면 continue; 한다. if(currentTick - lastTick < WAIT_TICK) continue; lastTick = currentTick; #endregion // 1. 입력 // 2. 로직 // 3. 렌더링 Console.SetCursorPosition(0, 0); for(int i = 0; i < 25; i++) { for(int j =0; j< 25; j++) { Console.ForegroundColor = ConsoleColor.Green; System.Console.Write(CIRCLE); } System.Console.WriteLine(); } } } } }
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
객체지향과 절차지향의 구조적(?) 차이점 및 기타질문
아아앗... 질문하구 보니 다음 강의에서 질문 드렸던 내용들이 나오네요... 그래두 질문은 남겨둡니다. 답변 미리 감사드립니다^^ 안녕하세요! 오늘도 강의 잘 보았습니다. 항상 기본적인 질문만 드리는 것 같아 민망하네요... 강의 보고 객체지향, 절차지향의 개념을 처음 알게 돼서 정확히 알고 싶어서 검색을 해보았는데 해결이 안 되는 부분이 있어서 질문을 남깁니다. 1. C 계열 언어는 절차지향 언어이다 혹은 절차지향 언어에 가깝다는 검색 결과가 많았는데, 이러한 C 언어에서 객체지향 프로그래밍을 할 때 이점이 있나요? C 언어가 절차지향 언어라면 객체지향을 사용하는 건 약간 목적이나 기능을 거스르는? 것이 아닌가 하는 의문이 들어서요. 2. 절차지향, 객체지향에 대한 개념적인 차이는 어느정도 이해가 되었는데 코드 구현상에서 그 차이를 잘 모르겠습니다. 선생님이 보여주신 class Knight에 knight의 속성을 넣어서 모듈화 한 것도 이전 강의에서 사용했던 것과 어떻게 다른지 크게 와닿지 않았습니다. 예를 들어서 지난 강의에서 struct를 사용해서 모듬세트를 만들어준다고 하셨는데 그것과 class가 어떻게 다른지, 어떤 상황에서 다른지 잘 모르겠습니다. 검색을 해보았을 때도 접근방법, 상속참조의 차이다 라는 내용이 주를 이뤄서 이 두 개를 왜 구분해야하는가?에 대한 의문은 해결이 안 되었어요. 그리고 혹시 C# 관련 교재를 추천받을 수 있을까요? 기초적 질문을 하게 될 때마다 항상 먼저 검색을 해보곤 하는데 블로그 등으로 알아보는 게 한계가 있는 것 같아서요. 책을 통해서 좀 더 공부하고 싶은데 좋은 교재가 있다면 추천받고 싶습니다! 마지막 질문으로 게임학원을 다니셨다고 했는데 학원을 다니는 것이 좋은 선택이었다고 생각하시는지 궁금합니다. 선생님 강의도 정말 훌륭하지만(제가 인프런에서 들어본 것중에 제일 좋았어요) 혼자서 공부하는 게 힘들 때도 있어서 학원을 고민 중이거든요. 학원에 대한 평가가 워낙 갈려서 선생님 의견도 참고하고 싶어서 여쭤봅니다. 긴 질문 죄송하고, 늘 자세한 답변 감사드립니다. 좋은 하루 보내세요! ^__^
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
구조체(struct) 활용과 열거형(enum)과의 차이점
안녕하세요. 수업 잘 듣고 있습니다! 항상 감사드립니다. 이번 강좌에서 hp, attack 등 다양한 값을 일일이 입력하고 수정하기 귀찮기 때문에 구조체를 만들어서 값을 가져온다고 알려주셨는데 struct 함수와 enum 함수 사용에 어떤 차이가 있는지 알고 싶습니다. 검색해서 봤는데 enum은 순서대로 배열하고 struct는 일치되지 않은 여러 형태의 매개변수를 쓸 수 있는 것이 유용하다고 배웠습니다. 그런데 영상에서는 hp, attack은 int로 주고, player type은 player라는 새롭게 만든 함수로 줬고 그로 인해서 오류가 발생해서 player를 삭제하고 함수를 사용했는데 그렇게 되면 원래 일일이 인자를 넣어주던 거랑 어떻게 다른지 감이 오지 않아서요. 둘 다 인자 값을 하나하나 일치시키지 않으면 오류가 발생하는데 struct를 써야하는 이유가 따로 있는가?가 궁금해요. 그리고 저번 강의에서 C#은 인덱스를 불러올 때 전체를 다 불러오지 않고 일부만 지정해서 불러올 수 있다고 하셨는데, struct도 그런 식으로 일부만 지정해서 불러와서 쓰면 안 되는 건가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 Lock
안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다. ServerCore의 Send부분 입니다. 제가 다음과 같이 이해를 했습니다. Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다. 일단 이렇게 이해하는게 맞는건지 궁금합니다. 만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
왜 8바이트가 나오는지 잘 모르겠습니다.
8:24에서 "ABCD"의 길이는 4인데 바이트 배열로 바꾸면 왜 8바이트가 되는지 모르겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
매개변수에 int 지정을 하지 않으면 어떻게 되나요?
안녕하세요. 항상 좋은 강의 감사드립니다. 이번 수업에서 Add 함수를 만들 때 반환값을 정수로 정하기 위해서 int를 넣은 부분까지는 이해가 됐는데요 매개변수에도 int를 주셨잖아요 만약 int를 지정하지 않으면 함수가 a, b가 숫자(정수)더라도 정수라고 인식하지 못해서 오류가 나나요? 아니면 단순히 정수라는 것을 좀 더 명확하게 표현하기 위해서 int를 넣은 것인가요? 그리고 아래와 같이 Console.ReadLine을 통해서 a, b를 입력받도록 했는데 '실행할 테스트 파일이 없다'는 오류가 출력되는데 이유가 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
Do while 질문 복수응답 관련 추가질문입니다.
[추가질문] 위에서 다른 학우분이 질문해주신 것에 대한 추가 질문입니다! answer가 y, Y, yes, YES, Yes... 등 개수가 많아져서 일일이 or를 적어주기 힘들 때는 지난 강의(13강)에서 enum 지정해줬던 것처럼 그룹으로 만들어서 해당 그룹/인덱스 안의 string이면 정답처리 할 수 있을 것 같은데 그럴 때는 어떤 함수를 쓰면 될까요? enum말고 estring 등이 있나요? estring Answer { YES = 0 Yes = 1 yes = 2 Y = 3 y = 4} Do Console.WriteLine("강사님은 잘생기셨나요? (y/n): "); string Answer = Console.ReadLine(); } while (answer != Answer); 이런 식으로요! 그리고 y/n 말고 아예 엉뚱한 답(0, ㅋ, ' 등)을 적는 사람에게는 "YES or NO 중 골라주세요" 와 같은 문장을 출력하고 다시 while문으로 돌아가게 하고 싶다면 방법이 있을까요? 이 땐 while문이 아니라 if문을 결합해야 할까요? 알려주시면 감사하겠습니다!
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
디버깅이나 실행 시 너무 오래걸립니다...
이처럼 브레이크 포인트를 잡고 디버깅을 하였는데 아무리 기다려도 끝나지 않습니다. 브레이크 포인트를 program의 player.Initialize(1, 1, board);에 잡고 실행하고 f10이 아닌 f11를 통해 코드 작동을 확인하면 잘 작동하는 것은 확인했습니다. 혹시 컴퓨터의 성능에서 오는 문제인가요? 혹시 몰라 우수법 부분의 코드도 함께 올립니다. public void Initialize(int posY,int posX, Board board) { PosX = posX; PosY = posY; _board = board; int[] frontY = new int[] { -1, 0, 1, 0 }; int[] frontX = new int[] { 0, -1, 0, 1 }; int[] rightY = new int[] { 0, -1, 0, 1 }; int[] rightX = new int[] { 1, 0, -1, 0 }; _point.Add(new Pos(PosY, PosX)); while (PosY != board.DestY || PosX != board.DestX) { //1. [현재 바라보는 방향]을 기준으로 오른쪽으로 갈 수 있는지 확인. if (_board.Tile[PosX + rightX[_dir], PosY + rightY[_dir]] != Board.TileType.Wall) { //오른쪽 방향으로 90도 회전 : 시계방향 _dir = (_dir - 1 + 4) % 4; //[현재 바라보는 방향]으로 앞으로 한 보 전진 PosX = PosX + frontX[_dir]; PosY = PosY + frontY[_dir]; _point.Add(new Pos(PosY, PosX)); } //2. [현재 바라보는 방향]을 기준으로 전진할 수 있는지 확인. else if (_board.Tile[PosX + frontX[_dir], PosY + frontY[_dir]] != Board.TileType.Wall) { // 앞으로 전진 PosX = PosX + frontX[_dir]; PosY = PosY + frontY[_dir]; _point.Add(new Pos(PosY, PosX)); } else { // 왼쪽 방향으로 90도 회전 _dir = (_dir + 1 + 4) % 4; } } }
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
동적 배열 구현 연습-예외 케이스 질문있습니다.
if (Count >= Capacity) 의 부분이 예외케이스라고 하셨는데, 그 이유가 정확히 해당 조건에 들어가야 진행되기 때문인가요? 아니면 단순히 이와같은 이사비용 문제는 무시한다는 약속이 주어져있는 이유에서 예외케이스인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
해당 강의 영상의 해상도가 너무 낮네요.
인프런의 오류인가요?ㅠㅠ 눈이 너무 아픕니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오류 : NullReferenceException
강의의 4:40초인 Debug.Log(Input.mousePosition); 에서는 정상 작동을 하는데 그 이후 과정인 Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); 을 입력하고 실행 시 위의 널레퍼런스익셉션 오류가 뜨네요 ㅠㅠ 어떻게 해결해야하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
할당 id가 계속 증가할 때 uint와 long 중 어느 것을 사용하는 게 낫나요?
수업 중 아이템 id가 약 21억개를 초과하여 int로는 더 이상 할당을 못 하게 될 수 있기 때문에 라이브 게임의 경우 처음부터 long을 쓰는 것이 좋은 선택일 수 있다고 하셨는데요 long의 경우 음수까지 커버하는데 아이템 id가 음수가 될 일은 없다고 생각합니다. 그런 경우엔 long보다 uint를 쓰는 것이 용량면에서 더 효율적이지 않을까 생각했는데 실제로 사용할 경우 어떤 차이가 있는지 알 수 있을까요? 더 장기적으로 봤을 때 uint를 쓰더라도 id가 그 수를 초과할 수 있기 때문에 그냥 편하게 long을 쓰는 게 좋은 건지, 아니면 uint와 long 사이에 문법적인 사용 차이 등이 있는지를 알고 싶습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
XmlReader의 Depth에 대해서
17:27에서 int depth = r.Depth +1; while(r.Read()) { if(r.Depth != depth) break; } 코드가 이렇게 됐었는데 <packet name="PlayerInfoReq"> <long name ="playerId"/> <string name ="name"/> <list name ="skill"> <int name="id"/> <short name ="level"/> <float name ="duration"/> </list> </packet> 그러면 <list name = "skill"> 다음 줄을 들어갈때는 while에서 빠져나가게 되는거 아닌가요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
BFS는 길찾기 DFS는 어떤걸 만들수있나요??
DFS를 사용하면 굉장히 다양한 방법으로 사용될 수 있다고 하셨는데 게임으로 비유하면 대체로 어떤 걸 만들 수 있는지 알 수 있을까요??