-
Notifications
You must be signed in to change notification settings - Fork 1
3월3주차
김선영 edited this page Apr 2, 2025
·
20 revisions
25.03.26 카페공부
- 하늘: 유니티 version control 초대, Script 구조 설계
- 선영: lfs로 형상관리 공부, UI 제작중
Managers 클래스
싱글톤 패턴을 사용하여 다른 매니저 클래스들을 클래스 getter로 쉽게 호출할 수 있습니다. Init()함수로 유니티 내에 Managers스크립트를 포함한 게임오브젝트를 생성해 어디서든 쓸 수 있고 DontDestroyOnLoad()함수를 활용해 사라지는것을 방지합니다.
using UnityEngine;
public class Managers : MonoBehaviour
{
private static Managers s_instance;
private static Managers Instance { get { Init(); return s_instance; } }
#region Core
private DataManager _data = new DataManager();
private PoolManager _pool = new PoolManager();
private ResourceManager _resource = new ResourceManager();
private SceneManagerEx _scene = new SceneManagerEx();
private SoundManager _sound = new SoundManager();
private UIManager _ui = new UIManager();
public static DataManager Data { get { return Instance?._data; } }
public static PoolManager Pool { get { return Instance?._pool; } }
public static ResourceManager Resource { get { return Instance?._resource; } }
public static SceneManagerEx Scene { get { return Instance?._scene; } }
public static SoundManager Sound { get { return Instance?._sound; } }
public static UIManager UI { get { return Instance?._ui; } }
#endregion
public static void Init()
{
if (s_instance == null)
{
GameObject go = GameObject.Find("@Managers");
if (go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go);
// 초기화
s_instance = go.GetComponent<Managers>();
}
}
}
UI_Base 클래스
UI_Base를 상속한 객체는 제너릭으로 유니티엔진의 오브젝트면 자기 자신과 그 자식들까지 오브젝트 배열로 묶어 접근하기 쉽게 바인딩해주는 함수이고, 바인딩된 오브젝트들은 Getter로 불러올수있습니다.
using System.Collections.Generic;
using System;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UI_Base : InitBase
{
protected Dictionary<Type, UnityEngine.Object[]> _objects = new Dictionary<Type, UnityEngine.Object[]>();
private void Awake()
{
Init();
}
protected void Bind<T>(Type type) where T : UnityEngine.Object
{
string[] names = Enum.GetNames(type);
UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];
_objects.Add(typeof(T), objects);
for (int i = 0; i < names.Length; i++)
{
if (typeof(T) == typeof(GameObject))
objects[i] = Util.FindChild(gameObject, names[i], true);
else
objects[i] = Util.FindChild<T>(gameObject, names[i], true);
if (objects[i] == null)
Debug.Log($"Failed to bind({names[i]})");
}
}
protected void BindObjects(Type type) { Bind<GameObject>(type); }
protected void BindImage(Type type) { Bind<Image>(type); }
protected void BindTexts(Type type) { Bind<TMP_Text>(type); }
protected void BindButtons(Type type) { Bind<Button>(type); }
protected void BindToggles(Type type) { Bind<Toggle>(type); }
protected T Get<T>(int idx) where T : UnityEngine.Object
{
UnityEngine.Object[] objects = null;
if (_objects.TryGetValue(typeof(T), out objects) == false)
return null;
return objects[idx] as T;
}
protected GameObject GetObject(int idx) { return Get<GameObject>(idx); }
protected TMP_Text GetText(int idx) { return Get<TMP_Text>(idx); }
protected Button GetButton(int idx) { return Get<Button>(idx); }
protected Image GetImage(int idx) { return Get<Image>(idx); }
protected Toggle GetToggle(int idx) { return Get<Toggle>(idx); }
public static void BindEvent(GameObject go, Action<PointerEventData> action = null, Define.EUIEvent type = Define.EUIEvent.Click)
{
UI_EventHandler evt = Util.GetOrAddComponent<UI_EventHandler>(go);
switch (type)
{
case Define.EUIEvent.Click:
evt.OnClickHandler -= action;
evt.OnClickHandler += action;
break;
case Define.EUIEvent.PointerDown:
evt.OnPointerDownHandler -= action;
evt.OnPointerDownHandler += action;
break;
case Define.EUIEvent.PointerUp:
evt.OnPointerUpHandler -= action;
evt.OnPointerUpHandler += action;
break;
case Define.EUIEvent.Drag:
evt.OnDragHandler -= action;
evt.OnDragHandler += action;
break;
}
}
}
이 외 많은 클래스들이 기능을 추가하기 쉽도록 나름대로 프레임워크라고 불릴만한 객체지향적 UI 구조를 설계했습니다.
요구사항:
선영: version control 권한 관리자로 승급시켜주세요. (체크인이 안됨.) Spine 패키지 필요없어서 지우고 체크인 하려함
ㄴ 승급했습니다!
하늘: 나무 질감의 오목판 만들어주세요. 그리구 오목알두!!