using System.Collections.Generic; using JetBrains.Annotations; using UnityEngine; using UnityEngine.Events; public class UIManager : IManager { private Canvas _canvas; private List _uiList = new (); public List UIList { get { return _uiList; } set { _uiList = value ?? new List(); foreach (var ui in _uiList) { string path = Define.MapPath(ui); CreateObject(path, ui); } } } private readonly Dictionary _objects = new (); private readonly Dictionary _instances = new(); private readonly Dictionary _switchObjects = new (); public void Init() { _canvas = GameObject.Find("@Canvas").GetComponent(); } private void CreateObject(string path, string prefabName) { GameObject createObj = Manager.Resource.Load(path); // GameObject createObj = Manager.Resource.Instantiate(path, _canvas.transform); if (createObj != null) { // string objName = createObj.name; // if (objName != prefabName) objName = prefabName; // createObj.name = objName; _objects.Add(prefabName, createObj); _switchObjects.Add(prefabName, false); } } public T SwitchOnObject(string name, bool isOn, UnityAction action = null) where T : MonoBehaviour { if (_switchObjects.ContainsKey(name) && (_switchObjects[name] != isOn)) _switchObjects[name] = isOn; else return null; GameObject instance; if (!_instances.ContainsKey(name)) { // GameObject obj = Manager.Resource.Instantiate(_objects[name], _canvas.transform); // _instances.Add(name, obj); instance = Manager.Resource.Instantiate(_objects[name], _canvas.transform); _instances.Add(name, instance); } else instance = _instances[name]; if (_switchObjects.ContainsKey(name) && _switchObjects[name]) { instance.SetActive(true); // _objects[name].SetActive(true); } else { instance.SetActive(false); // _objects[name].SetActive(false); } T component = instance.GetComponent(); if (action != null && component is UIButton button) button.Bind(action); return component; } #region UI Object 특화 메서드 #region ExpBar 메서드 public void ExclusiveExpBar() { PlayerController player = GameObject.FindObjectOfType(); if (player != null) { player.OnExpChanged -= UpdateExpBar; player.OnExpChanged += UpdateExpBar; } } private void UpdateExpBar(int level, float currentExp, float maxExp) { ExpBar expBar = _instances["ExpBar"].GetComponent(); expBar.UpdateValue(level, currentExp, maxExp); } #endregion #endregion }