묻고 답해요
137만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Input Manager 강의를 듣고 이해가 안되는 부분이 있어 질문드립니다
안녕하세요 유니티 처음이라 이해가 잘 안되는 부분이 많아 다시 강의를 복습하던 도중에 이해가 안되는 부분이 있어 질문드립니다 Input Manager 강의 5분 30초 쯤에 보면 Manager 클래스에 InputManager를 생성할려고 InputManager _input = new InputManager(); public static InputManager Input { get { return s_instance._input; } } 이런 코드를 작성하셨는데 이 부분이 이해가 잘 안됩니다 1. Mangers 객체인 s_instance 는 static 변수로 선언을 했는데 왜 InputManager 객체인 _input은 static 변수로 선언하지 않았는지 그 이유가 궁금합니다 Manger 객체와 똑같이 입력을 처리하는 InputManager 객체는 1개만 필요할텐데 static이 아닌 일반 변수로 선언한 이유가 궁금합니다. (InputManager를 static 변수로 선언하면 안되나요??) 2. InputManager _input = new InputManager(); public static InputManager Input { "get { return s_instance._input; }" } "get { return s_instance._input; }" 이 코드에서 s_instance.input을 한 이유가 궁금합니다 그냥 get { return _input; } 을 하면 안되는 이유가 궁금합니다 Input을 사용할때 Mangers.Input.KeyAction 이런식으로 사용될텐데 Managers 클래스 안에 _input이라는 변수가 정의되어 있는데 왜 굳이 s_instance. 을 붙이는 이유가 궁금합니다 매번 친절하고 자세한 설명 감사드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
백그라운드/메인 쓰레드 그리고....
1. PackatQueue를 OnRecvcallback을 통해 거치게되면 유니티에서 사용되는 메인쓰레드로 사용할 수 있다는 얘기로 들리는데. 유니티에서 그렇게 작동하도록 만든것인가요? 즉 유니티 오브젝트와 서버를 연동시키려면 쓰레드는 무조건 큐(Push,Pop)를 거쳐서 와야한다? 라고 유니티 측에서 규칙을 정해둔거? 그리고 2. 전 강의에서 설명하셨을 수도 있는데 너무 많은게 지나가서 질문 드립니다... HandlePacket만으론 유니티와의 연동이 되지않은 걸로 보이는데 HandlePacket을 자동화해서 사용하는 이유가 있나요. 제가 이해한 바로는 1번에 해당하는 경우에만 유니티가 제대로 작동되는 걸로 보여져 HandlePacket은 뭘하는지 잘 모르겠습니다. 3. 기존에는 (유니티 연동 전) 백그라운드 풀에서 쓰레드를 뽑아와서 쓴다고 하셨는데.. 이 부분은 제가 잊은건지 모르겠지만.. 쓰레드 풀 자체를 어디서 생성해줬는지 기억이 가물가물합니다... 분명 첫수업시간 때 Task를 이용해 쓰레드 풀을 만드는 건 어렴풋이 기억이 나는데 그런 코드는 여기서 작성한 기억은 없고... 쓰레드 자체가 어디에서 왔는가에 대해 알려주실 수 있나요.. 메모하면서 진행해왔는데 찾기가 어렵네요. 4. 그리고 복습하는 도중에 알려주신 모든 부분을 응용해서 학습할 수 있게 해주신점 감사드립니다. 그런데 한가지 ThreadLocal을 이용한 최적화는 파이널 프로젝트에 응용한게 없는듯한데 파트 7정도 때에나 이런 것들을 한꺼번에 볼 수있을까요. 감사합니다. ---------------------------------------------------
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TCP Remote Access 관련 질문입니다.
강사님의 서버개발 강의를 다 보고 완성해서 Windows App, Android App을 만들어 테스트를 해보려고 했는데 원격지에서 TCP 접속이 계속 Timeout이 발생합니다. 서버와 클라이언트(Windows, Android)는 동일한 Hub 내에서 동작하고 있어요 고정 IP 하나에서 DHCP로 내부 아이피 할당받아 사용중입니다. 예로 서버의 내부 아이피는 192.168.0.40 이고 포트는 7777번 사용 중이고 Client는 192.168.0.40:7777로 접속을 시도하는 중이에요. 혹시나 Server 쪽에서 In/OutBound 정책을 설정을 안했나 싶어서 TCP 7777번 포트를 모두 열어놓았으나 Timeout이 발생해 모든 포트를 다 열어서 테스트했는데 동일하게 Timeout이 발생합니다. 원격지에서 TCP서버로 접속하려면 다른 설정이나 코드가 필요한것인가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom 관련 질문입니다.
아무리 보고 또 봐도 생각을 아무리 해봐도 이해가 잘 안돼서 질문 남깁니다. 질문이 너무 잦아 부끄러운 마음이 먼저 드네요..ㅠ class ClientSession : PacketSession { public GameRoom Room { get; set; } public override void OnConnected(EndPoint endPoint) { Console.WriteLine($"OnConnected: {endPoint}"); Program.Room.Enter(this); // 1 } public override void OnDisconnected(EndPoint endPoint) { SessionManager.Instance.Remove(this); // 2 if (Room != null) { Room.Leave(this); Room = null; } Console.WriteLine($"OnDisconnected: {endPoint}"); } ... OnConnected 메소드에서 주석 1번과 OnDisconnected 메소드에서 주석 2번 영역인데요. OnConnected 에서는 Program 의 Room에 입장을 시키는데 어째서 OnDisconnected 에서는 Room에 Leave를 하는지 아무리봐도 모르겠습니다.코드대로 읽어보면 Enter는 Program영역이고 Leave는 ClientSession의 영역이라 서로 다른 처리를 하고있는게 아닌가 하는 생각이 들고요. 또 하나 신기하면서도 이해가 안되는 부분은 public static void ClientChatHandler(PacketSession session, IPacket packet) { ClientChat chatPacket = packet as ClientChat; ClientSession clientSession = session as ClientSession; // 여기! if (clientSession.Room == null) return; clientSession.Room.Broadcast(clientSession, chatPacket.chat); } clientSession에는 Room을 넣어준 적이 없는데 if를 통과하는 부분이에요. 분명 어디선가 초기화가 되고 있다는 뜻인데 암만 봐도 모르겠습니다... ㅠ 심지어 ClientSession의 Room 은 초기화 되는 곳이 그 어느곳을 찾아봐도 없어요.ㅠ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
캐스팅 질문 드려요.
Connect 구현 중에 캐스팅 코드관련해서 궁금한 것이 있습니다. 명시적 캐스팅을 진행할 때 Socket socket = (Socket) args.UserToken; 이렇게 진행한다고 배웠는데 Socket socket = args.UserToken as Socket; as 키워드로 하는 캐스팅이 나와 당황스러웠어요. 둘 차이점이 있나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReaderWriterLock 구현 연습 파트 질문입니다!
ReadLock() 작성 중에 조건이 아무도 WriteLock을 획득하고 있지 않으면 ReadCount를 1 늘린다 라서 if ( (_flag & WRITE_MASK) == 0 ) 이 코드는 이해하겠는데 Interlocked를 사용하면서 이 부분이 사라지고 int expected = (_flag & READ_MASK); if (Interlocked.CompareExchange(ref _flag, expected + 1, expected) == expected) return; 이렇게 작성이 되었는데요. 이러면 WriteLock 체크를 무시하는 것이 아닌가요? 코드로만 보면 WriteLock 영역은 모두 0으로 날려버리는 것이니 WriteLock이 있던 없던 그냥 Read 하겠다라고 이해되어서요.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReaderWriterLock 강의 10분 47초 쯤 나오는 Reward 예시에 대해 질문이 있습니다.
ReaderWriterLock 강의 10분 47초 쯤 나오는 Reward 예시에 대해 질문이 있습니다. Reward 예시에서 GetRewardById(int id) 를 설명하시면서, 운영 툴로 보상을 지급해야 할 때, lock이 필요하다 라고 말씀하셨었는데 애초에 MMORPG를 잘 안해서 와닿지 않는 것 같아요. 장기적으로 본다면 게임내의 캐릭터가 가지고 있는 아이템들은 DB로 관리될 것이라 생각되는데, 왜 Lock이 필요한 것인지 이해가 잘 되지 않아요. 메모리 배리어 파트의 Store, Load 와 관련된 것 이라면 DB와 무관하게 실시간으로 캐릭터에게 지급이 된다라고 이해한다면 맞는것 같은데 이렇게 생각하는게 맞는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
터레인 클릭이 안돼요
안녕하세요 애셋스토어에서 받은 데모 씬으로 유니티짱, @Scene, Main Camera를 옮기고 나서 터레인과 빌딩의 레이어를 Wall로 바꿨는데도 캐릭터가 이동하지 않기에 확인해봤더니 InputManager의 이 코드에 막혀 클릭하는 이벤트가 실행되지 않는 것 같습니다. if (EventSystem.current.IsPointerOverGameObject()) return; 이 코드는 UI를 클릭한경우 다른 클릭 이벤트를 막기위해 쓴 코드로 알고있는데 왜 터레인을 클릭했는데도 이 코드에 막혀버리는걸까요? 지금까지 한것중에 뭔가 잘못따라한게 있나해서 Data Manager#2 강의 첨부파일을 받아 다시해봤는데도 마찬가지입니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
부모클래스에서 Init()을 실행하는 부분 질문입니다.
안녕하세요 게임오브젝트를 비활성화 시켜도 Awake() 안에있는 Init()은 실행된다는 것은 이해했는데요 14분 44초에서 부모 클래스 BaseScene.cs에서 Init()을 실행했는데 어떻게 자식클래스 GameScene.cs의 Init()까지 실행이되는건지 잘 이해가 안됩니다. 제 생각으로는 자식클래스에서 어떤 메서드를 오버라이드했더라도 부모클래스에서 그 메서드를 실행하면 부모클래스의 메서드만 실행될거같은데 유니티에서만 가능한건가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
궁금합니다
락의 기초에서 배웠던 lock함수를 써야할때와 스핀락을 써야할때가 어떻게 다른가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Init 메서드
혹시 생성자 메서드를 사용하지 않고 Init 메서드를 만들어서 사용하는 특별한 이유가 있나요? 그냥 코딩 스타일인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
GetComponent에 대해서
이 함수가 해당 게임 오브젝트의 컴포넌트를 불러오는 함수인 거죠? Instance = go.GetComponent<Managers>();의 경우에는 게임 오브젝트 go에 넣어진 @Managers의 Managers란 컴포넌트를 불러와서 Instanc에 넣는 거고요. 그런데 비주얼 스튜디오에서 GetComponent의 설명을 읽어보니 Component GameObject.GetComponent(systerm type type) 라고 되어 있던데 맨 앞의 Component는 왜 붙어있는 건가요? 유니티의 도큐멘테이션에서는 Component.GetComponet라고 되어 있던데 이렇게 쓰면 컴포넌트의 컴포넌트를 불러온다는 건가요???? 마치 인셉션처럼?? 헷갈리네요 ㅜㅜ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
컴포넌트 패턴 질문드립니다
안녕하세요! 강좌 잘 보고있습니다. Component 패턴이 그냥 Class 로 객체지향적으로 분리하는거랑 무슨 차이가 있을까요? 제 입장에선 사진처럼 따로따로 class 로 분리해서 짜는게 너무 당연해보여서.. 디자인패턴으로까지 정리된 이유를 모르겠습니다. 제가 해당 내용에 대해 잘 이해하지 못한다고 생각해 질문드립니다 ㅠㅠ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
편집할때 영상이 잘린 것 갔습니다.
[UpdateMoving]7:09초때는 _destPos = _lockTarget.transform.position; 가 없었는데7:11초때는 _destPos = _lockTarget.transform.position; 코드가 추가 되어 있습니다.다음 영상 "공격 #2" 에서 코드 정리할때 OnMouseEvent 메소드에서 위에 코드가 삭제되면 플레이어가 공격할 때 문제가 생기네요. 혹시 같은 문제가 발생하시는 분들을 위해 남겨놓습니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
return Object.Instantiate(prefab,parent);에 대해 질문있습니다.
1) prefab 파일에서 tank = Managers.Resource.Instantiate("Tank")에서 호출 당함 2) ResourcesManager 파일에서 GameObject를 사용해 prefab 오브젝트를 만들어서 그 안에 Prefabs 폴더 안에 있는 Tank 모델 경로를 가져와서 넣음. 그렇다면 return Object.Instantiate(prefab,parent);에 있는 Object는 prefab를 말하는건가요? Object를 쓰지않으면 자기 자신을 불러오는 재귀함수가 되기때문이라는건 알겠는데 저 Object는 어디서 호출당한건지, 아니면 약속처럼 사용하는 언어인지 혼란이 와서 질문합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
InputManager에대해 질문이 있습니다.
안녕하세요. 강의를 듣다가 궁금한 부분이 생겨서 질문을 올리게 되었습니다. InputManager를 만들 때 이 매니저를 만들어서 관리하는 이유가 100명의 유저가 모두 PlayerController를 지니고 있고 PlayerController의 Update 함수에서 입력처리를 하면 매 프레임마다 100명의 유저의 Update함수를 호출해야하는데 이러한 방식이 퍼포먼스에 영향을 주기때문에 별도의 매니저를 만들어 Input에 대한 이벤트를 구독시켜 입력이 들어올 때 일괄 처리하려는 것까지는 알겠습니다. 근데 MMO에서 유저들은 모두 PlayerController를 가지고 있을 것이고 키보드 입력 키는 커스텀이 가능하긴 하지만 대부분 디폴트 형태로 사용을 할텐데 만약 W,A,S,D로 이동을 한다고 치면 서버내 한 유저가 W를 입력하면 InputManager에서 키보드 입력 이벤트가 발생했음을 감지하고, 이벤트를 구독중인 모든 객체들에게 이를 전달할텐데 그러면모두 같은 PlayerController를 지니고 있고 이동에 대해 같은 키가 맵핑되어있으니 한명이 W키를 누르면 서버내 모든 유저가 움직이게 되지않나요?? 혹시 현재 InputManager는 오직 서버가 없는 로컬용 게임을 대비해 만든건가요?? 질문과 별도로 강의 정말 너무너무너무 잘 보고 있습니다. 이 강의 덕분에 한층 성장한 느낌입니다. 좋은 강의 정말 감사드립니다. 다음 강의도 기다리고 있겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Visual Studio 에서 Unity 디버깅이 안됩니다.
안녕하세요. Visual Studio 2019에서 "Unity에 연결" 이없어 디버깅이 안됩니다. 어떻게 해야 할까요?
-
해결됨레트로의 유니티 C# 게임 프로그래밍 에센스
Move함수 만들 때 질문있습니다.
moveInput.magnitude를 쓰는 이유가 게임패드를 쓸 때는 1보다 작은 값이 들어올 수가 있기 때문이라고 하셨는데 저걸 쓰면 왜 값이 1이 되는지 모르겠네요. magnitude는 벡터의 크기(길이)를 반환한다고 알고 있는데 게임패드에서 쓴다고 하더라도 예를들어서 moveInput값에 (0.2 , 0)이라는 값이 들어온다면 moveInput.magnitude는 0.2²+0²=0.04가 되어서 1이 안되는거 아닌가요?
-
해결됨레트로의 유니티 C# 게임 프로그래밍 에센스
RawImage 질문입니다
특수한 텍스처를 쓸 수 있다는 말이 어떤 의미인가요?
-
해결됨레트로의 유니티 C# 게임 프로그래밍 에센스
예제 다운로드 질문입니다
파일이 3개 있는데 3개 모두 다운로드 받으면 되나요?