묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Console.Writeline 메모리누수
JobTimer 까지 모두 수강하고 Session쪽 코드에서 RecvBuffer _recvBuffer = new RecvBuffer(1024); 이것만 이렇게 다시 수정했습니다. 그리고 실행시켰는데 메모리가 늘어나더니 저런 오류가 떠서 Console.Writeline 쪽 코드를 지우고 실행시키니까이렇게 메모리가 계속 늘어나지 않고 일정하게 유지 되는데 단순히 Console.Writeline이 많이 실행돼서 그런건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptAsync() 와 BeginAccept() 의 차이가 궁금합니다.
이 강의를 구매하기 전 이런저런 자료를 찾아보며 혼자 TCP 통신을 공부하고 있었습니다. 그런데 제가 공부할 때는 Begin~() 를 사용했었습니다. 그런데 이 강의 에서는 ~Async() 를 사용하더라고요 사용하기는 Begin~() 이 더 간단하던데 이 강의에서 ~Async() 를 사용하는 다른 이유가 있을까요? 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
ServerCore 일부 복붙하는걸 심볼릭링크로 해도 괜찮을까요?
유니티 측에서 사용자정의 심볼을 넣어서위 사진과 같이 전처리기를 사용해Server측에서는 Console.WriteLineClient측에서는 Debug.Log이 호출되도록 구성하였습니다. 에디터상에서 실행하는것까지는 크게 문제없이 잘 되는 것 같습니다! 이러면 어느쪽에서든 로직 사소하게 변경해도복붙 까먹는 일이 없어 좋아보이는데혹시 퍼블리싱단계나 추후에 크게 문제될 부분이 있을까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Poolable 컴포넌트를 코드를 통해 넣어주려면
강의에선 Poolable 컴포넌트를 유니티 실행 전에 유니티에서 드래그앤드롭으로 미리 넣어줍니다.제 질문은 강의처럼 미리 넣어주는게 아닌 실행된 뒤에 코드에서 GetOrAddComponent함수를 통해 넣어주려고 합니다.그런데 코드에서 GetOrAddComponent함수를 통해 넣어주면 복제가 된 뒤에 넣어져 풀링이 되지 않습니다. ResourceManager의 Instantiate 함수를 보면 Object.Instantiate를 실행하기 전에 풀링된 오브젝트가 있는지 확인을 해서 그런거 같습니다.Pop()함수가 호출이 안되니 _pool Dictionary에 새로 생성되지 않습니다.제 생각에는 Push 함수에서도 CreatePool을 해주는 방식이나 ResourceManager의 Instantiate 함수 안에서 Object.Instantiate를 실행하기 전에 오브젝트의 이름이나 태그를 통해 미리 넣어주고 복사하는 방식이 생각이 나는데 전자는 강의에서 말씀하신 예외사항에 대처할 수 없고 후자는 그리 효율적이라고 생각되지 않습니다.혹시 다른 좋은 방법이 있을까요?강의에서 말씀한 내용이라면 죄송합니다.
-
해결됨[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
어드레서블 관련 궁금한 점이 있습니다
안녕하세요 좋은 강의 감사합니다.어드레서블 관련해서 궁금한 점이 있어서요. 앱을 출시하고 업데이트 할 때, 검토 기간이 어느 정도 소요되는 것으로 알고 있습니다. (UI_LobbyScene.prefab 을 예시로 가져왔습니다)현재 버전인 A 를 (화살표 기준으로) 위의 이미지, 업데이트 될 버전 B 를 아래의 이미지로 가정 했을 때,어드레서블 파일들을 업데이트 하고, 검토를 보낸다면, 검토가 완료되기 전 까지어드레서블 만 업데이트 된 A 버전의 사람들은작동하지 않는 [이벤트] 버튼을 사용하게 될 것 같은데요. 아직 이벤트 기능을 포함한 스크립트가 생성된 B 버전의 앱은 출시가 되지 않은 상황 이기 때문입니다. 혹시 이 부분을 어떻게 해결 하면 좋을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Get Instance () 궁금합니다
Get Instance () 이거는 기본 내장 함수 인가요 ? 이해가 잘안됩니다..{} 안에 있는 리턴 은 어디로 리턴 받나요 기초 강의인데 설명이 없어서요 ㅠㅠ혹시 설명 부탁드려도 되나요get 하고 중괄호 사용하시던데.. 헷갈려서요 설명부탁드립니다
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
zenject를 현업에서도 많이 사용하나요?
zenject를 배우고 이를 프로젝트에 활용해서 개발하고 있었는데 이번에 이 강의를 보고 배우면서 이전에 구현하던 방식에 좀 회의가 들어서요. 제가 zenject에 대해 완벽히 알고 있는게 아니라 개발 속도가 많이 느리기도 하고 진행 중이신 프로젝트를 zenject로 바꿔서 개발할 수 있을지 확신이 없기도 하네요..혹시나 다른 개발자 분들이 투입된다면 협업하는데 장애가 될까 걱정도 되서 질문 남깁니다.그리고 좋은 강의 감사합니다.
-
미해결C# TCP/IP 소켓 프로그래밍
에러에 관한 질문입니다.
************** 예외 텍스트 **************System.Net.Sockets.SocketException (10061): 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)--- End of stack trace from previous location ---at Client.Singleton.ConnectAsync() in P:\Chat\Client\Singleton.cs:line 36at Client.LoginForm.btn_login_Click(Object sender, EventArgs e) in P:\Chat\Client\LoginForm.cs:line 20at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state) 16:45초 로그인 할 때 이렇게 뜨네요 ㅠㅠ 해당 라인 가보면LoginForm.csawait Singleton.Instance.ConnectAsync(); Singleton.csawait Socket.ConnectAsync(endPoint);입니다. 아이피와 포트도 제대로 입력해주었습니다. 강사님이 올려주신 파일 통째로 받아서 해봤는데도 동일한 오류가 발생합니다. 어떻게 해결해야하나요?코드 첨부합니다.LoginForm.csusing Core;namespace Client;public partial class LoginForm : Form{ public LoginForm() { InitializeComponent(); } private async Task btn_login_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbx_id.Text) || string.IsNullOrEmpty(tbx_nickname.Text)) { MessageBox.Show("입력하세요"); return; } await Singleton.Instance.ConnectAsync(); LoginRequestPacket packet = new LoginRequestPacket(tbx_id.Text, tbx_nickname.Text); await Singleton.Instance.Socket.SendAsync(packet.Serialize(), System.Net.Sockets.SocketFlags.None); Singleton.Instance.Id = tbx_id.Text; Singleton.Instance.Nickname = tbx_nickname.Text; RoomList roomList = new RoomList(); roomList.ShowDialog(); }}Singleton.csusing System.Net;using System.Net.Sockets;namespace Client;/// <summary>/// 언제 어디서나 접근할 수 있는 객체./// 이 객체는 반드시 1개만 존재해야 한다./// </summary>internal class Singleton{ public string Id { get; set; } = null!; public string Nickname { get; set; } = null!; public Socket Socket { get; } = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static Singleton? instance; public static Singleton Instance { get { if (instance == null) instance = new Singleton(); return instance; } } private Singleton() { } public async Task ConnectAsync() { IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.219.106"), 20001); await Socket.ConnectAsync(endPoint); ThreadPool.QueueUserWorkItem(ReceiveAsync, Socket); } private async void ReceiveAsync(object? sender) { Socket socket = (Socket)sender!; byte[] headerBuffer = new byte[2]; while (true) { #region 헤더버퍼 가져옮 int n1 = await socket.ReceiveAsync(headerBuffer, SocketFlags.None); if (n1 < 1) { Console.WriteLine("client disconnect"); socket.Dispose(); return; } else if (n1 == 1) { await socket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None); } #endregion #region 데이터버퍼 가져옮 short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); byte[] dataBuffer = new byte[dataSize]; int totalRecv = 0; while (totalRecv < dataSize) { int n2 = await socket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); totalRecv += n2; } #endregion } }}
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
안녕하세요 오늘 첫 수업들었는데 질문 있습니다
1달차 처음 강의 영상봤는데 Managers질문 1 : 영상에서 나중에 보충수업에서 설명해주신다고 했는데 어디서 볼수있나요 ??질문 2: 혹시 공부중에 못따라가면 어떤 강의 보충 하면 좋나요 ?질문 3 : 디스코드 초대 어떻게 받을 수 있나요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
15:09 GenPackets.bat
15:09초까지 똑같이 따라하고그래서 최신 버전도 protobuf를 받아서 해봤지만아무리 다시 해보고 찾아 보려해도 아무것도 뜨지 않는데 이유를 알 수가 없습니다 ㅠㅠㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
혹시 게임을 시작할 때 애니메이션이 움직이는거로 시작하는데
22:24의 부분에서부터 말씀해주시는 것 중 루키스님께서 말씀하신것은 2개인거로 사료됩니다.Start에 원하는 애니메이션 플레이 코드 삽입움직일 때 None이 되면 가만히 있는 코드를 역이용하여 사용.이렇게 있는데 잠깐 애니메이터를 만지다가 알게 된 건데 애니메이터의 'Entry' 블록에서 Default state를 IDLE_RIGHT와 같이 원하는 항목으로 지정해도 되더라구요. 혹시 현업에서는 어떻게 이용하는지 궁금합니다.1, 2번처럼 하게 될 때 걱정되는 점은 만약에 도중에 애니메이션 파일 이름을 변경하게 될 때 코드에서 까지 바꿔야 되는 점이 염려스럽습니다.나중에는 애니메이션 파일이 하나 뿐만이 아닐텐데 그것을 일일이 찾기도 어려울 것이라고 판단했습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
클래스 분리
player.cs파일을 따로 만드셔서 거기에 캐릭터 별 클래스를 다 넣으셨는데 현업에서는 캐릭터 별로 더 세부적으로 cs파일로 분리하나요? 아니면 강의에서 쓰셨던 코드처럼 한 cs파일에 player, knght, mage등 여러 클래스가 들어있나요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
언리얼 소스 분석 강의
언리얼 소스 분석 강의 결제 했는데3일전에 디코 초대가 메일로 온다고 했는데 안와서 문의 드립니다.언리얼 소스 분석 강의엔 질문할 곳이 없어서 여기에 질문 드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문 있습니다
영상에서 7분즘에 이런 말씀을 하셨는데요."커넥터를 딱 하나만 하는 경우도 있겠지만 경우에 따라서는 우리가 리스너에서 계속 뺑뺑이를 돌면서 천명이건 만명이건 계속 받을 수 있는 것처럼 커넥터도 한 번만 받고 끝내는게 아니라 여러 병을 받을 수 있으니까 굳이 이런 식으로 소켓으로 받기 보다는 이런 식으로 이벤트를 통해서 인자를 넘겨주고 있는 것이다."하지만 그 리스너에서는 Socket을 필드로 들고 있도록 하셨었잖아요? Socket을 필드로 들고 있는 것과 SocketAsyncEventArgs의 Token으로 socket을 넘겨주는건 결국 똑같이 작동하는 건가요?connector에서는 Socket을 필드로 두지 않고 args의 token으로 socket을 건네주신 이유를 이해하지 못하겠습니다.아니면 그냥 똑같이 동작하는데 이런 방법도 있다고 알려주기 위함이셨나요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
클래스 다이어그램
루키즈님도 이런 프로젝트를 제작할때 클래스 다이어그램을 만들며 제작하시나요?? 궁금합니다
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
ProjectileController로 만든 파이어볼이 삭제가 되지않습니다.
일단 코드를 따라서 구현하고 코드의 흐름으로도 Projectile script가 붙은 파이어볼이 10초뒤에 자연적으로 소멸해야하는데소멸이 되지않습니다. 코드의 흐름을 보면PlayerController 에서 StartProjectile함수로 파이어볼을 생성해서 발사 ProjectileController에서 Init함수에서 StartDestroy(_lifeTime); 함수로 넘어가서 SkillController에서 구현된 CoDestroy 에서 Managers.Object.Despawn(this)에 의해 소멸되어야하는데 소멸되지않아 Despawn 쪽에 T가 SkillController 코드를 추가하니 정상적으로 시간뒤에 파괴되는것을 확인했는데 왜 ProjectileController 가 아닌 SkillConroller에서 파괴되는지 궁금합니다. 브레이크포인트를 잡고 해도 SkillController로 넘어가네요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
강의 소스코드
소스코드 다운로드 가능한가요? 예전에는 가능했던거 같은데요...ㅜ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom.Flush() 수행 중에 _sessions가 변경 되면, 컬렉션 변경 에러가 나옵니다.
// GameRoom.cs public void Flush() { foreach (ClientSession s in _sessions) s.Send(_pendingList); _pendingList.Clear(); }foreach를 돌며 s.Send()를 하는 와중에_sessions가 변경되면,(_sessions.Add 되거나 _sessions.Remove 되면)아래와 같이 컬렉션 변경 에러가 나옵니다. 이를 해결하려고 아래와 같이 _sessions를_sessionsCopy에 복사하여 foreach 돌렸습니다.// GameRoom.cs public void Flush() { List<ClientSession> _sessionsCopy = _sessions.ToList(); // 복사 foreach (ClientSession s in _sessionsCopy) s.Send(_pendingList); _pendingList.Clear(); _sessionsCopy = null; } 더 좋은 방법이 있을까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
Addressable Sprite 파일
현재는 하나의 파일에 한 개의 스프라이트로 불러오고 있는데Sprite Mode를 multi로 짤라서 그 파일에 들어있는 스프라이트를 가져오는 방법은 어떻게 하나요??
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
명시적으로 함수를 호출하지 않으면 무조건 스레드 세이프할까요?
안녕하세요? 강의 재밌게 보고 있습니다.아래 인프런 질문을 보면Q. Receive()는 lock을 사용하지 않는 이유?A. 명시적으로 Recv()처럼 호출하지 않기 때문에 1번에 1개의 스레드만 접근하여 스레드 세이프함이라는 질문을 보았는데요, 이 답변을 조금 확대 해석해 봤는데Q. 명시적으로 함수()를 하지 않으면 무조건 스레드세이프할까요? 답변 미리 감사합니다.