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
Coroutine
마무리하며..
HUD를 한 번에 끄고 켤 수 있는 기능을 만들어 둬서 이번 UI작업은 크게 어려움이 없었다.
이제 UI는 마무리되었다. 다음은 아마도 Item이나 Program에 관련된 것을 올리지 않을까 싶다.
'Unity > Hackers Window' 카테고리의 다른 글
[Unity] Item, ItemManager : (아이템, 인벤토리) (0) | 2024.11.27 |
---|---|
[Unity] PInformation, Program Manager : 버프/디버프 (0) | 2024.11.26 |
[Unity] UI 5, 7 - NetWork, Help (1) | 2024.11.24 |
[Unity] UI 6 : Control(환경설정 UI) (1) | 2024.11.23 |
[Unity] UI 3 : MyDocument(Inventory UI) (0) | 2024.11.22 |