유니티가 지뢀같은건 아마도 많은 개발자들이 느끼겠지만, 소스 관리이다.

기본적으로 유니티는 GameObject라는 껍데기에 Transform / Sound / Animator 등의 Components 구조로 되어 있다보니..
UI 개발시 필연적으로 이런 모습의 UI를 만나면 신나게 개발해놓고 간혹 사운드를 바꿔 달라던가... 액션을 바꿔달라면 개 노가다를 해야 하는 문제가 생긴다.

* 예시 : ArmyAttack2
사용자 삽입 이미지
(저 수많은 버튼들을 보라... 죽음이 기다리고 있다!)

몇 번의 프로젝트에서 출시전 뜯어고치기 노가다 하다가 발견한 방법은 NGUI의 이벤트 핸들러를 직접 컨트롤 하는 것이다.

1. 먼저 UI를 만들고 Sprite 과 Label을 올려서 Button을 만든다.
사용자 삽입 이미지
* Collider를 반드시 붙여 주자.
사용자 삽입 이미지
* Label은 Font만 정의하였다.
사용자 삽입 이미지
* 최종 형태는 다음과 같다.
사용자 삽입 이미지

2. 공통 관리 Class를 다음과 같이 코딩해서 UI Root에 붙여 주자.
using UnityEngine;
using System.Collections;

public class UIManager : MonoBehaviour {

//싱글톤 선언 시작
 public static UIManager instance;
 public void Awake()
 {
 UIManager.instance = this;
 }
//싱글톤 선언 끝

//버튼별 이벤트 Method
 public void SetClickButton(GameObject _obj)
 {
 Debug.Log("Hello World!");
 Debug.Log(_obj.transform.name + " is Click!");
 }
//끝

}


3. 마지막으로 Button에 이벤트를 등록하는 Script를 만들고 Sprite 에 붙여주자.
using UnityEngine;
using System.Collections;

public class Behavior_Button1 : MonoBehaviour {


 void Start() {
 UIEventListener.Get(gameObject).onClick += UIManager.instance.SetClickButton;
 }

}

 

실행결과 버튼을 클릭하면 해당 문자가 출력된다.

이렇게 만드는 이유는 씬에 많은 버튼을 한꺼번에 코드로 관리하기 위함이다.

* 참고 이벤트를 받는 Method의 Arguments 값은 다음과 같이 UIEventListener에 정의되어 있다.

void OnSubmit () { if (isColliderEnabled && onSubmit != null) onSubmit(gameObject); }
void OnClick () { if (isColliderEnabled && onClick != null) onClick(gameObject); }
void OnDoubleClick () { if (isColliderEnabled && onDoubleClick != null) onDoubleClick(gameObject); }
void OnHover (bool isOver) { if (isColliderEnabled && onHover != null) onHover(gameObject, isOver); }
void OnPress (bool isPressed) { if (isColliderEnabled && onPress != null) onPress(gameObject, isPressed); }
void OnSelect (bool selected) { if (isColliderEnabled && onSelect != null) onSelect(gameObject, selected); }
void OnScroll (float delta) { if (isColliderEnabled && onScroll != null) onScroll(gameObject, delta); }
void OnDragStart () { if (onDragStart != null) onDragStart(gameObject); }
void OnDrag (Vector2 delta) { if (onDrag != null) onDrag(gameObject, delta); }
void OnDragOver () { if (isColliderEnabled && onDragOver != null) onDragOver(gameObject); }
void OnDragOut () { if (isColliderEnabled && onDragOut != null) onDragOut(gameObject); }
void OnDragEnd () { if (onDragEnd != null) onDragEnd(gameObject); }
void OnDrop (GameObject go) { if (isColliderEnabled && onDrop != null) onDrop(gameObject, go); }
void OnKey (KeyCode key) { if (isColliderEnabled && onKey != null) onKey(gameObject, key); }
void OnTooltip (bool show) { if (isColliderEnabled && onTooltip != null) onTooltip(gameObject, show); }


2015/08/26 17:56 2015/08/26 17:56

트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다