[Unity] UI 8 : ProgramInstall

UI ProgramInstall

UI ProgramInstall의 역할

  • Program이 설치되는 UI를 제공해 준다.
  • 설치 진행 상황 Bar의 애니메이션이 랜덤 하게 나오도록 만들어준다.

 

필요한 변수들 선언

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

public class UI_8_ProgramInstall : MonoBehaviour
{
    private static UI_8_ProgramInstall instance = null;

    // UI Window
    public GameObject UI_W_ProgramInstall = null;

    // Detail
    public bool isESCDisabled = false;
    private int CurrentProgram;
    public bool FinishedInstall = false;

    public Image ProgramImage0;
    public Image ProgramImage1;
    public Image ProgramImage2;
    public Image ProgramImage3;

    public GameObject DownLoadUI0;
    public Button UI_0_Next;
    public Button UI_0_Exit;
    public Button UI_0_Cancel;

    public GameObject DownLoadUI1;
    public Button UI_1_Before;
    public Button UI_1_Exit;
    public Button UI_1_Next;
    public Button UI_1_Cancel;
    public Text UI_1_Info;

    public GameObject DownLoadUI2;
    public Animator DAnimator;

    public GameObject DownLoadUI3;
    public Button UI_3_Exit;
    public Button UI_3_End;

    public int CurrentUIIndex;

    // Manager
    private UI_0_HUD ui_0_HUD = null;
    private StatusManager statusManager = null;
    private PoolingManager poolingManager = null;

    public static UI_8_ProgramInstall Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<UI_8_ProgramInstall>();

                if (instance == null)
                {
                    GameObject singletonObject = new GameObject(typeof(UI_8_ProgramInstall).Name);
                    instance = singletonObject.AddComponent<UI_8_ProgramInstall>();
                    DontDestroyOnLoad(singletonObject);
                }
            }
            return instance;
        }
    }
    
    ...
}

 

용도가 복잡하지 않은 단순한 변수들이다.

현재 설치하는 프로그램을 UI에 연결시켜줘야 하기 때문에 각각의 요소들을 public으로 선언해 인스펙터 창에서 연결해 줬다.

 

기본 함수(Awake, Start, Update)

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

public class UI_8_ProgramInstall : MonoBehaviour
{
    ...

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        ui_0_HUD = UI_0_HUD.Instance;
        statusManager = StatusManager.Instance;
        poolingManager = PoolingManager.Instance;

        UI_0_Next.onClick.AddListener(FNextButton);
        UI_0_Cancel.onClick.AddListener(FDownLoadUIExit);
        UI_0_Exit.onClick.AddListener(FDownLoadUIExit);

        UI_1_Before.onClick.AddListener(FBeforeButton);
        UI_1_Next.onClick.AddListener(FNextButton);
        UI_1_Cancel.onClick.AddListener(FDownLoadUIExit);
        UI_1_Exit.onClick.AddListener(FDownLoadUIExit);

        UI_3_End.onClick.AddListener(FDownLoadUIExit);
        UI_3_Exit.onClick.AddListener(FDownLoadUIExit);
    }

    // Update is called once per frame
    void Update()
    {

    }
    
    ...
}

Awake()

싱글톤 인스턴스 설정과 씬 전환 시 객체를 유지하게 만들고, 현재 오브젝트가 기존 인스턴스와 다른 경우 파괴하도록 만들어줬다.

Start()

UI에 있는 버튼에 OnClick 이벤트 함수를 연결했다.

 

UI Active 관련 함수

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

public class UI_8_ProgramInstall : MonoBehaviour
{
    ...

    public void OpenUI()
    {
        if (UI_W_ProgramInstall != null)
        {
            UI_W_ProgramInstall.SetActive(true);
            ProgramInstallUI(0);
        }
    }

    public void CloseUI()
    {
        if (UI_W_ProgramInstall != null)
        {
            UI_W_ProgramInstall.SetActive(false);
        }
    }

    ...
}

UI 매니저에서 각각의 UI 요소들의 Active 상태를 제어하는 OpenUI, CloseUI 함수를 정의해  유지보수성을 높였다.

상태 변화를 제어하는 것을 이 함수들을 사용하는 것으로 한정해 불필요한 활성화/비활성화로 부작용을 방지하도록 만들었다.

 

UI 제어  함수

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

public class UI_8_ProgramInstall : MonoBehaviour
{
    ...

