using UnityEngine; using UnityEngine.UI; namespace Streamingle { /// /// 카메라 블렌딩용 UI 오버레이 /// RawImage 하나로 이전 카메라 화면을 표시하고 서서히 사라지게 함 /// public class CameraBlendOverlay : MonoBehaviour { private static CameraBlendOverlay instance; public static CameraBlendOverlay Instance => instance; private Canvas canvas; private RawImage rawImage; private CanvasGroup canvasGroup; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); return; } instance = this; DontDestroyOnLoad(gameObject); SetupUI(); } private void SetupUI() { // Canvas 설정 canvas = gameObject.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 9999; // 최상단에 표시 // CanvasScaler 추가 (화면 크기 맞춤) var scaler = gameObject.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight; scaler.matchWidthOrHeight = 0.5f; // GraphicRaycaster는 추가하지 않음 (클릭 방해 안함) // RawImage 생성 GameObject imageObj = new GameObject("BlendImage"); imageObj.transform.SetParent(transform, false); rawImage = imageObj.AddComponent(); rawImage.raycastTarget = false; // 레이캐스트 비활성화 // 화면 전체를 덮도록 설정 RectTransform rectTransform = rawImage.rectTransform; rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; // CanvasGroup 추가 (알파 조절용) canvasGroup = imageObj.AddComponent(); canvasGroup.blocksRaycasts = false; canvasGroup.interactable = false; // 초기에는 숨김 Hide(); } /// /// 오버레이 표시 및 텍스처 설정 /// public void Show(RenderTexture texture) { if (rawImage == null) return; rawImage.texture = texture; rawImage.enabled = true; canvasGroup.alpha = 1f; } /// /// 알파값 설정 (0 = 투명, 1 = 불투명) /// public void SetAlpha(float alpha) { if (canvasGroup == null) return; canvasGroup.alpha = alpha; } /// /// 오버레이 숨김 /// public void Hide() { if (rawImage == null) return; rawImage.enabled = false; rawImage.texture = null; if (canvasGroup != null) { canvasGroup.alpha = 0f; } } /// /// 싱글톤 인스턴스 생성 (없으면 자동 생성) /// public static CameraBlendOverlay GetOrCreate() { if (instance != null) return instance; GameObject obj = new GameObject("CameraBlendOverlay"); return obj.AddComponent(); } private void OnDestroy() { if (instance == this) { instance = null; } } } }