Practice_Unity/Assets/Scripts/Managers/UIManager.cs
Seonkyu.kim 4fa0e67c42 작업
1. UI 모듈화 진행 중
 - 버튼이라는거 하나로 모든 버튼 동작을 하게 하려는데 다중 등록이 잘 안되는 문제가 있음
2025-10-13 18:00:21 +09:00

102 lines
3.1 KiB
C#

using System.Collections.Generic;
using JetBrains.Annotations;
using UnityEngine;
using UnityEngine.Events;
public class UIManager : IManager
{
private Canvas _canvas;
private List<string> _uiList = new ();
public List<string> UIList
{
get { return _uiList; }
set
{
_uiList = value ?? new List<string>();
foreach (var ui in _uiList)
{
string path = Define.MapPath(ui);
CreateObject(path, ui);
}
}
}
private readonly Dictionary<string, GameObject> _objects = new ();
private readonly Dictionary<string, GameObject> _instances = new();
private readonly Dictionary<string, bool> _switchObjects = new ();
public void Init()
{
_canvas = GameObject.Find("@Canvas").GetComponent<Canvas>();
}
private void CreateObject(string path, string prefabName)
{
GameObject createObj = Manager.Resource.Load<GameObject>(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<T>(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<T>();
if (action != null && component is UIButton button) button.Bind(action);
return component;
}
#region UI Object
#region ExpBar
public void ExclusiveExpBar()
{
PlayerController player = GameObject.FindObjectOfType<PlayerController>();
if (player != null)
{
player.OnExpChanged -= UpdateExpBar;
player.OnExpChanged += UpdateExpBar;
}
}
private void UpdateExpBar(int level, float currentExp, float maxExp)
{
ExpBar expBar = _instances["ExpBar"].GetComponent<ExpBar>();
expBar.UpdateValue(level, currentExp, maxExp);
}
#endregion
#endregion
}