묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[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를 사용하면 굉장히 다양한 방법으로 사용될 수 있다고 하셨는데 게임으로 비유하면 대체로 어떤 걸 만들 수 있는지 알 수 있을까요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
서버 측에서의 맵데이터 관리 및 충돌판정
이번 강의를 보면서 궁금했던 점 중 하나가 맵에 대한 정보를 사전에 만들어서 클라와 서버가 사용하는 방식의 경우 특정 사용자가 악의적으로 맵에 대한 정보를 클라쪽에서만 수정할 수 있을 거 같습니다. 해당 방식말고 서버측에서만 맵 데이터를 만들고, 클라이언트가 접속을 할 때 서버측에서 파일을 전송하거나 정보를 제공하는 방식으로도 구현하는 경우가 있나요? 다른 궁금점은 타일맵같은 경우는 충돌판정이 비교적 간편해서 사용자가 손쉽게 구현하여 적용할 수 있는데, 2D, 3D 충돌판정은 타일맵보다 복잡하고 성능을 많이 잡아먹는데 서버측에서 계산하여 클라이언트에게 충돌 판정여부를 알리나요? 굳이 알리지 않더라도 2D, 3D 게임에서 충돌판정여부를 서버 측에서도 계산하여 Hit판정이나 이동가능 판정같은 거를 게임에 적용하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
브레이킹 포인트 잡는법
혹시 브레이킹 포인트 잡는법 자세히 알려주실 수 있나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
내용이 생각보다 되게 어렵네요. 학습 방법에 대한 질문을 드립니다
처음에 해당 강의를 전부 이해하고 넘어가는 것이 좋을까요 아니면 아 이런게 있나보다 하고 일단 끝까지 간 다음에 큰 틀을 대강 이해하고 여러 번 반복해서 숙달하는게 나을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓에 바로 메세지를 보내는게 아니라 버퍼를 만들어서 넣어주고 주고받는 이유가 있나요?
수신과 송신 버퍼를 둘 다 가지고 있고 거기에 일단 메시지를 넣어서 보내거나 버퍼를 통해서 받고 있는데 버퍼를 사용하는 이유가 소켓이 바로 메세지를 받지 못하고 대기하는 경우나 병목이 있을 경우를 대비해서 그런건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Scene 전환시 데이터 유지와 설계 질문
안녕하세요 ㅎㅎ 강의를 들으며 토이프로젝트로 조그마한 게임을 하나 만들고 있습니다. 몇 가지 궁금한 점이 생겨 질문드립니다. Q1.1) 아래 사진은 루카노르 백작 이라는 게임입니다. 캐릭터가 위의 문을 열고 들어가면 빌런인 염소가 존재합니다. 문제는 이 방을 나갔다 새로 들어와도 염소의 자리는 그대로 방을 나갈 당시 위치에 있습니다. 게임을 해본 추억을 되짚어 보니 두 가지로 나뉘더군요 1) 방을 나갔다 다시 들어오면 몹이 초기 젠 자리로 가있는 경우 2) 방을 나갔다 들어와도 아래와 같이 몹이 그자리 그대로 있는경우 1)번의 경우 모든걸 초기화하고 새로 만들면 될 것 같은데 2)번의 경우 기존의 정보를 어떤 방식으로 관리하는지 궁금합니다. 만약 던전의 방도 Scene으로 관리한다면 본 강의의 예제에서는 Scene간의 전환시 Manager를 통해 clear하는데 어떤식으로 코드를 수정해야할지 여쭙고싶습니다. 횡설수설하지만 정리해서 말씀드리면.. Scene전환시 이전 Scene으로 돌아갈때 이전 Scene의 상태를 그대로 유지한상태로 돌아가는 방법은 무엇인가요? Q2) 또 한가지 의문은, 리니지나 디아블로의 경우 던전의 한 층 자체를 Scene으로 관리할 것 같은데 아래와 같이 던전 내에 여러개의 문이 있고, 문에 입장하면 장면이 전환되는 경우 던전 내의 방들은 Scene으로 관리하나요? 설계는 개발자 마음대로라지만 Rookiss님이 게임을 만드신다면 어떻게 설계하실지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
InputManager의 작동 원리가 잘 이해되지 않습니다.
InputManager의 작동 원리가 잘 이해되지 않습니다. 그래서 디버깅으로 한 줄 한 줄 따라가 봤는데, 여전히 궁금한 점들이 있습니다. 1. 왜 InputManager _input = new InputManager();를 읽은 뒤 Init()를 다시 실행해서 DonDestroyOnLoad(go);를 읽는 건가요? Init();은 Start에 들어 있으니 첫 실행 때 한 번 호출되고 끝이어야 하는 게 아닌가요? 2. Managers의 업데이트에서 OnUpdate를 계속 호출해 줘서 키 입력을 감지하는 건 알겠는데 키 입력이 들어온 뒤 KeyAction.Invoke();가 어떤 역할을 하는지 모르겠습니다. 혹시 InputManager에서 if( KeyAction != null)일 경우 바로 OnKeyboard()를 호출하는 게 문법적으로 불가능하기 때문인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때...? 처리하는 부분이 있는건가요?
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때 다음 데이터가 올 때까지 기다린 후 처리한다고 말씀하셨는데, 이 부분이 코드 어디에 구현되어있는건가요...? 위에 있는 코드를 나름대로 해석해보니 1. OnWrite()는 _recvArgs.Buffer에 들어있는 데이터만큼 _recvBuffer의 _writePos를 증가시킨다. 2. OnRecv()한 데이터(_recvArgs.Buffer에 들어있는 데이터)의 크기를 processLen에 담는다. 3. processLen의 크기만큼 _readPos를 증가시킨다. 라고 이해했는데, 클라이언트에서 보낸 데이터가 완전한지 불완전한지 딱히 판단하는 부분은 없어보이고 그냥, [1.데이터가 들어온만큼 _writePos를 증가시킨다 2. 처리한다 3. 처리한만큼 _readPos를 증가시킨다]를 실행시킨거같아서요!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
매핑 단어 뜻
강의중간중간 매핑이라는 단어가 나오는데 코드를 보고 구글링을 해도 정확한의미를 잘 모르겟어서 질문드립니다 ㅠ