인프런 커뮤니티 질문&답변

이수빈님의 프로필 이미지
이수빈

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

InputManager를 만드는 부분에서 질문이 있습니다.

작성

·

278

0

1) KeyAction.Invoke( )는 해당 delegate를 구독한(delegate에 할당된) 아이들에게 "이 이벤트 발생했어!"라고 전파하는 함수라고 이해했는데 맞나요?

* 어제 질문으로 올려두었던 "Action delegate가 key입력 시 어떻게 아나요?"는 PlayerController의 Start함수에서 해당 delegate에  OnKeyBoard()라는 함수(키 입력을 검사)를  할당해주었기 때문에 Invoke를 해서 받아온 키입력 메시지를 처리하였다고 이해했습니다.

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요,

1) 이해하신 것이 맞습니다. KeyAction을 신문이라 비유하면, "KeyAction += OnKeyBoard"는 "신문 구독 신청을 할테니, 관련해서 새로운 소식이 있으면 OnKeyBoard로 알려줘~" 정도로 이해하면 되겠습니다. 참고로 delegate의 operator+은 컴파일러가 내부적으로 Delegate.Combine으로 변환해서 처리합니다. 최종적으로 KeyAction.Invoke()를 하면 위에서 += 한 모든 함수들이 호출이 됩니다. (구독 신청을 한 구독자들에게, 각자가 희망한 방법으로 알림을 보내는 것)

2) Action delegate는 그냥 새로운 소식을 알리는 도구일뿐, key 입력이 되었다는 것을 알 수는 없습니다. 초반 코드에서는 Managers가 매 틱마다 Update를 하면서, InputManager의 OnUpdate를 불러주고 있습니다. OnUpdate에서는 Input.anyKey를 확인하는데 이는 유니티에서 제공하는 기능이며 "키보드/마우스가 입력되었으면 true, 아니면 false를 반환"하기 때문에 이를 통해서 delegate Invoke를 할지 말지를 결정하고 있습니다. 아무 키나 눌렸으면 일단 '무엇인가 눌렸다'는 사실을 Invoke를 통해서 알려주고, OnKeyBoard에서 세부적으로 어떤 키가 눌렸는지를 다시 판별해서 구현을 하고 있습니다. (물론 이렇게 보면 굳이 delegate를 받지 않고, PlayerController의 Update에서 프레임마다 체크해도 별 차이는 없습니다)  유니티에서는 매 프레임마다 Input에 있는 정보들을 갱신해주고 있는데, Input.anyKey를 비롯해 GetButton, GetButtonDown, GetButtonUp 등 유용한 시리즈들이 많이 있습니다. 따라서 굳이 InputManager를 사용하지 않아도 되는 경우가 대부분이지만, 그럼에도 [클릭] [마우스 드래그]와 같이 우리가 커스텀으로 제공하고 싶은 이벤트가 있다면 InputManager와 같은 중앙 처리 시스템에서 한 번만 체크해서 이벤트를 뿌려주는 것도 괜찮은 방법입니다.

감사합니다

0

이수빈님의 프로필 이미지
이수빈
질문자

정말 좋은 답변 감사합니다 :) 

좋은 강의 정말 잘 보고 있습니다. 한층 더 성장할 수 있는 기회가 되어 굉장히 좋습니다.

이수빈님의 프로필 이미지
이수빈

작성한 질문수

질문하기