Unity 이벤트 값 전달이 안될 때? 99%는 이 문제입니다 (동적 vs 정적)

서론: 분명 호출되는데, 값은 왜 비어있을까?
Unity 개발자라면 누구나 한 번쯤 UI 이벤트를 사용해 봤을 겁니다. 버튼의 OnClick, 입력 필드의 OnEndEdit 등은 가장 기본적인 상호작용의 시작점이죠. 그런데 분명히 함수를 연결했고, 콘솔에 로그도 찍히는데 정작 중요한 값(Parameter)이 전달되지 않는 이상한 경험을 해보신 적 없으신가요?
"분명 OnEndEdit에 함수를 연결했는데, Debug.Log는 호출되지만 텍스트가 비어있어요. Unity 버그인가요?"
결론부터 말씀드리면, 99%의 확률로 버그가 아닙니다. 이것은 Unity Inspector가 가진 강력하지만 때로는 헷갈리는 기능, 바로 동적(Dynamic)과 정적(Static) 이벤트 핸들러의 차이를 인지하지 못해 발생하는 매우 흔한 실수입니다. 이 포스팅 하나로 여러분의 소중한 디버깅 시간을 아껴드리겠습니다.

두 얼굴의 이벤트 리스트: Dynamic vs Static
Unity의 UI 컴포넌트에서 이벤트에 함수를 연결하려고 드롭다운 메뉴를 클릭하면, 함수 목록이 보이지 않는 구분선을 기준으로 두 부분으로 나뉘어 있는 것을 볼 수 있습니다. 바로 이 두 섹션이 '동적'과 '정적' 영역입니다.
1. 동적(Dynamic) 파라미터: "이벤트의 데이터를 실시간으로 받을게!"
- 위치: 드롭다운 목록의 상단
- 특징: 함수만 덩그러니 표시됩니다. (OnInputEndEdit 처럼)
- 동작: 이벤트가 발생할 때, 해당 이벤트가 가진 실시간 값을 함수의 매개변수로 '동적으로' 전달합니다. InputField의 OnEndEdit 이벤트는 string 타입의 최종 텍스트를 가지고 있으므로, public void MyFunction(string text) 형태의 함수를 연결하면 text 매개변수로 그 값이 그대로 들어옵니다.
- 언제 사용하나요?
- 입력 필드에서 유저가 입력한 텍스트가 필요할 때
- 슬라이더에서 **유저가 조정한 숫자 값(float)**이 필요할 때
- 토글에서 **체크 여부(bool)**가 필요할 때
- 즉, 이벤트가 발생하며 생성된 '데이터' 자체가 필요한 모든 경우에 사용합니다.
2. 정적(Static) 파라미터: "데이터는 필요 없고, 그냥 내가 정해놓은 거 실행해!"
- 위치: 드롭다운 목록의 하단
- 특징: 함수 이름 옆에 타입이 표시되고(OnInputEndEdit (string)), 선택하면 값을 직접 입력할 수 있는 필드가 나타납니다.
- 동작: 이벤트가 발생했다는 '신호'만 받고, 함수의 매개변수로는 **개발자가 Inspector에 미리 입력해 둔 '고정된 값'**을 전달합니다. 만약 이 입력 필드를 비워두면? 당연히 빈 값("", 0, null)이 전달됩니다. 바로 이것이 값이 비어 보이는 현상의 주범입니다.
- 언제 사용하나요?
- 버튼 클릭 시 정해진 UI 패널을 켜고 끌 때 (GameObject.SetActive(true))
- '메인 메뉴' 버튼 클릭 시 정해진 "MainMenu" 씬을 로드할 때
- '공격' 버튼 클릭 시 **정해진 데미지 10**을 전달할 때
- 즉, 이벤트의 데이터와 상관없이 미리 약속된 '동작'을 실행하고 싶을 때 사용합니다.
한눈에 보는 비교 및 해결법
| 구분 | 동적 (Dynamic) | 정적 (Static) |
| 인스펙터 모양 | 함수만 선택 | 함수 선택 후, 값 입력 필드가 나타남 |
| 파라미터 소스 | 이벤트가 실시간으로 값을 전달 | 개발자가 에디터에 미리 입력한 고정값 |
| 핵심 목적 | 이벤트의 데이터를 활용 | 이벤트 발생 사실을 신호로 활용 |
| 대표 예시 | 입력 필드 텍스트 로그 출력 | 설정 창 켜기/끄기 |
그래서 해결책은?
만약 여러분의 함수가 호출은 되는데 값이 들어오지 않는다면, 100% 확률로 정적(Static) 섹션의 함수를 연결한 것입니다.
- 해당 이벤트의 함수 드롭다운 메뉴를 다시 엽니다.
- 목록 최상단에 있는, 아무런 추가 필드가 나타나지 않는 동적(Dynamic) 섹션에서 여러분의 함수를 다시 선택하세요.
- 문제가 마법처럼 해결될 것입니다.

결론: 실수가 아닌 강력한 기능으로 이해하기
"왜 이렇게 헷갈리게 만들어 놨지?"라고 생각할 수도 있지만, 사실 이 구분은 Unity의 매우 강력한 기능 중 하나입니다. 코드를 한 줄도 쓰지 않고 기획자나 디자이너가 UI의 간단한 동작을 직접 구현하게 해주는 통로가 바로 '정적 이벤트'이기 때문입니다.
이제 이 둘의 차이를 명확히 알게 되셨으니, 앞으로는 시간을 낭비하는 '실수'가 아닌, 개발 효율을 높이는 '선택'으로 이 기능을 활용하실 수 있을 겁니다. 유저의 입력을 받아야 한다면 '동적'을, 정해진 행동을 시키고 싶다면 '정적'을 사용하는 것을 잊지 마세요!
