Generating a preview of the new view of the Unity of ugui Prefab (rpm)

2018.3 version of the new unity nested preform function, now preview inconvenient. You can generate a.

 

using UnityEngine; using System.Collections; using UnityEditor; using System.IO;
[CustomPreview(typeof(GameObject))] public class UIPreview : ObjectPreview { Texture preview;
const string cachePreviewPath = "CachePreviews";
public override bool HasPreviewGUI() { return true; }
public override void OnPreviewGUI(Rect r, GUIStyle background) { base.OnPreviewGUI(r, background); if (target == null) return;
var targetGameObject = target as GameObject;
if (targetGameObject == null) return;
GUI.Label(r, target.name + " is being previewed"); preview = AssetPreview.GetAssetPreview(target);
if (preview == null) { string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(targetGameObject));
string pathname = Path.Combine(cachePreviewPath, guid + ".png"); preview = AssetDatabase.LoadAssetAtPath<Texture2D>(Path.Combine("Assets",pathname)); if (preview == null) { preview = GetAssetPreview(targetGameObject);
if (SaveTexture2D(preview as Texture2D, Path.Combine(Application.dataPath, pathname))) { AssetDatabase.ImportAsset(pathname); AssetDatabase.Refresh(); Debug.Log("SaveTextureToPNG " + pathname); } } }
GUI.DrawTexture(r, preview); }
public static Texture GetAssetPreview(GameObject obj) { GameObject canvas_obj = null; GameObject clone = GameObject.Instantiate(obj); Transform cloneTransform = clone.transform;
GameObject cameraObj = new GameObject("render camera"); Camera renderCamera = cameraObj.AddComponent<Camera>(); renderCamera.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 1f); renderCamera.clearFlags = CameraClearFlags.Color; renderCamera.cameraType = CameraType.SceneView; renderCamera.cullingMask = 1 << 21; renderCamera.nearClipPlane = -100; renderCamera.farClipPlane = 100;
bool isUINode = false; if (cloneTransform is RectTransform) {// If it is, then the node UGUI put them under Canvas canvas_obj = new GameObject ( "render canvas ", typeof (Canvas)); Canvas canvas = canvas_obj.GetComponent <Canvas> (); cloneTransform.parent = canvas_obj.transform; cloneTransform.localPosition = Vector3.zero; //canvas_obj.transform.position = new Vector3 (-1000, -1000, -1000); canvas_obj.layer = 21; / / layer 21 on the camera only render this layer, a strange thing to avoid mixing RenderMode.ScreenSpaceCamera = canvas.renderMode; canvas.worldCamera = renderCamera;
isUINode = to true;} = cloneTransform.position the else new new Vector3 (-1000, -1000, -1000);
the Transform [] = clone.GetComponentsInChildren All <the Transform> (); the foreach (in the Transform All Trans) = {21 is trans.gameObject.layer;}
bounds bounds = GetBounds (clone); Min = bounds Vector3 .min; Vector3 Max = bounds.max;

