Google Play에서 다운로드 App Store에서 다운로드

Unity

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

정보처리마법사 2025. 8. 21. 09:57
반응형

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)
인스펙터 모양 함수만 선택 함수 선택 후, 값 입력 필드가 나타남
파라미터 소스 이벤트가 실시간으로 값을 전달 개발자가 에디터에 미리 입력한 고정값
핵심 목적 이벤트의 데이터를 활용 이벤트 발생 사실을 신호로 활용
대표 예시 입력 필드 텍스트 로그 출력 설정 창 켜기/끄기
Sheets로 내보내기

그래서 해결책은?

만약 여러분의 함수가 호출은 되는데 값이 들어오지 않는다면, 100% 확률로 정적(Static) 섹션의 함수를 연결한 것입니다.

  1. 해당 이벤트의 함수 드롭다운 메뉴를 다시 엽니다.
  2. 목록 최상단에 있는, 아무런 추가 필드가 나타나지 않는 동적(Dynamic) 섹션에서 여러분의 함수를 다시 선택하세요.
  3. 문제가 마법처럼 해결될 것입니다.

결론: 실수가 아닌 강력한 기능으로 이해하기

"왜 이렇게 헷갈리게 만들어 놨지?"라고 생각할 수도 있지만, 사실 이 구분은 Unity의 매우 강력한 기능 중 하나입니다. 코드를 한 줄도 쓰지 않고 기획자나 디자이너가 UI의 간단한 동작을 직접 구현하게 해주는 통로가 바로 '정적 이벤트'이기 때문입니다.

이제 이 둘의 차이를 명확히 알게 되셨으니, 앞으로는 시간을 낭비하는 '실수'가 아닌, 개발 효율을 높이는 '선택'으로 이 기능을 활용하실 수 있을 겁니다. 유저의 입력을 받아야 한다면 '동적'을, 정해진 행동을 시키고 싶다면 '정적'을 사용하는 것을 잊지 마세요!

 

반응형
Google Play에서 다운로드 App Store에서 다운로드