UI Canvas Setting
- UI 오브젝트를 인스턴화 할때 아용하는 방법입니다.
- 협업시 충돌을 줄이기 위해서 모든 인스턴스는 프리팹화 시키며, 이를 부를때 UI 속성을 가지고 있는 오브젝트는 꼭 Canvas가 있어야 하기 때문에 프리팹에 추가 하거나 미리 생성된 Canvas의 하위 오브젝트로 넣어야 정상적으로 사용이 가능합니다.
씬 오브젝트 인스턴스화
public void SetSceneUI<T>() where T : UI_Base
{
string sceneTypeName = typeof(T).Name;
T sceneUI = SetUI<T>(sceneTypeName);
sceneUI.transform.SetParent(UIBase.transform);
if (Enum.TryParse<SceneUtility.SceneName>(sceneTypeName, out var sceneEnum))
{
Main.Scene.CurrentScene = sceneEnum;
}
}
- UI_Base를 상속받는 오브젝트만 사용이 가능하며,
typeof(T).Name
을 이용하여 Scene의 이름을 받아올 수 있습니다.
private T SetUI<T>(string uiName) where T : Component
{
// TODO : 리소스 매니져 생성 시 수정 필요
GameObject uiObject = null;
// GameObject uiObject = Main.Resource.InstantiatePrefab(${name}.prefab);
switch (uiName)
{
case "Option_Popup":
{
uiObject = Instantiate(Main.Scene.optionPopup);
break;
}
case "Intro_UI":
{
uiObject = Instantiate(Main.Scene.introUI);
break;
}
}
return uiObject.GetOrAddComponent<T>();
}
- 리소스 매니져가 아직 개발 되지 않아 임시 프리팹으로 대체
- 인스턴스화 된 GameObject에
GetOrAddCompoenent<T>()
를 사용하여 만약 오브젝트에 해당 클래스의 스크립트 컴포넌트가 없다면 할당이 가능해진다
GetOrAddCompoenet<T
>();
namespace Unity.VisualScripting
{
public static class ComponentHolderProtocol
{
public static T GetOrAddComponent<T>(this UnityObject uo) where T : Component
{
return uo.GetComponent<T>() ?? uo.AddComponent<T>();
}
}
}
-
ComponentHolderProtocol
클래스에서 제공하는 메서드 이며, 해당 오브젝트의 컴포넌트가 있다면 컴포넌트를 반환, 만약 없다면T
컴포넌트를 Add 해주는 기능 - VisualScripting NameSpace 그룹의 메서드입니다.
- 하지만 UnityEngine 에서는 사용이 안되기 때문에 별도의 비슷한 메서드를 만들어 줍니다.
public static T GetAddComponent<T>(UnityEngine.Object obj) where T : Component
{
return obj.GetComponent<T>() ?? obj.AddComponent<T>();
}
public void OrderLayerToCanvas(GameObject uiObject, bool sort = true)
{
Canvas canvas = uiObject.GetOrAddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.overrideSorting = true;
SortingOder(canvas,sort);
CanvasScaler scales = canvas.GetOrAddComponent<CanvasScaler>();
scales.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scales.referenceResolution = new Vector2(1920, 1080);
canvas.referencePixelsPerUnit = 100;
}
private void SortingOder(Canvas canvas, bool sort)
{
if (sort)
{
canvas.sortingOrder = _sortByOrderLayer;
_sortByOrderLayer++;
}
else
{
canvas.sortingOrder = 0;
}
}
- 필요에 따라서는 ScaleMode, 해상도, sortOrder 를 조정하여 UI Layer 구성이 가능합니다.