• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

InputManager에대해 질문이 있습니다.

20.03.27 17:18 작성 조회수 219

0

안녕하세요. 강의를 듣다가 궁금한 부분이 생겨서 질문을 올리게 되었습니다.

InputManager를 만들 때 이 매니저를 만들어서 관리하는 이유가

 100명의 유저가 모두 PlayerController를 지니고 있고 PlayerController의 Update 함수에서 입력처리를 하면 매 프레임마다 100명의 유저의 Update함수를 호출해야하는데 이러한 방식이 퍼포먼스에 영향을 주기때문에 별도의 매니저를 만들어 Input에 대한 이벤트를 구독시켜 입력이 들어올 때 일괄 처리하려는 것까지는 알겠습니다. 근데 MMO에서 유저들은 모두 PlayerController를 가지고 있을 것이고 키보드 입력 키는 커스텀이 가능하긴 하지만 대부분 디폴트 형태로 사용을 할텐데

 만약  W,A,S,D로 이동을 한다고 치면 서버내 한 유저가 W를 입력하면 InputManager에서 키보드 입력 이벤트가 발생했음을 감지하고, 이벤트를 구독중인 모든 객체들에게 이를 전달할텐데 그러면모두 같은 PlayerController를 지니고 있고 이동에 대해 같은 키가 맵핑되어있으니 한명이 W키를 누르면 서버내 모든 유저가 움직이게 되지않나요??

 혹시 현재 InputManager는 오직 서버가 없는 로컬용 게임을 대비해 만든건가요??

질문과 별도로 강의 정말 너무너무너무 잘 보고 있습니다. 이 강의 덕분에 한층 성장한 느낌입니다. 좋은 강의 정말 감사드립니다. 다음 강의도 기다리고 있겠습니다.

답변 1

답변을 작성해보세요.

4

안녕하세요, 질문주신 내용에 대해 답변을 드립니다.

1) InputManager 장점
사실 퍼포먼스 이유보다는 커스텀 이벤트 관리가 가장 큰 이유입니다.
예를 들면 [클릭] [더블클릭] [드래그]와 같은 이벤트가 필요하다고 했을 때,
중앙에서 관리해서 필요한 애들한테 뿌려주면 편리하겠죠.
일반적인 [마우스 누른 상태] [마우스 뗀 상태]와 같은 판별은 Unity의 Input 클래스에서 충분한 정보를 제공하니,
사실 굳이 InputManager를 통할 필요는 없습니다.
강의 때 [Update 함수에서 프레임마다 체크하는 방식보다는 중앙에서 이벤트 통지한는게 유리]하다고 하긴 했는데
엄밀히 말하면 LOL이나 스타크래프트와 같이 마우스 클릭 기반의 게임에 해당하는 사항이고, 
Diablo3와 같이 마우스를 누른 상태로 작동하는 게임이나 키보드 기반의 게임이라면 별 차이 없는 것도 사실입니다.

2) PlayerController 관련
Part3는 온라인 게임을 고려하지 않고 싱글 플레이만 고려한 것이 맞습니다.
MMO라면 애당초 내가 조종하는 Player와 그렇지 않은 타인의 Player를 구분해서 class 설계를 해야 합니다.
(ex. 예를 들면 MyPlayer를 파서 Player를 상속받는 형태로 만들 수가 있겠습니다.)
또한 만약 PlayerController에 키보드/마우스 키 매핑이 들어간다면 그것은 [나의 플레이어] 전용 Player한테만 붙여줘야겠죠.
온라인 게임에서 타인이 조종하는 Player는 사실 몬스터와 다를 바가 없습니다(?)
그러니까 정말 서버에서 명령하는대로 움직이는 꼭두각시 같은 존재들이고
나의 키보드/마우스랑은 전혀 무관하다고 생각하시면 됩니다.
따라서 한명이 W 눌렀다고 모든 유저들이 이동하는 것은 당연히 불가능하고,
패킷을 설계할 때 [나의 플레이어를 XXX 좌표로 이동시켜줘!]는 형식의 요청으로 보내도록 구성을 해야 합니다.
그리고 서버가 들어가면 일단 클라에서 보내는 정보는 조작 가능성이 있다고 가정을 하고
항상 유효성 체크를 하는 로직이 들어가게 됩니다. (패킷 조작이나 바이너리 조작 등 다양한 해킹 가능성이 있기 때문)
따라서 한명이 W를 눌렀다고 [모든 유저를 움직이게 해달라]는 요청이 어떤 사유로 인해 서버에 전송된다면,
서버에서 유효성 검사를 하고 말도 안되는 상황임을 인지해서 쿨하게 무시하게 됩니다.

말로 표현하니 조금 어려운데,
서버 구현을 해보고 나중에 게임 로직을 클라<->서버 둘로 쪼개는 연습을 하다 보면 
어떤 상황인지 더 쉽게 이해가 갈겁니다.

마자믹으로 강의가 도움이 된다니 영광입니다 !
다음 파트가 사람들이 특히나 궁금해하는 게임 서버 쪽이니, 기대하셔도 좋을 것 같습니다.

감사합니다.