Files
EnglewoodLAB/Assets/Scripts/UVC/Util/CanvasUtil.cs

81 lines
4.2 KiB
C#

#nullable enable
using UnityEngine;
using UnityEngine.UI;
namespace UVC.Util
{
public static class CanvasUtil
{
/// <summary>
/// 월드 공간에서 캔버스 공간으로 점을 변환합니다.
/// </summary>
/// <param name="worldPosition">월드 공간에서의 위치입니다.</param>
/// <param name="canvas">변환할 캔버스입니다.</param>
/// <returns>캔버스 공간에서의 위치입니다.</returns>
public static UnityEngine.Vector2 WorldToCanvasPosition(UnityEngine.Vector3 worldPosition, UnityEngine.Canvas canvas)
{
var screenPoint = UnityEngine.Camera.main.WorldToScreenPoint(worldPosition);
return UnityEngine.RectTransformUtility.PixelAdjustPoint(screenPoint, canvas.transform as UnityEngine.RectTransform, canvas);
}
/// <summary>
/// 지정된 이름과 부모 캔버스(선택 사항)를 사용하여 새 <see cref="Canvas"/> 인스턴스를 만듭니다.
/// </summary>
/// <remarks>부모 캔버스를 지정하지 않으면 새 캔버스는 기본적으로 <see
/// cref="RenderMode.ScreenSpaceOverlay"/>로 설정됩니다.</remarks>
/// <param name="name">새 캔버스 객체에 지정할 이름입니다. null이거나 비어 있을 수 없습니다.</param>
/// <param name="parent">선택 사항인 부모 <see cref="Transform"/>입니다. 제공된 경우, 새 캔버스는 부모의 위치, 회전 및 크기를 상속합니다.</param>
/// <param name="parentCanvas">선택 사항인 부모 <see cref="Canvas"/>입니다. 제공된 경우, 새 캔버스는 부모 캔버스의 렌더링 모드,
/// 정렬 레이어 ID 및 정렬 순서를 상속하며, 정렬 순서는 1씩 증가합니다.</param>
/// <returns> <see
/// cref="CanvasScaler"/> 및 <see cref="GraphicRaycaster"/>를 포함한 기본 구성 요소로 구성된 새 <see cref="Canvas"/> 인스턴스입니다.</returns>
public static Canvas GetOrCreate(string name, Transform? parent = null, Canvas? parentCanvas = null)
{
Canvas? canvas = FindCanvasByName(name);
if (canvas != null) return canvas!;
var canvasObject = new GameObject(name);
canvas = canvasObject.AddComponent<Canvas>();
canvas.renderMode = parentCanvas != null ? parentCanvas.renderMode : RenderMode.ScreenSpaceOverlay;
canvas.pixelPerfect = true;
if (parentCanvas != null)
{
canvas.sortingLayerID = parentCanvas.sortingLayerID;
canvas.sortingOrder = parentCanvas.sortingOrder + 1;
}
else
{
canvas.sortingLayerID = SortingLayer.NameToID("UI");
var canvasList = UnityEngine.Object.FindObjectsByType<Canvas>(FindObjectsSortMode.None);
canvas.sortingOrder = canvasList.Length + 1;
}
canvasObject.AddComponent<CanvasScaler>();
canvasObject.AddComponent<GraphicRaycaster>();
if(parent != null) canvas.transform.SetParent(parent, false);
return canvas;
}
/// <summary>
/// <see cref="Canvas"/> 객체를 이름으로 검색합니다.
/// </summary>
/// <remarks>이 메서드는 씬에 있는 모든 활성 <see cref="Canvas"/> 객체를 검색합니다.
/// 여러 캔버스의 이름이 같은 경우, 가장 먼저 발견된 일치하는 캔버스가 반환됩니다.</remarks>
/// <param name="name">찾을 <see cref="Canvas"/>의 이름입니다. 이 매개변수는 대소문자를 구분합니다.</param>
/// <returns>지정된 이름을 가진 <see cref="Canvas"/> 객체이거나,
/// 일치하는 캔버스가 없는 경우 <see langword="null"/>을 반환합니다.</returns>
public static Canvas? FindCanvasByName(string name)
{
var canvases = UnityEngine.Object.FindObjectsByType<Canvas>(FindObjectsSortMode.None);
foreach (var canvas in canvases)
{
if (canvas.name == name)
{
return canvas;
}
}
return null;
}
}
}