#if UNITY_EDITOR using UnityEditor; using UnityEngine; using System.IO; using System.Linq; using UnityEditor.SearchService; public class AssetPreviewSaver : MonoBehaviour { [MenuItem("Tools/Save Asset Previews")] private static void SaveAssetPreviews() { string path = "Assets/AssetPreviews"; if (!Directory.Exists(path)) Directory.CreateDirectory(path); foreach (var obj in Selection.objects) { Texture2D preview = AssetPreview.GetAssetPreview(obj); if (preview != null) { byte[] bytes = preview.EncodeToPNG(); File.WriteAllBytes($"{path}/{obj.name}_Preview.png", bytes); } else { Debug.LogWarning($"No preview available for {obj.name}"); } } AssetDatabase.Refresh(); Debug.Log("Asset previews saved to " + path); } [MenuItem("Tools/Save High Quality Asset Previews")] private static void SaveHighQualityPreviews() { string path = "Assets/Resources/Prefabs/Item/Preview"; if (!Directory.Exists(path)) Directory.CreateDirectory(path); foreach (var obj in Selection.objects) { GameObject prefab = obj as GameObject; if (prefab == null) continue; GameObject instance = Instantiate(prefab); instance.transform.localScale = new Vector3(3, 3, 3); Camera camera = new GameObject("PreviewCamera").AddComponent(); camera.backgroundColor = Color.clear; camera.clearFlags = CameraClearFlags.SolidColor; camera.orthographic = false; camera.fieldOfView = 60f; // Bounds bounds = CalculateBounds(instance); camera.transform.position = new Vector3(-0.981999993f,0.720000029f,0.717000008f); camera.transform.rotation = Quaternion.Euler(25.430006f,107.999992f,359.778992f); RenderTexture rt = new RenderTexture(1080, 1080, 24); camera.targetTexture = rt; Texture2D screenshot = new Texture2D(1080, 1080, TextureFormat.ARGB32, false); camera.Render(); RenderTexture.active = rt; screenshot.ReadPixels(new Rect(0, 0, 1080, 1080), 0, 0); screenshot.Apply(); byte[] bytes = screenshot.EncodeToPNG(); File.WriteAllBytes($"{path}/{obj.name}.png", bytes); // Clean up DestroyImmediate(instance); DestroyImmediate(camera.gameObject); RenderTexture.active = null; rt.Release(); } AssetDatabase.Refresh(); Debug.Log("High-quality previews saved to " + path); } [MenuItem("Tools/Render Prefab Preview")] private static void RenderPrefabPreviewFromScene() { static void RenderPreview(GameObject prefabObject) { Camera camera = FindObjectOfType(); if (camera == null) { return; } int resolution = 1080; RenderTexture rt = new RenderTexture(resolution, resolution, 24); camera.targetTexture = rt; camera.Render(); Texture2D screenshot = new Texture2D(resolution, resolution, TextureFormat.ARGB32, false); RenderTexture.active = rt; screenshot.ReadPixels(new Rect(0, 0, resolution, resolution), 0, 0); screenshot.Apply(); string path = $"Assets/Resources/Prefabs/Item/Preview/Sprite_{prefabObject.name}.png"; System.IO.File.WriteAllBytes(path, screenshot.EncodeToPNG()); camera.targetTexture = null; RenderTexture.active = null; DestroyImmediate(rt); AssetDatabase.Refresh(); Debug.Log($"Preview saved for {prefabObject.name} at {path}"); } static GameObject[] GetRootObjects() { return GameObject.FindObjectsOfType() .Where(obj => obj.transform.parent == null) .ToArray(); } GameObject[] allObjects = GetRootObjects(); GameObject prefabObject = null; foreach (GameObject obj in allObjects) { if (obj.GetComponent() == null && obj.GetComponent() == null) { prefabObject = obj; break; } } if (prefabObject != null) { string prefabName = prefabObject.name; Debug.Log($"Found prefab: {prefabName}"); RenderPreview(prefabObject); } } } #endif