묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
sprite atlas를 로드하는데
다운로드는 메인 popup에서 하잖아요 로드를 하려는데로드를 하면 꼭 release를 해줘야 하나요? 게임 켤때 로드 -> 게임 꺼질때 release게임 꺼서 release 해줬으면 다음에 게임 켤때 또 로드 이렇게 해줘야 하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
게임을 만들기 전에 서버공부부터 해야할까요?
안녕하세요! 캐쥬얼 싱글 게임을 만드려고 하는 뉴비입니다. 강의수강중에 서버에 관련한 질문을 보다가 저도 비슷한 궁금증이 있어서 댓글 남깁니다. 싱글 게임에는 굳이 서버가 필요 없다고 하셨는데요 그래도 플레이팹이나 파이어베이스같은 서버를 붙히고 싶습니다!1. 유저 데이터를 서버에서 받아서 여러 기기에서 플레이해도 설정값 등등을 불러올수 있도록2. 주기적으로 클라이언트의 데이터 값과 서버의 데이터값을 비교해서 동기화3. 인게임 재화를 이용한 상자에서 나오는 아이템들을 처리하는 함수등등 중요한 데이터를 서버에서 호출4. 우편함 시스템 등등위와 같은 기능들을 서버로 구현해서 보안도 향상시키고 일부 편의 기능들도 추가하고싶어요. 그런데 제가 서버에 대한 지식이 전무하다는게 문제입니다 : (그래서 지금 당장 서버공부 부터 시작을 해야할까요? 게임을 만들다가 추후에 서버를 붙히려고 하면 기존의 코드를 전부 수정해야한다던지 하는 일이 일어나지는 않을까요..? (이부분이 제일 궁금합니다) 배움의 순서가 어느것이 맞는 것인지 게임을 만들면서 추후에 서버를 고려해도 괜찮은지 루키스님의 의견 부탁드립니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session #2 내용중 왜 스레드가 동시다발적으로 접근 불가능한지 질문
Session#2 강의 시작부분에 설명해주신 내용에서, SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다. 라고 하셨는데, 왜 그런지 이해를 못했습니다. ServerCore의 OnAcceptHandler는 콜백함수라서 콜백함수는 다른 스레드가 생겨나서 실행이 된다고 들었던 것 같은데, 그렇다면 두 스레드가 OnAcceptHandler에서 Session.Start()를 해버리면 OnRecvCompleted()메서드를 두 스레드가 동시에 실행할 경우가 생기지 않나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
listener, session 간의 차이
안녕하세요, listener, session 코드간 차이점에 대해서 질문이 있습니다. 1, listener에서는 OnRecvCompleted()와같은 메서드에서 socketerror가 발생했을 때, disconnect를 하지 않았는데, session에서는 왜 disconnect를 하는 건가요? 2.listener 에서는 registerRecv() 와같은 함수를 OnRecvCompleted의 if, else와 상관없이 실행한거같은데, 왜 session에서는 if(args.Bytes.Transferred > 0 && ~~~) 을 만족해야 OnRecvCompleted를 실행하는건가요? using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; namespace ServerCore { class Session { Socket _socket; public void init(Socket socket) { _socket = socket; SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); //userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문) recvArgs.SetBuffer(new byte[1024],0,1024); RegisterRecv(recvArgs); } void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } } void OnRecvCompleted(object obj, SocketAsyncEventArgs args) { //BytesTransferred == 몇바이트 받았는지 if (args.BytesTransferred>0 && args.SocketError == SocketError.Success) { try { string recvData = Encoding.UTF8.GetString(args.Buffer, args.Offset, args.BytesTransferred); Console.WriteLine($"[from client] : {recvData}"); RegisterRecv(args); } catch(Exception e) { Console.WriteLine($"onrecvcompleted failed {e}"); } } else { //TODO Disconnect } } } }
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener, Session 에서의 콜백메서드 질문
안녕하세요, listener, session 클래스를 구현할 때, 콜백메서드에 대해 질문이 있습니다. 아래와 같은 코드에서, using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; namespace ServerCore { class Session { Socket _socket; public void init(Socket socket) { _socket = socket; SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); //userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문) recvArgs.SetBuffer(new byte[1024],0,1024); RegisterRecv(recvArgs); } void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } } void OnRecvCompleted(object obj, SocketAsyncEventArgs args) { if (args.SocketError == SocketError.Success) { string recvData = Encoding.UTF8.GetString(args.Buffer, 0, args.Buffer.Length); Console.WriteLine($"[from client] : {recvData}"); } else { Console.WriteLine(args.SocketError.ToString()); } RegisterRecv(args); } } } 해당 RegisterRecv()메서드에서 pending이 false인 경우 바로 OnRecvCompleted()를 호출해주는거고, true인 경우 콜백메서드로 OnRecvCompleted가 호출되는 형식이라고 이해를 했는데, void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } }그렇다면, pending이 false인 경우에는 if(pending == false) { OnRecvCompleted(null, args); }여기서 OnRecvCompleted() 호출되고 또 콜백메서드에서 또 한번 호출되는 것 아닌가요? 콜백메서드가 false인 경우에 2번호출되지 않는다는 것을 어떻게 이해하면 될까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
제네릭 타입 질문
학습중에 클래스를 제네릭으로 받으면 어떻게 될까 궁금해 한번 받아봤습니다!우선 필요한 정보를 받아올때 json 파일마다 역직렬화 & 직렬화 용도의 클래스가 다르기 때문에해당 부분을 public IEnumerator CoDownLoadJsonData<T>(string URL) where T : class { UnityWebRequest request = UnityWebRequest.Get(URL); yield return request.SendWebRequest(); // 에러 발생 시 if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.Log(request.error); } // 에러 없을 시 else { // S3의 JSON 파일 읽어와서 넣어주기 T[] jsonDatas = JsonConvert.DeserializeObject<T[]>(request.downloadHandler.text); // 그 뒤 값 처리 해주는 부분 foreach (T jsonData in jsonDatas) { // TEMP Debug.Log(무슨 값을 넣어야 할까요); } } }이렇게 짜봤습니다. 위의 함수를 실행 할 때 넣은 T 값은 public class JsonData{ public string name; public int coin; public int ruby;}JsonData라는 클래스 입니다.그리고 다운로드 받은 json 데이터의 name 값을 보기위해 '무슨 값을 넣어야 할까요'부분에 jsonData.name을 쳐보았지만 타입이 제네릭이라 받기전까지 name이 있나 없나를 알 수 없기 때문에 당연히 해당 코드는 에러가 났습니다. 이러면 파싱 받을 json 데이터 마다의 클래스를 따로 분기해서 처리해줘야 한다는 말인데 제네릭 타입을 이용하여 루키스님 처럼 우아?하게 코드를 짜보고 싶은 생각이 드네요. 방법을 못 찼겠어서 질문드립니다!!현재 저의 머리로는 제네릭으로 만든후 안에 조건문을 추가해서 as 로 파싱되면 그쪽으로 처리하는 분기문을 만드는게 한계인거 같네요 ㅠㅠ값은 정상적으로 받아와집니다만 브레이크 포인트를 통해서 값을 확인하는 것이 아니면 확인이 안되네요 ㅠㅠ
-
미해결C# 입문부터 Xamarin Forms(자마린 폼즈) + Maui(마우이) 안드로이드, 윈도우 앱(UWP) 동시에 만들기
예제 파일 다운 관련
예제 파일은 어디서 다운 받나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
일정 확률로 도망 호출시
그 저는 if문 말고 switch문으로 하여 switch(input)case"1": Fight(ref player, ref monster break;case"2": randExit(ref player,ref monster); break;2번 선택 시static void randExit(ref Player player, ref Monster monster){ Ranom rand = new Random(); int randValue = rand.Next(1,101); if (randValue <= 33) { Console.WriteLine("탈출 성공"); EnterGame(ref player); } else { Console.WriteLine("탈출 실패"); Fight(ref player, ref monster); } 이렇게 했는데 이렇게하면 스택 영역에 또 함수를 호출하는 것으로 부담을 주는 걸까요?randExit 함수를 넣음으로써 뭔가 경로를 추가한 느낌이라서 더 안좋은지 궁금합니다. ( 심각할 정도의 의구심이 드는건 아니고 살짝 갖게 된 의문점입니다)
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
환경설정 질문입니다
안녕하세요 선생님, 제가 새 프로젝트를 만들면서 이름과 위치를 정하고 다음으로 넘어갔더니 대상 프레임워크에 .NET Core 3.1 (지원하지 않음) 이라고 나옵니다.visualstudio installer에서 제가 보기에 c#에 관련된 것은 다 설치한 상태인데 더 설치해야 하는 것이 있는걸까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
public 질문입니다
struct 변수들을 개방을 할때public struct Player {int hp; int attack;}struct Player{public int hp; public int attack;}둘다 같은 의미인줄 알았는데1번을 하면 오류가 나고2번처럼 변수 하나하나에 퍼블릭을 넣어야하는게 묶음 전체를 개방한다도 될거같은데 왜 안되는지 이유를 여쭤봐도되나요? 1번 처럼 구조체 자체에 퍼블릭을 넣는 경우도 있나요? 혹시 객체파트로 넘어갈때 쓰이는 것일까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ConnectionReset
DummyClient의 접속을 끊었을때 ServerCore에 ConnectionReset이란 로그가 뜨는데 따로 로그가 뜨도록 작성하지 않았는데 무엇 때문에 어디서 뜨는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
정말 감사히 듣고 있습니다..!! 질문이 몇가지 있습니다..!
강의 너무 잘 듣고 있습니다. MMO RPG를 너무 만들어보고 싶었는데.. 이런 귀한 내용들을 자세히 설명해주시는 분이 있다니.. 정말 큰 도움이 됩니다 다름아니라 해당 강의를 듣다가 문득 궁금해지는 점이 있어 실례안된다면 간략하게라도 의견을 듣고싶어 여쭙게 되었습니다...! 질문은 2개 입니다..!(현재 저는 4챕터까지만 듣고 질문을 드리는 상태임을 미리 말씀드립니다)MMO RPG 서버는 scale out 을 어떻게 할까?? 에 대한 궁금증 입니다.스케일 아웃의 방법을 보통 어떻게 하게 되는지 궁금해져서 여쭤봅니다(제가 부족한지 검색을해도 구체적인 방법들이 잘 안나오는 것 같아서.. 간단하게라도 보통 어떻게하는지 궁금하네요..) 만약 1,2,3,4,5,6,7... 100 맵이 있다고 가정하고, 1번맵에만 유저들이 정말 많아서 하나의 서버로 감당이 부담스럽다고 했을때, 1번 맵을 위해 2개 3개의 서버를 투입하는것이 가능할까요..?왠지 강의를 들었을땐 1번맵의 서비스를 1개의 서버로 밖에 못하지 않을까.. 싶은데.. 우선 제가 생각해본 방식은.. 아래와 같습니다- 1번맵의 경우에는 send할 내용들을 한 서버의 메모리에 두는게 아니라 레디스라는 메모리DB에 저장을 한다- 3개 혹은 4개정도 되는서버가 이 레디스를 바라보고 데이터를 가져와서 연결된 클라이언트들에게 데이터를 전송흠.. 그런데 이렇게하면 속도가 충분히(?) 빠를지에 대한 의문이 들어서 보통의 MMO RPG 서버들에서 이런식으로 scale out을 하는게 맞는방식인지 감이 오지않아 질문 드립니다.MMO RPG 서버는 만약 로직을 수정한다고 한다면 서버점검같은걸 하지 않고 해당로직을 수정해서 배포가 가능할까요??강의내용에서는 서버의 메모리에 유저들의 정보를 다 갖고있어야할 것 같고... 그렇게 되면 중간에 로직을 수정해서 새로운 서버를 띄우고 기존서버를 죽이게되면.. 해당 서버에 접속해있던 유저들이 다 튕기게 되지 않을까 싶어서요. 유저들이 인지하지 않게 편안하게 서버내용을 바꾸는것이 MMO RPG 서버에서 가능할까요..? 끝까지 읽어주셔서 감사드립니다. 강의 정말 잘 듣고 있습니다!!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReadOnlySpan을 사용하는 이유를 알고 싶습니다
Span을 사용하면 다른 문제가 발생하는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코드에서 이해가 잘 안되는 부분이 있어 질문 드립니다
this.playerId = BitConverter.ToInt64(new ReadOnlySpan<byte>(s.Array, s.Offset + count, s.Count - count));이 코드로 수정을 하면 해결이 된다고 하셨는데 왜 이걸로 해결이 되는지 잘 이해가 안가서 질문합니다
-
미해결WPF (.NET Core, C#, 자막제공)
릴레이커맨드 비동기로직이 아니어도 asyncrelaycommand로 icommand 만드나요?
showdialog 강의에서 버튼을 하나 더 만들고asyncRelayCommand로 만들어주었는데 이런 비동기가 필요없는 로직에서도 이런식으로 만드는게 좋나요?
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
Unloading 5 Unused Serialized files
다운로드 완료 후 씬 로드를 하려고 하는데(씬 파일 자체가 다운로드 파일이에요)Addressables.LoadSceneAsync("~~").Completed+=(result)=> {~~ 이렇게 불러오게 했는데Unloading 5 Unused Serialized files 오류가 뜨면서프로그램이 튕겨져요....ㅠㅠ 에러 이유를 모르겠어요.
-
해결됨C# TCP/IP 소켓 프로그래밍
5:34 질문 있습니다.
안녕하세요 강의 복습중 궁금한점 생겨서 질문드립니다.21번줄에 client가 Accept한 이후 통신에 대한 함수(ReadAsync)를 ThreadPool에 추가하는 형태로 코딩을 하셨는데요ReadAsync함수에서는 while(true)내부에서 지속적으로 클라이언트와 통신을 해야하기 때문에 사실상 QueueUserWorkItem로인해 생성된 쓰레드풀의 쓰레드가 대기상태로 돌아가는 상황은 클라이언트가 연결을 종료했을 경우 말고는 없기 때문에쓰레드풀의 쓰레드1개 = 클라이언트1개로 이해했습니다.그렇다면 클라이언트가 connect요청을 하여 서버쪽에서accept를 할때마다 쓰레드풀의 쓰레드를 1개식 할당 하는 구조상클라이언트 100명만 접속하더라도 쓰레드풀의 쓰레드 100개를 사용하게 되는건데 성능상 문제가 생기진 않는걸까요? 아니면 비동기 방식이기 때문에 괜찮은건가요?혹은 쓰레드풀의 쓰레드1개 = 클라이언트1개 라는 조건이 틀린걸까요?제가 잘못 이해한 부분이 있는걸까요?
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
혹시 강의 내용 정리한 것을 블로그에 포스팅 해도 될까요??
안녕하세요! 포트폴리오 겸해서 블로그를 하고있는중인데요...혹시 강의 내용 정리한 것을 블로그에 포스팅 해도 될까요??출처는 표기하도록 하겠습니다!! 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
처음출력부분이
[From Client] Hello World! 0[From Client] Hello World!1 Hello World 2 이런식으로 되는 이유가 무엇인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
충돌처리 질문
안녕하세요 강사님 강사님 강의를 듣고 IOCP서버와 유니티 클라이언트로 3D rpg게임을 제작하고 있습니다.충돌처리 같은경우 유니티에서 제공하는 boxcollider를 써서 충돌처리를 구현하는 방법을 사용해도 되나요?