인프런 커뮤니티 질문&답변
Action KeyAction 작동 관련 질문드립니다!!
해결된 질문
작성
·
513
0
[타 질문자분 댓글에 작성한게 좀 민폐인 듯 하여 새 질문란에 다시 올립니다... 관련질문 : KeyAction이 Null 에서 어떻게 Not Null 로 바뀌는건가요?]
그냥 개인 의견입니다만... 저도 지금 InputManager가 잘 이해가 안되서 힘들지만 UI 공부에 있어서 상당히 중요한 부분이라고 느껴져서 삭제는 안하시고 어려우신분들은 스스로 일단 스킵하도록 하시는게 좋지 않을까 싶습니다 ㅠㅠ 아쉬워서요 ㅠㅠ
더불어 원래 질문자님에게 답변해주신 말이 100프로 이해가 되지 않아서 번거로우시겠지만 비슷한 질문드립니다 ㅠ
(함수라는 단어가 중복되어 괄호 안에 번호를 넣어 구분하겠습니다..! e.g. (1번), (2번))
KeyAction은 말씀하셨듯이 delegate이기 때문에 결국 어떤 함수를 대리하는 역할만 한다는 것은 알겠습니다.
- 그렇다면 Action KeyAction이 대리하는 함수(1번)는 시스템 상 숨겨져 있는 건가요?
- 그렇다면 눌려지는 키에 대한 신호를 매개변수로 받고 반환형식이 Action인 어떤 함수(2번)가 키가 눌리면 return new Action((1번)); 이런식으로 KeyAction이 대리할 함수를 지정해줌으로써 null이 아니게 되는 건가요..?(스스로 생각하면서도 이게 어떻게 KeyAction으로 연결되는지는 의문입니다..)
- 또한 그렇게 null이 아니게 된 KeyAction은 Invoke()를 통해 구독자들에게 실행됨을 알림과 동시에 대리하는 함수(1번)을 호출하고 눌린 키에 대한 정보는 Input 클래스 어딘가의 static 필드에 string으로 저장되었다가 OnKeyboard() 에서 Input.GetKey(String name)을 통해 bool을 return하는 건가요..?!!?
질문이 두서없어 죄송합니다... 질문을 구체화 할 필요가 있다면 다시 정리해서 올리겠습니다..!!
답변 2
2
살짝 오해를 하신 것 같은데 InputManager가 이해하기 어려워서 제거했다는 의미가 아니고,
정말 마우스 기반의 게임에서만 유용하고 터치나 키보드 방식의 컨트롤 게임에서는 의미가 없는데
그 부분이 혼동스러워 제거한 것입니다.
어차피 최종 프로젝트도 2D 로그라이크 게임이라 키보드 방식의 게임이기도 하고요.
1. '시스템 상 숨겨져' 있다는 말이 모호한데
action이라는 객체 자체를 내부에서 자신이 호출해야 할 함수 주소를 들고 있는 쪽에 가깝습니다.
C++ 기준으로 함수 포인터 혹은 함수 객체와 유사한데요.
class Action
{
public:
void Invoke()
{
_func();
}
private:
Func _func; //< 호출이 가능한 '무엇인가'를 저장중
}
느낌적인 느낌으로 표현하면 위와 같이
객체 안에서 함수 주소를 들고 있어서,
나중에 필요할 때 호출을 해주는 쪽이라고 보시면 됩니다.
(물론 C#에서는 포인터를 '기본적'으로 사용할 수 없습니다)
그리고 C++ 함수 포인터와는 조금 다른게,
함수를 딱 1개만 저장하는게 아니라 여러개를 저장할 수도 있습니다.
그러니 List<Func> 정도라고 보는게 더 정확할 수도 있겠네요.
저장하는 함수는 우리가 연결을 해줘야 하는데
연결 방법도 여러가지가 있습니다.
action1, action2 모두 되는 문법이지만
1이 더 최신 문법입니다 (귀차니즘에 의해 발전한 C#)
추가로 action() 혹은 action.Invoke() 똑은 의미입니다.
그리고 action이 호출될 때 호출될 함수를 딱 1개만 지정하는 것은 아니고,
+= 를 이용해가지고 여러개를 지정해서 호출해줄 수도 있습니다 (chaining 방식)
action3은 2개의 함수를 호출하도록 되어 있죠.
함수를 연결해주면 기본적으로 action = new Action(함수) 를 한 것처럼
null이 아니게 됩니다.
2. Action은 매개변수 없는 함수를 저장할 수 있고
Action<T1, T2> .. .와 같이 시그니처가 일치하는 함수를 받아 줄 수 있습니다.
Action<int> action;으로 만들었으면 void Func(int a) 같은 함수만 연결해줄 수 있겠습니다.
3.
또한 그렇게 null이 아니게 된 KeyAction은 Invoke()를 통해 구독자들에게 실행됨을 알림과 동시에
Invoke()를 호출하면 연결해준 함수만 호출할 뿐이지 뭔가 실행됨을 따로 알려주진 않습니다.
대리하는 함수(1번)을 호출하고 눌린 키에 대한 정보는 Input 클래스 어딘가의 static 필드에 string으로 저장되었다가 OnKeyboard() 에서 Input.GetKey(String name)을 통해 bool을 return하는 건가요..?!!?
말씀하신 Input 클래스 static 어딘가에 저장되는 것은 delegate랑은 아무런 연관성이 없고
유니티 쪽에서 매 프레임마다 세팅을 해준 것입니다.
Input. 은 입력과 관련된 유니티 기능들이 모여있는 클래스라고 보시면 됩니다.
우리는 단지 해당 action을 Invoke하면 OnKeyboard를 호출해달라고만 연결해준 것이죠.
1





