user 5087ebc5af Refactor: 카메라 블렌딩을 UI 오버레이 방식으로 변경
- 렌더 패스 기반 블렌딩 제거 (CameraBlendRendererFeature, CameraBlend.shader)
- UI RawImage 기반 CameraBlendOverlay 추가
- 스냅샷/실시간 블렌딩 모두 UI 오버레이 방식으로 통합
- 메인 카메라의 실제 위치를 저장하여 화면 튀는 문제 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 09:52:41 +09:00

127 lines
3.8 KiB
C#

using UnityEngine;
using UnityEngine.UI;
namespace Streamingle
{
/// <summary>
/// 카메라 블렌딩용 UI 오버레이
/// RawImage 하나로 이전 카메라 화면을 표시하고 서서히 사라지게 함
/// </summary>
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>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.sortingOrder = 9999; // 최상단에 표시
// CanvasScaler 추가 (화면 크기 맞춤)
var scaler = gameObject.AddComponent<CanvasScaler>();
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>();
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>();
canvasGroup.blocksRaycasts = false;
canvasGroup.interactable = false;
// 초기에는 숨김
Hide();
}
/// <summary>
/// 오버레이 표시 및 텍스처 설정
/// </summary>
public void Show(RenderTexture texture)
{
if (rawImage == null) return;
rawImage.texture = texture;
rawImage.enabled = true;
canvasGroup.alpha = 1f;
}
/// <summary>
/// 알파값 설정 (0 = 투명, 1 = 불투명)
/// </summary>
public void SetAlpha(float alpha)
{
if (canvasGroup == null) return;
canvasGroup.alpha = alpha;
}
/// <summary>
/// 오버레이 숨김
/// </summary>
public void Hide()
{
if (rawImage == null) return;
rawImage.enabled = false;
rawImage.texture = null;
if (canvasGroup != null)
{
canvasGroup.alpha = 0f;
}
}
/// <summary>
/// 싱글톤 인스턴스 생성 (없으면 자동 생성)
/// </summary>
public static CameraBlendOverlay GetOrCreate()
{
if (instance != null) return instance;
GameObject obj = new GameObject("CameraBlendOverlay");
return obj.AddComponent<CameraBlendOverlay>();
}
private void OnDestroy()
{
if (instance == this)
{
instance = null;
}
}
}
}