(출처 : 구글 이미지 검색)


안녕하세요 철사마 입니다.

이번 시간에는 Unity5의 버튼 클릭 이벤트에 대해서 정리해 보았습니다.


처음에 버튼 별로 스크립트를 짜고 오브젝트에 매번 붙여주는게 코드가 복잡해질 것 같아서 한번에 깔끔하게 할 순 없을까 하여 찾아보기 시작했습니다. 그런데 나름 답을 찾고 나니 버튼별로 기능이 천차만별이라 파일 하나로 뭉쳐서 하는게 과연 깔끔한 코드인가라는 생각이 들더군요. 정답은 없는 것 같습니다. 개발자의 취향에 맞게 하면 되겠죠. 기능별로 구분을 하는것이 오히려 코드를 깔끔하게 할 수 있지 않을까 생각이 들기도 합니다. ^^


우선 클릭에 관련된 이벤트에 대해서 알아보고, 스프라이트의 TAG를 활용하여 같은 클릭 이벤트에서 스프라이트 별로 다른 명령을 내릴 수 있어 일괄적으로 관리되는 느낌이 나도록 구성해 보았습니다.


버튼 클릭 이벤트르 만드는 방법은 다양합니다. 전 두가지만 설명하겠습니다. 다 설명하려니 너무 길어서요... ^~^


첫 번째 : 위젯에 Box Collider를 붙이고 스크립트에서 이벤트를 처리하는 방법

프로젝트 뷰에서 적당한 C# Script를 생성합니다. 그리고 아래와 같은 코드를 작성합니다.


using UnityEngine;

using System.Collections;


public class Onbutton : MonoBehaviour {


    UISprite m_Strite; // UISprite UI관련 컴퍼넌트를 선언합니다.


    void Awake()

    {

        m_Strite = GetComponent<UISprite>(); // 위젯에 연결된 스프라이트를 변수에 매칭합니다.

    }


    void OnClick() // 클릭이벤트가 발생했을때 이 함수를 호출합니다.

    {

        Debug.Log("Onclick");

    }

}



해당되는 오브젝트에 Add Component 를 눌러 Box Collider를 선택하여 클릭에 반응할 수 있도록 합니다.

Box Collider버튼 뿐만 아니라 각종 충돌체크에 사용되는 컴퍼넌트입니다.


추가로 위에 작성한 코드를 포함시켜 줍니다.


그렇게 하면 쉽게 클릭시 OnClick() 함수가 호출되게 됩니다.

여기서 참고할 사항은 Unity에서 자동으로 OnClick() 함수를 클릭시 자동으로 호출되는 함수로 인식한다는 것입니다.

이런 클릭관련 내장함수는 아래와 같이 몇가지가 있습니다.(중요한것만 추렸습니다.)


    void OnClick()

    {

        // 클릭시 반응

    }

    

    void OnDrag(Vector2 delta)

    {

        // 클릭 후 드래스시 반응

        // 아래 코드를 넣으면 대상 오브젝트가 드래그시 옮겨지는 것을 확인할 수 있습니다.

        m_Strite.transform.localPosition += (Vector3)delta;

    }


    void OnHover(bool isOver)

    {

        // 마우스 오버

  // 아래 코드르 넣으면 대상 오브젝트가 마우스 오버시 커지는 것을 확인할 수 있습니다. 

  // (모바일 디바이스에서는 당연하겠지만 확인이 불가능합니다.)

        m_Strite.cachedTransform.localScale = (isOver) ? Vector3.one * 1.2f : Vector3.one;

    }



두 번째 : 위젯에 Box Collider를 붙이고 UIButton 컴포넌트를 추가하고 스크립트에서 함수를 연결하여 오브젝트에 묶어 특정 함수만 처리하는 방법

우선 중간까지는 첫 번째 방식과 비슷합니다.

코드를 짜고, 오브젝트에 Box Collider를 추가합니다.

그리고 Add Component로 Button을 추가합니다. 

(UI Button으로 검색하면 안나올 수 있습니다. Button으로 검색해 주세요)


