물에 살고싶은 개발자

UI클릭리스너 Switch문 활용법 본문

Unity3D

UI클릭리스너 Switch문 활용법

돼지사랑 2015. 12. 24. 19:04

게임 UI를 개발할 때, 클릭 이벤트를 어떤방식으로 처리하느냐 라는점에 대해서 항상 고민을 많이 하는편이다.

물론..그 고민의 길이나 횟수에 상관없이 언제나 NGUI의 도움을 받아 

매니저 스크립트를 통해 UI의 각 요소별 클릭이벤트 처리를 하게 된다.

그러다보면 자연스럽게 Switch문의 길이는 UI스케줄에 비례해서 길어지게 되는데,

이번에는 그 꽤나 큼직한 스케일의 Switch문을 사용할때에 생기는 문제점을 해결할 방법론에 대한 포스팅이다.


유니티로 UI를 제작하다 보면 아이템을 리스트화 시켜야 하는 경우가 생기기 마련이다.

주로 스크립트를 통해 동적으로 상황에따라 생성과 삭제를 하게 되며, 거기에는 주로 메모리풀이 이용된다.

하지만 이 글에서는 그부분은 제외하고 하이어라키에 있는 "아이템 오브젝트들을 클릭이벤트에서 어떻게 처리할까"

라는 부분에 대해서만 얘기해보자.(말을 어렵게했지만 결국 Switch case문 얘기다 -_-;;)


아이템 오브젝트들은 대체로, 이런 이름을 갖게 된다.

item_name1 ~ item_name(n)

또는 메모리풀을 통해 미리 대량 생성할 경우

item_name(Clone) 이렇게 되는 경우도 있다.


후자의 경우에는 딱히 Switch문에서만큼은 문제될 부분이 없기에 배제하고,

전자의 경우를 살펴보자


전자의 경우, Switch문에서 오브젝트이름 뒤에 붙는 숫자만큼 case를 추가해줘야하는 문제가 생긴다.

(물론 몇개정도라면 그냥 추가하는게 나을수도 있지만) 그것은 너무 노가다일뿐더러 코드 가독성도 떨어지고

나중에 보면 얼굴이 화끈거릴 위험이 있다.


그래서 고민을 하던 중 이런 방법이 떠올라서 글을 적는것이다.

코드를 보면

string Temp = obj.name.Substring( 7 );

try
{
	int intTemp = int.Parse( obj.name.Substring( obj.name.Length-1 , 1 ) );
	
	Temp = Temp.Substring( 0 , Temp.Length-1 );
	
	Debug.Log(Temp);
}catch
{
}


이런식으로 코딩을 했다. 뭐 대충 보면 어떤의미인지 알것이지만, try catch문을 사용한게 좀 의외일수 있다.

그 이유는 클릭이벤트를 하나의 Switch문에서 통제한다면, 오브젝트이름에서 맨뒤에 숫자가 붙은 

넘버링 오브젝트일수도, 아닐수도 있다. 그러므로 맨 끝에있는 문자열을 int로 파싱이 가능한지 아닌지를 

체크하기 위해 사용했다.

(참고로 앞에 7개를 짜르는건 나같은경우는 모든 클릭이벤트가 필요한 오브젝트의 이름앞에 "Button_"을 붙이기때문이다.)


아무튼 불가능할 경우 맨 끝에있는 문자열을 자르지 않고 그대로 사용하고

넘버링이 붙어있을 경우 맨 끝에있는 문자열(숫자)를 잘라내고 "item_name"으로 switch문을 활용할수 있게 되겠다.


아무튼 쓰고보니 별게 없네..

그래서 추가로 몇마디 더 적어보자면,

Switch문에서 case에는 변수가 아닌 상수만을 이용해야 하는것을 다들 알것이다.

변수를 사용할 경우 "A constant value is expected"라는 에러가 발생하기 때문에 case문에는

정적인 상수만을 사용해야 하는데, 알다시피 그 상수는 변경하거나 융통성을 발휘할 수가 없다..

예를들어서 case "item_name" + itemNumber :  이런식으로는 사용이 안된다는 얘기다.

(부끄러운 얘기지만 나도 오늘 하다가 알았다 -_-;;;) 그래서 위와 같은 방법을 이용하게 됐다.


끗!

Comments