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