if (isUINode) { cameraObj.transform.position = new Vector3(0, 0, -10); //Vector3 center = new Vector3(cloneTransform.position.x, (Max.y + Min.y) / 2f, cloneTransform.position.z); cameraObj.transform.LookAt(Vector3.zero);
renderCamera.orthographic = true; float width = Max.x - Min.x; float height = Max.y - Min.y; float max_camera_size = width > height ? width : height; renderCamera.orthographicSize = max_camera_size / 2;//预览图要尽量少点空白 } else { cameraObj.transform.position = new Vector3((Max.x + Min.x) / 2f, (Max.y + Min.y) / 2f, Max.z + (Max.z - Min.z)); Vector3 center = new Vector3(cloneTransform.position.x, (Max.y + Min.y) / 2f, cloneTransform.position.z); cameraObj.transform.LookAt(center);
int angle = (int)(Mathf.Atan2((Max.y - Min.y) / 2, (Max.z - Min.z)) * 180 / 3.1415f * 2); renderCamera.fieldOfView = angle; } RenderTexture texture = new RenderTexture(128, 128, 0, RenderTextureFormat.Default); renderCamera.targetTexture = texture;
var tex = RTImage(renderCamera);
Object.DestroyImmediate(canvas_obj); Object.DestroyImmediate(cameraObj);
return tex; }
static Texture2D RTImage(Camera camera) { // The Render Texture in RenderTexture.active is the one // that will be read by ReadPixels. var currentRT = RenderTexture.active; RenderTexture.active = camera.targetTexture;
// Render the camera's view. //camera.Render();
camera.Render(); // Make a new texture and read the active Render Texture into it. Texture2D image = new Texture2D(camera.targetTexture.width, camera.targetTexture.height); image.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0); image.Apply();
// Replace the original active Render Texture. RenderTexture.active = currentRT; return image; }
public static Bounds GetBounds(GameObject obj) { Vector3 Min = new Vector3(99999, 99999, 99999); Vector3 Max = new Vector3(-99999, -99999, -99999); MeshRenderer[] renders = obj.GetComponentsInChildren<MeshRenderer>(); if (renders.Length > 0) { for (int i = 0; i < renders.Length; i++) { if (renders[i].bounds.min.x < Min.x) Min.x = renders[i].bounds.min.x; if (renders[i].bounds.min.y < Min.y) Min.y = renders[i].bounds.min.y; if (renders[i].bounds.min.z < Min.z) Min.z = renders[i].bounds.min.z;
if (renders [i] .bounds.max.x> Max.x) Max.x = renders [i] .bounds.max.x; if (renders [i] .bounds.max.y> Max.y) Max .y = renders [i] .bounds.max.y; if (renders [i] .bounds.max.z> Max.z) Max.z = renders [i] .bounds.max.z;}} else { RectTransform [] rectTrans = obj.GetComponentsInChildren <RectTransform > (); Vector3 [] corner = new Vector3 [4]; for (int i = 0; i <rectTrans.Length; i ++) {// Get the node of the four corners world coordinates, respectively, in order to lower left upper left, upper right lower rectTrans [i] .GetWorldCorners (corner) ; if (corner [0] .x <Min.x) Min.x = corner [0] .x; if (corner [0] .y <Min.y) corner Min.y = [0] .y; IF (corner [0] .Z <Min.z) corner Min.z = [0] .Z;
IF (corner [2 ] .x> Max.x) Max.x = corner [2] .x; if (corner [2] .y> Max.y) Max.y = corner [2] .y; if (corner [2]. z> Max.z) Max.z = corner [ 2] .z;}}
Vector3 center = (Min + Max) / 2; Vector3 size = new Vector3(Max.x - Min.x, Max.y - Min.y, Max.z - Min.z); return new Bounds(center, size); }
public static bool SaveTextureToPNG(Texture inputTex, string save_file_name) { RenderTexture temp = RenderTexture.GetTemporary(inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32); Graphics.Blit(inputTex, temp); bool ret = SaveRenderTextureToPNG(temp, save_file_name); RenderTexture.ReleaseTemporary(temp); return ret; }
public static bool SaveTexture2D(Texture2D png, string save_file_name) { byte[] bytes = png.EncodeToPNG(); string directory = Path.GetDirectoryName(save_file_name); if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); FileStream file = File.Open(save_file_name, FileMode.Create); BinaryWriter writer = new BinaryWriter(file); writer.Write(bytes); file.Close();
return true; }
//将RenderTexture保存成一张png图片  public static bool SaveRenderTextureToPNG(RenderTexture rt, string save_file_name) { RenderTexture prev = RenderTexture.active; RenderTexture.active = rt; Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false); png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); byte[] bytes = png.EncodeToPNG(); string directory = Path.GetDirectoryName(save_file_name); if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); FileStream file = File.Open(save_file_name, FileMode.Create); BinaryWriter writer = new BinaryWriter(file); writer.Write(bytes); file.Close(http://www.my516.com); Texture2D.DestroyImmediate(png); png = null; RenderTexture.active = prev; return true; }
}

Guess you like

Origin www.cnblogs.com/strugglerisnd/p/10989769.html