2014년 5월 13일 화요일

[ Unity ] NGUI 버튼 이벤트 동적 할당

이번에는 NGUI를 사용 할 때 자주 사용하는 UIButton 컴포넌트에 이벤트를 동적으로 추가시키는 방법을 알아보겠습니다.

대부분은 인스펙터 화면에서 이벤트를 연결해주지만 프리팹을 사용하게 되면 이벤트가 해제 된 상태로 생성이 됩니다. 그래서 동적으로 추가해야 할 일이 생기게 됩니다.

인스펙터 화면에서 m_BtnTest에 UIButton 컴포넌트를 연결시켜 주었다고 가정 합니다.

EventDelegate를 생성할때는 콜백 함수가 정의되어 있는 컴포넌트와 콜백 함수명을 입력해 주어야 합니다. 만약 ButtonTutorial이 아닌 다른 스크립트 상에 존재하는 함수를 호출하고 싶다면 해당 GameObject의 컴포넌트를 추가시켜주면 됩니다.

MakeParameter 함수는 파라메타를 여러개 추가시켜 줄 때를 대비해서 만들어 보았습니다. EventDelegate.Paramter를 생성하고 전달하고자 하는 값과, 해당 값의 타입을 입력해주면 됩니다. 여기서 Object는 UnityEngine.Object 입니다. System.object를 넣으면 작동하지 않습니다. 때문에 아직 int, string 같은 값을 어떻게 전달해야 되는지는 잘 모르겠네요.

마지막으로 파라메타를 추가시켜주었다면 이벤트를 등록해야 합니다. 이벤트를 추가 할 버튼의 onClick값과 생성 된 EventDelegate를 넣어주면 동적으로 할당하는 작업이 완료 됩니다.

씬을 실행하고 버튼을 클릭해보면 ButtonTutorial 스크립트 안에 존재하는 onBtnEvent함수가 정상적으로 호출 되는 것을 보실 수 있습니다. 만약 파라메타를 전달하고 싶지 않다면 중간에 이벤트 파라메타를 연결하지 않고 콜백 함수의 파라메타도 삭제해 주시면 됩니다.

System.object 변수를 UnityEngine.Object로 변환하는 방법을 찾으면 추가 포스팅 하도록 하겠습니다.



[ 2014. 05. 22 추가 ]

 NGUI, UIButton 이벤트를 스크립트로 작성시 GameObject가 아닌 다른 타입의 변수를 전달하는 방법을 추가로 알아냈습니다.

 기본 적으로는 추가 하기전 내용과 동일 합니다. 다만 파라메타 지정 시 컴포넌트와 필드명을 입력해주면 int, float, vector 등등 GameObject가 아닌 타입의 변수를 파라메타로 지정 할 수 있습니다.


댓글 6개:

  1. 이벤트 파라미터로 GameOjbect 말고 int 형은 전달할 수 없나요?
    param.obj 는 GameObect만 되기 때문에 다른 형태를 사용할 수 없네요

    답글삭제
    답글
    1. GameObject가 아닌 다른 타입의 변수를 파라메타로 등록하는 방법을 추가 포스팅 하였습니다.

      삭제
  2. EventDelegate 때문에 하루종일 헤메고 있었는데 깔끔하게 정리해주셔서 감사합니다!

    답글삭제
  3. 감사합니다. 덕분에 쉽게 해결했내요.

    답글삭제
  4. 감사합니다 파라미터 값 전달에서 막히고 있었는데 정말 감사해요!

    답글삭제

Post List