기본적으로 이 Component는 기본, 마우스 클릭, 오버 등 다양한 기능에 대하여 설정을 할 수 있습니다. 

(자세한것은 Inspector에서 이것저것 테스트 해보면 쉽게 알 수 있을 것입니다.)


Component 추가를 하면 기본으로 On Click이라는 메뉴가 생기게 됩니다.

여기에 함수를 추가한 Script를 연결하면, 함수리스트가 보여지며, 설정할 수 있게 됩니다.

주의해야 할 사항은 Script를 빈 오브젝트에 넣어서 오브젝트를 연결하는 것입니다.(주의!)

 - 그냥 스크립트를 끌어다 놓으면 연결이 되지 않습니다.

 - 오브젝트에 연결된 다양한 스크립트에 한번에 접근할 수 있다는 것입니다.(매우 유용해 보입니다.)

저는 GameMansger라는 빈 오브젝트를 만들어서 GameManager라는 C# 스크립트를 생성하여 OnClick()이라는 함수를 만들었습니다.

주의해야할 점은, 외부에 연결되는 함수이기 때문에 Public으로 설정하셔야 한다는 것입니다.

    public void OnClick()

    {

        Debug.Log("m_Start");

    }

이런 식으로 Public하게 함수를 구성해 주시면 됩니다.


추가로 첫 번째 처럼 다양한 이벤트에 대하여 설정을 연동하고자 한다면 Event Trigger Component를 추가하면 됩니다.





저는 개인적으로 첫 번째 방법이 구성하기에 용이해서 마음에 들었습니다.

그런데 다양한 버튼 이벤트에 대하여 버튼별로 액션을 구분할 방법이 있을까 해서 방법을 고민해 보았습니다.

바로  Tag를 활용하는 것이죠!


세 번째 : 첫 번째 방법에 코드에 Tag를 추가하여 버튼별로 한 코드로 통일해보기

첫 번째와 방법을 모두 동일합니다.

여기서 위젯인 스프라이트에 Tag라는 것을 추가해 보겠습니다.

Tag는 Inspector 메뉴의 상단에 위치해 있습니다. 기본적인 Tag가 있으며 Add Tag를 누르면 임의의 태그를 생성할 수 있습니다. 

전 편의를 위해 임의의 Tag를 생성했습니다.

그 후에 생성한 Tag를 위젯별로 Tag로 설정합니다.


그 후에 코드를 아래와 같이 추가합니다.


    void OnClick()

    {

        // Sprice에 태그를 해서 클릭했을 때 해당 태그의 값을 입력받음

        if (m_Strite.tag == "m_Start") 

        {

            Debug.Log("m_Start");

        }

        else if (m_Strite.tag == "m_Manual")

        {

            Debug.Log("m_Manual");

        }

        else if (m_Strite.tag == "m_Score")

        {

            Debug.Log("m_Score");

        }

        else if (m_Strite.tag == "m_Setting")

        {

            Debug.Log("m_Setting");

        }

        else if (m_Strite.tag == "m_Exit")

        {

            Debug.Log("m_Exit");

        }

        else

        {

            Debug.Log("이런 태그없어 : " + m_Strite.tag);

        }

    }


이렇게 하면 한 개의 소스파일로 여러가지 버튼의 클릭 이벤트를 구분하여 처리할 수 있습니다.

간단한 메뉴의 경우는 한개의 소스코드로 쉽게 구성을 할 수 있습니다.

물론 복잡한 구성일 경우는 별도로 소스를 구성하는 것이 훨씬 가독성이 좋아질 것 같습니다.


개인적으로 궁금했건 코딩방식이라 정리 차원에서 블로그에 적어놨습니다.

생각보다 쉬운 코드인데, 모르면 불편하더라구요 ^^


그럼 도움이 되었으면 좋겠습니다.

감사합니다.



직접 해보고 추천하는 게임한당 펜페이지, 좋아요 하시고 간단 리뷰 스크랩하세요 ^-^



먹는 사진 다 올리는 먹는 즐거움, 먹방 펜페이지에 놀러오세요 ^-^



+ Recent posts