묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
랜덤으로 길 뚫는 작업에서 randomIndex 질문입니다.
if (rand.Next(0, 2) == 0) { Tile[y, x + 1] = TileType.Empty; count++; } else { int randomIndex = rand.Next(0, count); Tile[y + 1, x - randomIndex * 2] = TileType.Empty; count = 1; } 만약에 (1, 1) (1, 2) (1, 3) 이렇게 세 지점이 연속해서 뚫려있을 경우, (1, 0) 부터 보았을 때(빨) (초) (빨) (초) 이런 상태에서 시작했다고 가정한다면..x == 3 일 때 count 는 2 가 되고, 그렇기 때문에 randomIndex = {0, 1} 이 가능합니다.randomIndex = 0 일 경우 새로 뚫릴 지점의 좌표는 (2, 3) 이 되고, 1일 경우 (2, 1) 이 됩니다.따라서 이 경우에 (2, 2) 지점은 뚫릴 가능성이 없습니다. >> 위에서 제가 이해한 것이 맞는건지 궁금합니다. 왜 이렇게 헷갈리는지 모르겠네요..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
널 예외가 발생합니다.
안녕하세요.선생님이 작생해 주신 코드를 하나하나 검토를 해봐도 아래와 같이 널 예외가 발생합니다.어떤 문제가 있는걸까요?
-
미해결[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
어드레서블 사용 기준..!?
안녕하세요. 초보자이며 프로젝트 규모가 작다면 어드레서블을 굳이 사용할 필요가 없다는 말씀 듣고 질문드립니다. 기존의 Resource에서 로드하는 방식이 코드도 간결하고 쉬웠는데 어드레서블은 조금 복잡하네요 ㅠㅠ제가 이해한 바로는초기 빌드 용량이 커지거나 로딩 시간이 길어질때씬 이동이 자주 일어나거나 해서 불필요한 메모리를 계속 들고있을 필요가 없을때추후 빌드없이 패치를 구현하고 싶을때등등에서 어드레서블 사용이 권장되는 것 같은데 제가 만드려는 게임에서 어드레서블이 필수인지 판단이 어렵네요.그래서 혹시 강사님께서는 프로젝트에서 어드레서블을 사용하는 것이 효율적일것 같다 라고 판단하시는 어떤 기준이 있으신가 해서 질문드립니다. 항상 좋은 강의 감사드립니다!
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
왜 이 책에서는 Time.deltaTime을 쓰지 않았는지?
예를 들어 이동 관련해서 책에서는 AddForce 메소드를 많이 사용했는데, 왜 Time.deltaTime을 같이 사용해주시지 않으셨는지 궁금해서 여쭤봅니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
ResourceManager에 질문있습니다
public class ResourceManager{public T Load<T>(string path) where T : Object{return Resources.Load<T>(path);}}where T를 제거하면 오류가 뜨는데 그 이유가 있을까요 Managers쪽에 있는 ResourceManager resource = new ResourceManager(); 부분에서 궁금한점이 Managers s_instance는 싱글톤으로 유일성이 보장되었고 public static ResourceManager Resource{ get { return Instance._resource; } } 이런식으로 이루어 지는데 resource도 유일성이 보장되는 것인지 아니면 다른 곳에서 Managers.Resource가 호출되면 new ResourceManager로 새로운 _resource가 호출되는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
start관련 질문입니다
private void Start() { GameObject go = Resources.Load<GameObject>("Prefabs/Sword/Sword_1"); GameObject sword = Instantiate(go); }이런식으로 playerController스크립트의 start에 프리팹 생성을 넣었는데 하나만 생성되지 않고 계속 생성되어서 왜 이런 동작이 나오는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리가 늘어나는 것과 sendbuffer 관계
안녕하세요! 강사님. 클라이언트를 500명으로 늘렸을 때 말로 설명해주신 부분에서 이해는 가는데, 일부분이 정확하게는 이해가 가지 않는 부분이 있습니다. 작업이 밀려버리면 스레드풀에서 보낸 스레드가 돌아오지 않으니 새로운 스레드를 만들기때문에 메모리가 점점 찬다 -> 스레드가 패킷을 async하게 recv한 다음 jobqueue에 push를 할 때, push 하기위해 lock이 있으니 해당영역에서 병목현상이 발생하고, 그로인해 blocking된 스레드가 오지 않으니 스레드풀에서 새 recv가 오면 스레드 재사용이 아니라 새 스레드를 할당하기 때문에 스레드는 각 스레드별로 stack을 가지고 있기 때문에 이런 스레드별로 가지고있는 용량이 계속 증가하는거라서 메모리가 늘어난다. 라고 이해를 했었습니다. 그런데 나중에 다시 말씀해 주셨을 때,일이 계속 밀리면, 스레드풀에서 스레드가 돌아오지 않으니 새로운 스레드를 만들고, sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는걸로 구현했기 때문에 메모리가 계속 늘어난다. 라고 하셨는데, sendbuffer는 여러 스레드가 큰 버퍼에서 짤라서 각자 쓰는 것으로 이해를 했었어서 여러 스레드가 써도 큰 버퍼는 그대로고 얼마나 sendbuffer를 사용하는 횟수가 많아지냐. 가 달라지는거라고 생각이 들었는데,,, 그게 아닌가요? sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는 것이 메모리 증가에 무슨 영향이 있는지 잘 이해가 되지 않습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Action 질문
Action에 += 으로 함수를 추가하면 값이 복사가 되는건가요 아침 참조형식인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Slerp궁금증입니
if (Input.GetKey(KeyCode.W)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), rotateSpeed); transform.position += Vector3.forward Time.deltaTime speed; } if (Input.GetKey(KeyCode.A)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), rotateSpeed); transform.position += Vector3.left Time.deltaTime speed; } if (Input.GetKey(KeyCode.S)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), rotateSpeed); transform.position += Vector3.back Time.deltaTime speed; } if (Input.GetKey(KeyCode.D)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), rotateSpeed); transform.position += Vector3.right Time.deltaTime speed; }이런식으로 하고 rotateSpeed를 1.0f로 한뒤 유니티에서 a를 살짝 눌렀는데 90도만큼 회전하지 않아서 왜 그런지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
반사된 메세지 recv하였을 때의 순서 동일한 이유
안녕하세요, 강사님! GameRoom에서 client -> server로 보낸 메세지를 다른 client들에게 broadcasting을 하는데, 그래서 출력 결과가 10개씩 나오는 이유가10개의 클라이언트들이 보낸걸 다시 반환하는것이기 때문에.즉, 반사가 10개씩 나오는거고, 근데 클라이언트 console창이 하나로만 되어있다보니 10개의 클라이언트가 받은 반사메세지가 한번에 출력되어 10개씩 출력되는 것이라고 이해를 했습니다. 그런데 각 session이 어떤 순서로 반사를 받는지 궁금하여 client의 serversession에도 sessionid를 부여하고 테스트로 출력을 해 본 결과 아래와 같았습니다.session이 send 를 하는 것은 async로 구현하였기 때문에 비동기방식인데, 저렇게 규칙적으로 받아오더라구요.(4 2 3 1 5 0 6 7 8 9 ...순서) Program.Room.Enter(this); 를 한 순서대로 GameRoom의 _sessions 리스트에 추가가되니 Broadcast 때 리스트를 foreach하니까 리스트에 추가된 순서대로 오는 것 같다고 생각이 드는데, 사실 네트워크 상태에 따라서 패킷이 라우터에 경로가 달라지니 각기 다른 순서로 올 수도 있고(이건 그렇게 부하가 큰편은 아니니 그래도 해당 원인은 무시한다고 쳐도), 멀티스레드이기도 하고 thread context switching 으로 인해 스레드간 순서가 마구마구 뒤바뀔거라 예상을 했지만, 저렇게 규칙적으로 나오는 이유가 무엇인지 궁금합니다. 그리고 새로 실행 시 마다 저 규칙이 변경이 되는데, 그 이유는 사실Listener에서 Onconnected를 하여 Program.Room.Enter(this); 안에 들어가는 순서가 멀티스레딩이라서 다르게 들어가기 때문이라고 이해를 했습니다. 그렇다면 멀티스레딩으로 인한 순서 뒤바뀜이 있다는 증거이고 사실 listener가 받는 것 또 한 GameRoom에서 broadcasting하는것과 비슷하게 lock을 걸고 순서대로 session list에 추가하고 즉, 순차적으로 여기서 리스트 순서대로 보내도 순서뒤바뀜이 일어나서 GameRoom에서의 List에 쌓이는 순서도 바뀌는거라고 생각이 들거든요. 그러면 SendForEach에서 ServerSession리스트를 보낼 땐 멀티스레드로 인해서 순서가 뒤바뀌는데, Server의 GameRoom에서 ClientSession 리스트를 뽑아 send할 땐 순서가 유지되어 send보내지는 이유는 뭔가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Init()을 static으로 선언해 주신 이유가 있을까요?
Init()을 static으로 선언해 주신 이유가 있을까요?
-
미해결레트로의 유니티 C# 게임 프로그래밍 에센스
TPS 캐릭터 문제점 있습니다.
TPS에서 캐릭터가 이동할 때 0.07정도의 높이로 캐릭터가 띄어지게 되게 됩니다. 수정을 어떻게 해야하나요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Environment.TickCount & Int32.MaxValue; 코드 질문
안녕하세요 강사님! 강의 잘 듣고 있습니다.질문 게시판 글도 간단히 보면서 강의를 보고 있는데요.int currentTick = Environment.TickCount & Int32.MaxValue;위의 코드를 답변으로 주신 내용이 있던데c#강의에 다시 가서 &비트 연산을 봐도코드 이해를 못해서요.부호가 제거된다는 것 같은데 왜 부호가 없어지고 코드가 정상으로 돌아가는지 잘 모르겠습니다.답변 부탁드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
안녕하세요 선생님! 질문드립니다!
안녕하세요 선생님!현재 꿈을위해 1인개발을 준비하고 있는 게임업계 아트출신 학생입니다.선생님의 강의와 c#문법책, 여러가지 자료들을 복합적으로 보면서 공부를 진행하고 있는데요.아무래도 여러가지를 동시에보다보니 의문점이 생겼습니다.아무래도 개발을 하다보면 문법적으로 자주쓰이거나, 필수적으로 느껴지는것들이 있고, 선호도나 사용성이 떨어져서 드물게 사용되거나, 다른문법으로 대체가능한것도 있으리라 판단됩니다.선생님의 강의를 보면서 도움이 아주 많이되어서 감사하면서도, 그 와중에 책에서만(아무래도 두껍고 많은양을 다루다보니...) 다루는 내용이 있는데,선생님께서 강의로 만들어주신 문법적인 부분위주로 공부를 끝내고, 개발도중 필요한 부분이 생기면 그때 추가적으로 더 공부해도 개발에 무리가 없을까 하는 의문이 생겨서 질문드립니다.솔직히 책을 다 공부하면 좋겠지만, 워낙 양이많고 공부만 하면서 하기보단, 개발을 진척시키면서 자연스럽게 문법을 익히며 개발과 공부를 동시에 진행하는게 효율적일것 같아서 필수적이거나, 조금더 유용한부분 위주로 공부를 끝내고 진행을 하는게 좋을것 같다는 판단에 질문 드려봅니다!긴글 읽어주셔서 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
GetComponent 함수 관련 질문이 있습니다!
선생님 언제나 좋은 강의 잘 보고 있습니다.싱글톤패턴 복습과정 중 이것저거 테스트하다s_instance에 값을 넣어 줄 때 저렇게 그냥 바로 GetComponent<>(); 해버려도 작동이 되더라구요GetComponent 함수가 특정 게임오브젝트에 있는 Component 를 가져오는것인 줄 알고 사용했는데 위 코드는 왜 동작하는지 이유를 알려주실 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
남은 수업 수강 질문
선생님 안녕하세요 강의 너무 잘듣고있습니다. 수업과 관련없는 질문이지만, 저는 현재 플레이팹 데이터 + Azure 클라우드 스크립트 기반의 간단한 싱글 모바일 게임을 제작하려고 합니다. 선생님의 유니티 수업 이후, 게임 서버와 DB, 웹서버 강의를 수강하게 되면 제가 이용하는 서버 기반 API는 수업과 달라도 지금 수업처럼 프레임워크를 짜는데 참고할 수 있을지 궁금해서 이렇게 질문을 드리게 되었습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Name이 한번 오면 초기화되는 이유
안녕하세요, string serialize를 하여 read, write 코드를 추가한 이후 확인해보려 코드를 실행해보았는데, 처음엔 name이 잘 나오지만 client에서 5번 연속으로 보냈을 때 name이 null인건지 나오질 않아 확인해보니, 아래와같이 처음 이후에는 name이 null이 되는 것 같습니다. 해당 이유를 찾기가 힘들어서 왜이러는지 이해가 되질 않습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
string write할 시에 Array.Copy한 이유
안녕하세요, string serialization을 할 때 Array.Copy를 한 이유에 대해서 다른 long, ushort등과같은 데이터들은 TryWriteBytes()메서드를 사용하여 바로 dest인 buffer에 바이트를 써 주는 메서드가 구현되어있지만, string을 인자로 받는 메서드와 byte배열을 받는 메서드는 없어서 GetBytes한 이후에 Array.Copy로 buffer배열에 직접 복사한것같은데, 맞을까요?그럼 더 궁금한건, TryWriteBytes는 ValueType만 바이트로변환해서 dest에 쓸 수 있도록하는 메서드인거라고 이해하면 될까요? string, byte[]등과같은 reference type을 인자로 받는 메서드는 구현이 안되어있는 이유를 혹시 아시는지요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님처럼 여러 프로세스 디버깅하는 방법
안녕하세요, Serialization#2 강의를 따라 치는 도중 실행을 하면 recv할 때 playerid가 0으로 나와 디버깅을 하려고 했지만, 디버깅시에OnConnected : [fe80::c104:b687:d2b9:82d8%14]:7777OnDisconnected : [fe80::c104:b687:d2b9:82d8%14]:7777Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object.Object name: 'System.Net.Sockets.Socket'.at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e)at ServerCore.Session.RegisterSend() in C:\Users\jiw72\CsharpServer\MMORPG\Server\ServerCore\Session.cs:line 124at ServerCore.Session.Send(ArraySegment`1 sendBuff) in C:\Users\jiw72\CsharpServer\MMORPG\Server\ServerCore\Session.cs:line 97at DummyClient.ServerSession.OnConnected(EndPoint endPoint) in C:\Users\jiw72\CsharpServer\MMORPG\Server\DummyClient\ServerSession.cs:line 98at ServerCore.Connector.OnConnenctCompleted(Object sender, SocketAsyncEventArgs args) in C:\Users\jiw72\CsharpServer\MMORPG\Server\ServerCore\Connector.cs:line 42at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)at System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(Object state)at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)--- End of stack trace from previous location where exception was thrown ---at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)at System.Net.Sockets.SocketAsyncEventArgs.<>c.<.cctor>b__177_0(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)at System.Threading.ThreadPoolBoundHandleOverlapped.CompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pNativeOverlapped)C:\Users\jiw72\CsharpServer\MMORPG\Server\DummyClient\bin\Debug\netcoreapp3.1\DummyClient.exe(프로세스 25828개)이(가) 종 이렇게 중간에 예외처리가되어 종료가됩니다. 뭔가 프로세스 단계별 실행을 해보았을 때, dummyclient를 클릭하고 디버깅하면 dummyclient만 디버깅되고 server를 클릭하고 디버깅하면 server만 디버깅되더라구요.그래서 여러 시작 프로젝트를 한것처럼 디버깅도 여러 프로젝트를 동시에 할 수 있도록 하는 방법은 없는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
.NET Core
안녕하세요 .NET Core를 사용하려면 저렇게 인스톨러에서 설치해서 하는것이 맞는건가요?맞다면 .NET Core가 지원되지 않는거 같은데 어떻게 해야할까요?