using System;
using UnityEngine;
using UnityEngine.UI;
///
/// 撮影画像のプレビュー用ダイアログ。
/// 「保存」か「シェア」を選んで実行する。
/// Resources/Canvas_preview.prefab のルートに付与して使う。
///
public class CanvasPreview : MonoBehaviour
{
[Header("プレビュー画像 (未設定なら子の RawImage を自動取得)")]
[SerializeField] private RawImage previewImage;
[Header("保存ボタン (未設定なら btn_save を自動取得)")]
[SerializeField] private Button saveButton;
[Header("シェアボタン (未設定なら btn_share を自動取得)")]
[SerializeField] private Button shareButton;
[Header("ポラロイド枠 (Frame.png を割り当て。未設定なら枠なし全画面表示)")]
[SerializeField] private Sprite frameSprite;
[Header("写真を枠内いっぱいに切り抜く (OFF=写真全体を枠内に収める)")]
[SerializeField] private bool cropPhotoToFrame = true;
[Header("カード(枠)の表示領域。画面に対する余白の割合")]
[SerializeField] private float cardMarginX = 0.04f;
[SerializeField] private float cardTopAnchor = 0.97f;
[SerializeField] private float cardBottomAnchor = 0.20f;
private string filePath;
private Texture2D previewTexture;
private bool ownsTexture;
private string shareText;
private string shareSubject;
private bool actionRunning;
private Action onClosed;
///
/// プレハブを生成してプレビューを表示する。
///
/// 保存・共有する PNG ファイルのパス
/// プレビュー表示用テクスチャ
/// true ならダイアログを閉じる時に texture を破棄する
/// ダイアログが閉じた時に呼ばれるコールバック
/// 使用するプレハブ。null なら Resources/Canvas_preview を読み込む
public static CanvasPreview Show(
string filePath,
Texture2D texture,
string shareText,
string shareSubject,
bool ownsTexture = true,
Action onClosed = null,
GameObject prefab = null)
{
GameObject source = prefab;
if (source == null)
{
source = Resources.Load("Canvas_preview");
}
if (source == null)
{
Debug.LogError("CanvasPreview: Canvas_preview プレハブが見つかりません。");
return null;
}
GameObject instance = Instantiate(source);
CanvasPreview preview = instance.GetComponent();
if (preview == null)
{
Debug.LogError("CanvasPreview: プレハブに CanvasPreview コンポーネントがありません。");
Destroy(instance);
return null;
}
preview.Setup(filePath, texture, shareText, shareSubject, ownsTexture, onClosed);
return preview;
}
private void Awake()
{
ResolveReferences();
}
private void ResolveReferences()
{
if (previewImage == null)
{
previewImage = GetComponentInChildren(true);
}
if (saveButton == null)
{
saveButton = FindOrAddButton("btn_save");
}
if (shareButton == null)
{
shareButton = FindOrAddButton("btn_share");
}
}
private Button FindOrAddButton(string targetName)
{
Transform target = FindDeep(transform, targetName);
if (target == null)
{
Debug.LogWarning("CanvasPreview: " + targetName + " が見つかりません。");
return null;
}
// プレハブの btn_save / btn_share は Image だけで Button が無いので補う
Button button = target.GetComponent