    private void ProgramInstallUI(int index)
    {
        isESCDisabled = true;
        CurrentUIIndex = index;
        switch (index)
        {
            case 0:
                Time.timeScale = 0.0f;
                DownLoadUI0.SetActive(true);
                ui_0_HUD.CloseUI();
                break;
            case 1:
                DownLoadUI1.SetActive(true);
                break;
            case 2:
                DownLoadUI2.SetActive(true);
                DAnimator.updateMode = AnimatorUpdateMode.UnscaledTime;
                StartCoroutine(PlayInstallAnimation());
                break;
            case 3:
                FinishedInstall = true;
                DownLoadUI3.SetActive(true);
                break;
            default:
                Debug.Log("Out of Index");
                break;
        }
    }

    private IEnumerator PlayInstallAnimation()
    {
        DAnimator.speed = 0.5f;
        Debug.Log("In Coroutine");
        int animationNum = Random.Range(0, 5);

        Debug.Log("Num : " + animationNum);
        float animationDuration = 2f;

        switch (animationNum)
        {
            case 0:
                DAnimator.SetTrigger("Bar_1");
                animationDuration = 6.0f;
                break;
            case 1:
                DAnimator.SetTrigger("Bar_2");
                animationDuration = 12.0f;
                break;
            case 2:
                DAnimator.SetTrigger("Bar_3");
                animationDuration = 13.0f;
                break;
            case 3:
                DAnimator.SetTrigger("Bar_4");
                animationDuration = 12.0f;
                break;
            case 4:
                DAnimator.SetTrigger("Bar_5");
                animationDuration = 6.0f;
                break;
            default:
                Debug.Log("Out of Index");
                break;
        }

        yield return new WaitForSecondsRealtime(animationDuration);

        DownLoadUI2.SetActive(false);
        ProgramInstallUI(CurrentUIIndex + 1);
    }
    
    ...
}

이 부분은 현재 순서에 맞춰서  UI를 띄워주고, 랜덤으로 선택된 애니메이션에 따라 플레이 시간을 기다리게 해주는 부분이다.

코루틴을 사용하여 대기하도록 만들었다.

 

버튼 컴포넌트 메서드

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

public class UI_8_ProgramInstall : MonoBehaviour
{
    ...

    public void FNextButton()
    {
        switch (CurrentUIIndex)
        {
            case 0:
                DownLoadUI0.SetActive(false);
                ProgramInstallUI(CurrentUIIndex + 1);
                break;
            case 1:
                DownLoadUI1.SetActive(false);
                ProgramInstallUI(CurrentUIIndex + 1);
                break;
            default:
                Debug.Log("Out of Index");
                break;
        }
    }

    public void FDownLoadUIExit()
    {
        switch (CurrentUIIndex)
        {
            case 0:
                DownLoadUI0.SetActive(false);
                break;
            case 1:
                DownLoadUI1.SetActive(false);
                break;
            case 3:
                DownLoadUI3.SetActive(false);
                break;
            default:
                Debug.Log("Out of Index");
                break;
        }
        ui_0_HUD.OpenUI();
        isESCDisabled = false;
        Time.timeScale = 1.0f;
        CloseUI();
    }

    public void FBeforeButton()
    {
        CurrentUIIndex = CurrentUIIndex - 1;
        DownLoadUI1.SetActive(false);
        DownLoadUI0.SetActive(true);
    }
}

버튼에 onclick 이벤트에 할당된 메서드들이다.

현재 순서에 맞춰서 다음 UI로 넘어가거나, UI를 닫는 것들을 제어하도록 만들었다.

 

참고 사항

UI Manager

https://gdoo.tistory.com/39

 

[Unity] UI Manager 구현

UI ManagerUI Manager 기본정보큰 UI의 틀이 있고 버튼을 통해 총 7개의 화면 전환이 있어야 한다.기본 정보를 보여주는 UI게임 기능인 프로그램의 정보를 띄워주는 UI인벤토리처럼 획득한 아이템 리스

gdoo.tistory.com

Coroutine

 

https://gdoo.tistory.com/20

 

[Unity] Unity에서 딜레이를 주는 방법

Unity에서 딜레이를 주는 방법현재 프로젝트에서 딜레이를 줘야 하는 상황이 많아 자세하게 공부했던 내용을 정리하고자 한다.유니티에서 딜레이를 주는 방법은 크게 5가지가 있다.Coroutine을

gdoo.tistory.com

 

마무리하며..

HUD를 한 번에 끄고 켤 수 있는 기능을 만들어 둬서 이번 UI작업은 크게 어려움이 없었다.

이제 UI는 마무리되었다. 다음은 아마도 Item이나 Program에 관련된 것을 올리지 않을까 싶다.