묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Load, Instantiate, Destroy 메서드를 래핑시킨 이유가 궁금합니다
일부러 Resource Manager를 만들어서 Load, Instantiate, Destroy 메서드를 래핑시킨 이유가 궁금합니다 Input Manager를 만들때에는 특별히 래핑 작업을 하지 않았는데 이번에 래핑을 한 이유가 뭔가요? 디버깅할때 브레이크 포인트를 잡기 쉽다는 것밖에 떠오르지가 않습니다만, 혹시 다른 이유가 있는걸까요? 또한 계속해서 이번처럼 유니티의 메서드에 대해서 래핑을 해야하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Connector.Connect 질문입니다.
클라에서 Connector를 통해서 연결시도를 할 때, Connector에게 endPoint를 전달합니다 Connector에서는 socket에 endPoint.AddressFamily를 전달하는데, 제가 생각하는 것은 IP주소 '만' 전달합니다. 뒤에 SocketAsyncEventArgs args 변수를 선언하고 args.RemoteEndPoint에 endPoint를 한 번 더 전달합니다. socket.ConnectAsync할 때 args를 전달합니다. 헷갈리는 부분은 endPoint를 두번 전달하는 것입니다. socket에는 IP주소'만' 들어있어서 포트번호를 모르니 args.RemoteEndPoint에 port번호 포함 주소를 다시 준 것 인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Part 4 완료 후 코드리뷰 중 질문입니다.
OnRead함수의 역할은 args.BufferList에 연결된 RecvBuffer가 RecvAsync를 통해 받은 데이터의 사이즈와, RecvBuffer의 DataSize 프로퍼티에서 확인가능한 버퍼 내부의 해독 안 된 데이터의 사이즈를 비교하여 차이의 유무를 판단하는 것이라 이해했습니다. 그런데 OnWrite의 기능은 이해하기 어려운 것 같습니다. 간단하게나마 데이터 수신 후 오버플로우 체크용 함수로 이해는 했는데 정확한지를 모르겠네요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
BitConverter.TryWriteBytes 질문입니다.
BitConverter에 TryWriteBytes가 없어서 강사님이 올려주신 솔루션에서 확인해보니 System.Runtime.Extensions에 있는 것을 알게 되었습니다. 제 솔루션에도 using System.Runtime.Extensions를 적용하려했으나 System.Runtime까지는 있는데 Extensions가 없다고 뜨네요. 어떻게 해결할 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
_coPatrol==null 질문
안녕하세요! 항상 강의 잘 듣고 있습니다.(키보드도 잘 쓰고 있습니다.) protected override void UpdateIdle() { base.UpdateIdle(); if(_coPatrol!=null) { StopCoroutine(_coPatrol); _coPatrol=null; } } 로 null 체크하는 부분 관련하여 질문드립니다. 강의 코드에서는 UpdateIdle() 에서 if(_coPatrol=null) 로 확인하고 Coroutine을 실행하고 있는데요, 다음과 같이 생각하여 if문을 지우고 UpdateIdle에서 곧바로 StartCoroutine을 하도록 하였습니다. protected override void UpdateIdle() { base.UpdateIdle(); _coPatrol = StartCoroutine("CoPatrol"); } -> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨. 만약 갈 장소 검색에 실패하거나 CoPatrol이 완료되면 Idle이 되어 다음 Frame에 CoPatrol을 수행한다.(반복) 그래서 실행했을 때의 화면은 다음과 같습니다. https://youtu.be/yHUq12WU2dA 강의 코드에서는 깔끔하게 해당 목적지로 이동하고 끝이지만, 수정한 코드에서는 정신없이 왔다갔다 하다가 해당 목적지로 이동하는 현상이 보입니다. 곰곰이 생각해보았으나 마땅한 이유가 생각나지 않아 질문드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
null 오류
선생님 강의를 보며 코드를 똑같이 작성했는데 널 리퍼런스 오류가 디버깅 도중에 뜨면서 GenPacket.cs가 만들어지지 않아 진도를 못나가고 있습니다 genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3); 이 코드에서 널 리퍼런스 오류가 뜨면서 디버깅이 중단됩니다 정확히는 t가 널이었다면서 오류가 뜹니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
싱글톤 패턴 관련 질문드립니다
직접 만든 게임을 모바일에서 출시해보고 싶어 유니티 공부를 시작했는데 서적이나 유튜브 강의를 보다보면 거의 싱글톤 패턴을 사용하며 권장하고 있습니다. 여러 커뮤니티에서 싱글톤패턴은 사용하면 안좋은점이 많고 사용하지 말아야 할 문제점 처럼 이야기 하는것을 보게되었는데실질적으로 사용을 피해야하는 안좋은 코딩 방법인지, 사용한다면 개발하는데 제한이 있는 장르가 생기는지 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterAccept() 질문
우선 먼저 사과드립니다... 비슷한 질문이 많은데 그 글들을 봐도 이해에 대해 확신이 서지 않아 같은 질문을 또 드리는것 같네요. 의문이 있는 부분은 SocketAsyncEvnetArgs 부분 입니다. 1. RegisterAccept 에서 AcceptAsync로 args를 처리. 2. args안에 EventHandler<T> Completed; 존재 3. args안에 OnCompleted가 존재하고, Accepted되면 OnCompleted가 실행되면서 Completed.Invoke로 OnAcceptCompleted 동작. 비동기로 accept를 처리하고, accept가 완료되면 callback을 통해서 OnAcceptCompleted 함수가 수행된다는 개념은 이해했지만 동작 메커니즘이 정확하게 이해되지 않아 질문드립니다. 아래 사이트를 참고하였을때, OnCompleted에 뭔가 정의가 있어야 함수가 실행이 될텐데요, event - C# 참조 | Microsoft Docs EventHandler<TEventArgs> 대리자 (System) | Microsoft Docs VS2019에서 정의를 타고 올라갔으나....주석 뿐인 정의만 있었습니다. Socket까지도 정의를 타고 올라갔는데 마찬가지로 프로퍼티+주석만 잔뜩있었습니다 ㅠㅠ.... 제가 옳게 이해한 것이 맞을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
씬 이동시 fade out in 관련 질문입니다.
안녕하세요 씬 이동시 fade out in을 구현하고 싶습니다. 구글링을 통해서 많은 자료를 봤지만 본 강의에서 설계한 Manager 패턴에 적용시키기 어려웠습니다. 가령 버튼을 누르면 fade out in이 동작하거나 monobehavior를 상속받은 별도의 FadeManager를 만드는 등 본 강의와 조금은 이질감이 느껴지는 코드들이었습니다. 기존 틀을 유지한채 fade out in을 적용할 수 있는 방법을 알 수 있을까요? 구글에 떠도는 코드를 따라하려 해도 해당 코드들은 FadeManager의 Child에 검은색 Sprite를 두고 알파값을 변경해가면서 fade in out을 구현했는데 본 강의에서 설계한 대로라면 FadeManager를 생성하고 child를 어떤 방식으로 둬야할 지 모르겠습니다.. 그냥 Manager 밑에 Sprite를 둬도 되는지 의문이 드네요. 가장 좋은 방법이 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
애니매이션 질문입니다 (조금 길어요)
중간에 듣다가 점프하는 애니매이션을 넣어보고 싶어서 강의 일시정지 해놓고 점프 하는 애니매이션을 혼자 만들어봤는데 조금 이상한? 부분과 이해가 안가는 부분이 많아서 질문드립니다. 일단 점프 Animation은 유니티짱의 JUMP00 을 사용하였습니다. 점프 조건은 스페이스바를 누를 때 작동되게 하였습니다. 또한 유니티 툴에서 Parameters 부분에 float로 jump를 추가하였습니다. (점프 애니매이션을 실행할때 유니티짱의 position 이 변경이 안되는것을 확인하고 진행하였습니다.) Script코드랑 유니티툴 사진 첨부 하겠습니다. 먼저 Define.cs 에 KeyboardEvent enum타입으로 선언 하였습니다.(아직 왜 Define이라는 파일을 만들어서 관리하는지는 정확하게 이해는 안가지만 그런가보다 하고 여기 선언 하였습니다.) 그리고 왜인지는 모르겠지만 그냥 강의한거 따라서 InputManager.cs 에 사진과 같은 코드를 작성하였습니다. 그리고 이해는 아직 못하였지만 마우스 클릭을 할때 OnmouseClicked 를 Start에 만들어 주었기때문에 똑가이 만들고 선언해주었습니다 그리고 유니티 툴의 State 머신입니다. 현재 State 머신에서 WAIT를 눌러보면 WAIT -> RUN에서는 Has Exit Timed이 꺼져있고 WAIT -> JUMP에는 제가 Has Exit Time 을 껏습니다. 그리고 RUN -> WAIT : Has Exit Time OFF 상태이고 RUN -> JUMP : Has Exit Time OFF 상태입니다. 그리고 JUMP -> WAIT : Has Exit Time OFF상태이고 JUMP -> RUN : Has Exit Time ON(체크된상태) 입니다. JUMP -> RUN에서 Has Exit Time 을 꺼버리면 WAIT 애니매이션이 계속 지속이 되고 Has Exit Time 켜주면 다시 애니매이션이 동작합니다. 다만, 여기서 점프를 하고난 후에 잠시 뛰는 애니매이션을 실행하고 다시 WAIT 애니매이션을 실행합니다. 궁금한 질문 입니다. 질문1 : 막연한 질문이지만 왜 점프를 하고난 뒤에 뛰는 애니매이션을 잠깐 실행하고 멈추는 지 모르겠습니다. JUMP, RUN의 Blending부분을 안곂치게 실행을 해보아도 똑같았습니다. 질문2 : PlayerController.cs에서 작성한 void OnKeyBoardPressed(Define.KeyBoardevent evt) { if (_state == PlayerState.Die) return; Animator anim = GetComponent<Animator>(); anim.Play("JUMP"); } 이 함수 없이도 InPutManager.cs 에 if(Input.GetKeyDown(KeyCode.Space) == true) { KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space); _pressed_space = true; } if(Input.GetKeyUp(KeyCode.Space) == true) { KeyBoardAction.Invoke(Define.KeyBoardEvent.P_Space); _pressed_space = false; } 이 부분과 PlayerController.cs에서 작성한 이부분만 있어도 점프가 되던데 어떠한 식으로 함수를 주고받는 것인지 이해가 안갑니다.. Playercontroller.cs의 Start()함수에서 Managers.Input.KeyBoardAction -= OnKeyBoardPressed; Managers.Input.KeyBoardAction += OnKeyBoardPressed; 이 두줄을 주석처리하거고 실행하면 에러가나서 점프가 안되는데 왜 저런식으로 코드를 짜야 점프가 되는지 모르겠습니다. 질문 3 : Playercontroller.cs의 OnKeyBoardPressed의 인자러(Define.KeyBoardEvent evt) 이런식으로 넘겨 주고 밑에 if문으로 함수를 짯는데 Define.KeyBoardEvent evt 의 의미가 Define.KeyBoardEvent 이녀석이 true라는 말이거나 아니면 뒤에 Define.KeyBoardEvent에서 P_Space를선언 해주었다는 말이랑 같은 말인가요? 질문 4 : Start()에서Managers.Input.MouseAction -= OnMouseClicked; Managers.Input.MouseAction += OnMouseClicked; 이러한 부분이 콜백함수인것은 알겠는데 어떤식으로 호출하고 호출되는지 모르겠습니다.. 질문 5: 학교가 게임만드는 학과인데 이때까지 수업들어왔던 내용들이 이해를 못한 부분들이 많은데 그냥 이대로 수업을 쭉 듣고 혼자 실습하는 형태로 진행하는것이 좋을까요 아니면 이해가 될떄까지 늘어지는게 좋은방법인가요..?? 2학년인데 게임개발 잘하시는 분들보면 현타가 옵니다..ㅠㅠ 질문내용을 이해하기 어려우실 수 있는데 답변드린다면 정말정말 감사하겠습니다. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
가시성이라는게
가시성이라는게 사람?코드?의 가시성이 아니라 메모리간의 가시성이라고 이해하는게 맞나요? 그 직원(메모리)들이 잘 볼수있도록 전광판을 업데이트 하는 메모리들간의 가시성?이 맞나요? 어렵네용ㅎㅎ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이건 컴퓨터 성능 때문일까요?
안녕하세요, 선생님 c# 게임 서버 강의를 수강하다가 선생님과 다르게 작동하는 부분이 있어서 질문드립니다 6번째 강의인 컴파일러 최적화 강의에서 코드를 실행하면 4:25초경에 쓰레드 시작! 쓰레드 종료! Stop 호출 종료 대기중 종료 성공 이 순서대로 선생님은 실행이 되는데요, 저는 쓰레드 시작! Stop 호출 종료 대기중 쓰레드 종료! 종료 성공 순서로 쓰레드 종료!가 더 늦게 뜨네요 강의에서처럼 _stop에 volatile을 붙이면 선생님이랑 같은 값이 나오긴 하는데 컴퓨터 성능 차이 때문일 수 있나요? 코드가 다른 부분은 없습니다. 몇 번이고 확인했어요 감사합니다!
-
미해결[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 인코딩 자동 검색'을 체크 해제 해보기도 하였고 다시 체크 해보기도 하였으나 한글 주석은 계속 깨졌습니다.
-
미해결따라하면서 배우는 고박사의 유니티 기초
2021년도 버전으로 알려주세요 ㅠㅠ
몇년 전 꺼랑 현재꺼랑 달라서 하기가 힘들고 알아듣질 못하겠어요 ㅠㅠ 사진 놓는법도 서로 다르고요 ㅠㅠ 현재는 그냥 화면레 올리면 나타나는데 그것도 모르고 고박사님처럼 하려다 안됐어요 ㅠㅠ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티스레드 와 Lock 질문
안녕하세요. 항상 양질의 강의 감사합니다! 복습중 이해가 확실히 안되는 부분이 있어 질문드립니다. 서버에서 다양한 곳에서 Player를 이동시킬 수 있기 때문에(다른 플레이어가 스킬로 Player를 밀쳐내는 등..) Player를 이동시키는 부분은 한 곳에 몰아서 Lock을 걸고 실행시켜 준다고 설명해 주셨습니다. 그래서 위처럼 GameRoom에 Player가 움직이는 로직을 몰아서 Lock을 걸어주셨는데, 제가 궁금한 점은, HandleMove멤버함수에서 특정 Player를 참조(?) 하고있는 인자 player를 가지고 Lock을 걸고 작업을 하고 있을 때, 다른 클래스의 맴버함수에서도 똑같은 Player를 참조해서 Lock을 걸고 작업하려고 한다면 Lock이 걸리나요? Lock을 건다는건 메모리상에 실제로 생성된 객체(?)를 기준으로 걸리는 건가요? 설명이 많이 미흡한 점 죄송합니다 ㅜ.
-
해결됨[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 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
해당 강의 영상의 해상도가 너무 낮네요.
인프런의 오류인가요?ㅠㅠ 눈이 너무 아픕니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오류 : NullReferenceException
강의의 4:40초인 Debug.Log(Input.mousePosition); 에서는 정상 작동을 하는데 그 이후 과정인 Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); 을 입력하고 실행 시 위의 널레퍼런스익셉션 오류가 뜨네요 ㅠㅠ 어떻게 해결해야하나요?