Unity/Project : Cursed Treasure

팀프 21.07.29. Unity UGUI - 클래스 선택

HappyFrog 2021. 7. 30. 10:07

위 사진과 같이 선택한 클래스에만 체크표시가 뜨게하려 했다.

거기에 더해 자동화를 구현하여 후에 캐릭터볼륨이 줄거나 늘더라도 인스펙터창에서 수정할 수 있도록 구현했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIClassItem : MonoBehaviour
{
    public Transform parent;
    public Button btnSelect;
    public Image imgSelect;
  
    public void Init(GameObject model)
    {
        GameObject go = Instantiate(model, this.parent);          
    }

    public void Deselect()
    {
        this.imgSelect.gameObject.SetActive(false);
    }

    public void Select()
    {
        this.imgSelect.gameObject.SetActive(true);
    }
}
  • 우선 UIClassItem이다. 
  • 클래스 한 칸 단위를 뜻하는데, 해당 오브젝트는 Init을 할 때 전달받은 게임오브젝트를 생성시키며 

  • 이런 모습을 만들어 진다.
  • 그리고 체크표시가 활성화되고 체크표시를 비활성시키는 기능이 담겼다.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIClass : MonoBehaviour
{
    public Button btnClose;
    public List<GameObject> prefabUIHunterList;
    public List<GameObject> prefabUIGuardianList;
    public GameObject prefabUIClassItem;

    public Transform parentHunter;
    public Transform parentGuardian;
    List<UIClassItem> uiHunterItemList;
    List<UIClassItem> uiGuardianItemList;
    
    public void Init() 
    {
        uiHunterItemList = new List<UIClassItem>();
        uiGuardianItemList = new List<UIClassItem>();
        for(int i = 0; i < prefabUIHunterList.Count; i++)
        {
            GameObject modelHunter = this.prefabUIHunterList[i];            
            GameObject go = Instantiate(this.prefabUIClassItem, parentHunter);
            UIClassItem uiClassHunterItem = go.GetComponent<UIClassItem>();
            uiHunterItemList.Add(uiClassHunterItem);
            uiClassHunterItem.Init(modelHunter);
            uiClassHunterItem.btnSelect.onClick.AddListener(() =>
            {
                Debug.Log(modelHunter.name);
                DeselectAllHunters();
                uiClassHunterItem.Select();
            });
        }        
        
        for(int i = 0; i < prefabUIGuardianList.Count; i++)
        {
            GameObject modelGuardian = this.prefabUIGuardianList[i];
            GameObject go = Instantiate(this.prefabUIClassItem, parentGuardian);
            UIClassItem uiClassGuardianItem = go.GetComponent<UIClassItem>();
            uiGuardianItemList.Add(uiClassGuardianItem);
            uiClassGuardianItem.Init(modelGuardian);
            uiClassGuardianItem.btnSelect.onClick.AddListener(() =>
            {
                Debug.Log(modelGuardian.name);
                DeselectAllGuardians();
                uiClassGuardianItem.Select();
            });
        }
    }

    void DeselectAllHunters()
    {
        foreach(UIClassItem uiClassItem in uiHunterItemList)
        {
            uiClassItem.Deselect();
        }
    }

    void DeselectAllGuardians()
    {
        foreach(UIClassItem uiClassItem in uiGuardianItemList)
        {
            uiClassItem.Deselect();
        }
    }    
}
  • 해당 UIClassItem들을 총괄적으로 관리하는 UIClass스크립트에서는 TreasureHunter와 Guardian라는 두 가지 진영의 캐릭터들을 각기 다른 줄에서 스크롤 시키기 위해서 생성되는 위치와 프리팹 등을 모두 각각 사용하였다.
  • prefabUIHunterList와 prefabUIGuardianList를 통해 생성하고 싶은 캐릭터들을 인스펙터로 할당받을 수 있으며
  • List의 Count만큼 반복문을 실행하며 UIClassItem을 생성한다.
  • 생성된 UIClassItem은 List의 인덱스를 따라 차례대로 캐릭터UI를 할당받으며
  • 생성된 UI들을 List에 저장해둔다.
  • 그리고 선택을 하게되면 리스트에 존재하는 모든 UI들의 체크를 해제하고 자신의 체크를 활성화시킨다.