- 렌더 패스 기반 블렌딩 제거 (CameraBlendRendererFeature, CameraBlend.shader) - UI RawImage 기반 CameraBlendOverlay 추가 - 스냅샷/실시간 블렌딩 모두 UI 오버레이 방식으로 통합 - 메인 카메라의 실제 위치를 저장하여 화면 튀는 문제 수정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
127 lines
3.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|