상세 컨텐츠

본문 제목

유니티 Ui : 현재 게임오브젝트 가져오기

UNITY C#

by 오픈플레이 2019. 7. 6. 15:24

본문

제목을 어떻게 지을까 고민을 많이 했는데, 일단 상황을 만들어봐야겠습니다.

화면에 버튼이 4개 있습니다. 각 버튼을 누르면 버튼의 색상이 달라지는 기능을 만들어야 합니다.

그럼 어떻게 만들어야 할까요?

 

1. 각 버튼마다 색상을 변하게 하는 스크립트(클래스)를 넣는다.

2. 모든 버튼을 배열에 저장 한 다음, 버튼을 누를 때 파라미터를 통해 배열에 있는 버튼과 대조, 색상변경.

3. 무슨 버튼을 눌렀는지 오브젝트 리턴 기능을 이용하여 해당 오브젝트 (버튼)의 색상을 변경한다.

등등... 많은 방법을 생각할 수 있지만, 효율과 스크립트의 간편화, 단순화를 생각해봐야겠지요.

 

3번 항목이 개인적으로 생각해 볼 때 가장 알맞은 방법인데, 오브젝트 리턴 기능을 어떻게 하느냐가 문제입니다.

 

답은 바로 EventSystem에 있습니다.


 

1. 현재 선택된 게임오브젝트 가져오기 (currentSelectedGameObject)

4개의 Ui 버튼을 준비합시다.

그다음 버튼 이벤트를 받을 빈 게임 오브젝트와 C#스크립트를 만들고 넣어봅시다. 여기서는 둘 다 'managerButton'이라고 이름 지었습니다.

 

앞서 알려드렸던 EventSystem을 스크립트를 통해 접근하려면 선언을 해주어야 합니다.

참고로, Ui를 생성하면 hierarchy에 EventSystem 게임오브젝트가 자동 생성됩니다.

버튼 색상도 바꾸어야 하기 때문에 UnityEngine.Ui도 같이 선언해주도록 하겠습니다.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

이렇게 선언해주었다면, 버튼을 눌렀을 때 입력받을 수 있도록 public 메소드를 만들어주고, 다음과 같이 입력하면, 어느 버튼을 눌렀는지 오브젝트를 리턴하는 기능을 아주 간단하게 구현할 수 있습니다.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class managerButton : MonoBehaviour
{
    Image btnImage;

    public void GetBtn ()
    {
        GameObject tempBtn = EventSystem.current.currentSelectedGameObject;
        Debug.Log(tempBtn);
    }

}

저장을 하고 이제 각 버튼의 OnClick 이벤트를 하나 추가하고 managerButton과 연결 후 이벤트도 설정해 줍시다.

On Click() 이벤트 설정

이제 실행을 하고 버튼을 눌러 디버그를 통해 오브젝트가 리턴이 잘 되는지 한번 보십시다.

어느 버튼을 눌렀는지 게임오브젝트에 저장되고 있습니다.

이렇게 단 한 줄 만에 어느 버튼을 눌렀는지 가능하게 만들었습니다. 그럼 이제 색상을 바꿔보도록 하지요.


 

2. 선택한 버튼(이미지) 색상 변경

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class managerButton : MonoBehaviour
{
    Image btnImage;

    public void GetBtn ()
    {
        GameObject tempBtn = EventSystem.current.currentSelectedGameObject;

        btnImage = tempBtn.GetComponent<Image>(); // 해당 오브젝트의 Image 컴포넌트를 받음
        btnImage.color = Color.blue; // 해당 이미지의 색상을 blue로 변경

        Debug.Log(tempBtn);
    }

}

실행 후 버튼을 눌러보면,

클릭한 버튼의 색상이 변경되는 것을 보실 수 있습니다.

버튼을 다시 흰색으로 돌리기 위해서는, 버튼들이 BtnGroup을 부모로 두고 있기 때문에 transform.GetChild(int)를 통해 구현하면 될 것 같네요.


 

3. 버튼(이미지) 색상 리셋

우선 버튼들의 부모를 가져올 GameObject 변수를 하나 만들고 Start()를 통해 가져오도록 해봅시다.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class managerButton : MonoBehaviour
{
    Image btnImage;
    GameObject btnParent; // 버튼들의 부모

    private void Start()
    {
        btnParent = GameObject.Find("BtnGroup").gameObject; // "부모의 이름"으로 찾습니다.
    }

 

부모도 찾았으니 이제 자식으로 둔 모든 버튼들을 찾아내어 하나씩 버튼의 색상을 White 색상으로 바꾸어 보겠습니다.

public void ResetBtnColor ()
    {
        int btnLength = btnParent.transform.childCount; // 자식의 갯수를 파악
        for (int i=0; i < btnLength; i++ ) // 자식의 갯수 만큼 i++ 실행
        {
        	// transform.GetChild (i)를 통해 버튼을 하나씩 색인.
            GameObject tempBtns = btnParent.transform.GetChild(i).gameObject;
            // 해당 버튼 이미지 컴포넌트를 불러온 후 색상 변경.
            btnImage = tempBtns.GetComponent<Image>();
            btnImage.color = Color.white;

        }
    }

이제 색상 리셋 메소드를 실행할 버튼을 만들고 On Click() 이벤트를 설정해줍니다.

Reset Color 버튼을 만들었습니다!

 

실행을 하고 버튼 2개를 누른 후 Reset Color 버튼을 누르면,

모든 버튼의 색상이 백색으로 변경된 것을 보실 수 있습니다.

 

수고하셨습니다.

관련글 더보기

댓글 영역