#nullable enable using UnityEngine; using UnityEngine.UI; namespace UVC.Util { public static class CanvasUtil { /// /// 월드 공간에서 캔버스 공간으로 점을 변환합니다. /// /// 월드 공간에서의 위치입니다. /// 변환할 캔버스입니다. /// 캔버스 공간에서의 위치입니다. 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); } /// /// 지정된 이름과 부모 캔버스(선택 사항)를 사용하여 새 인스턴스를 만듭니다. /// /// 부모 캔버스를 지정하지 않으면 새 캔버스는 기본적으로 로 설정됩니다. /// 새 캔버스 객체에 지정할 이름입니다. null이거나 비어 있을 수 없습니다. /// 선택 사항인 부모 입니다. 제공된 경우, 새 캔버스는 부모의 위치, 회전 및 크기를 상속합니다. /// 선택 사항인 부모 입니다. 제공된 경우, 새 캔버스는 부모 캔버스의 렌더링 모드, /// 정렬 레이어 ID 및 정렬 순서를 상속하며, 정렬 순서는 1씩 증가합니다. /// 를 포함한 기본 구성 요소로 구성된 새 인스턴스입니다. 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.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(FindObjectsSortMode.None); canvas.sortingOrder = canvasList.Length + 1; } canvasObject.AddComponent(); canvasObject.AddComponent(); if(parent != null) canvas.transform.SetParent(parent, false); return canvas; } /// /// 객체를 이름으로 검색합니다. /// /// 이 메서드는 씬에 있는 모든 활성 객체를 검색합니다. /// 여러 캔버스의 이름이 같은 경우, 가장 먼저 발견된 일치하는 캔버스가 반환됩니다. /// 찾을 의 이름입니다. 이 매개변수는 대소문자를 구분합니다. /// 지정된 이름을 가진 객체이거나, /// 일치하는 캔버스가 없는 경우 을 반환합니다. public static Canvas? FindCanvasByName(string name) { var canvases = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None); foreach (var canvas in canvases) { if (canvas.name == name) { return canvas; } } return null; } } }