81 lines
4.2 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|