TG9six 03a642d635 first push
first push
2025-09-06 17:17:39 +04:00

133 lines
4.6 KiB
C#

#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>();
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<Camera>();
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<GameObject>()
.Where(obj => obj.transform.parent == null)
.ToArray();
}
GameObject[] allObjects = GetRootObjects();
GameObject prefabObject = null;
foreach (GameObject obj in allObjects)
{
if (obj.GetComponent<Camera>() == null && obj.GetComponent<Light>() == null)
{
prefabObject = obj;
break;
}
}
if (prefabObject != null)
{
string prefabName = prefabObject.name;
Debug.Log($"Found prefab: {prefabName}");
RenderPreview(prefabObject);
}
}
}
#endif