官方的api可以直接获取预览图像,如下所示:

Tex=AssetPreview.GetAssetPreview(Object m)as Texture;

但是如果prefab是组合体的话(即一个prefab下包含2个或多个子物体),便只返回null。可以算是unity的一个bug吧。

所以需要自己写函数来实现prefab图像预览。

思路是将Prefab实例化到场景,并利用RenderTexture进行摄像机截取图像作为预览图像,代码如下:

         /// <summary>
/// 获取预览图象
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private Texture GetAssetPreview(GameObject obj)
{
GameObject clone = GameObject.Instantiate(obj);
Transform cloneTransform = clone.transform;
cloneTransform.position = new Vector3(-, -, -);
//cloneTransform.localRotation = new Quaternion(0, 0, 0, 1); Transform[] all = clone.GetComponentsInChildren<Transform>();
foreach (Transform trans in all)
{
trans.gameObject.layer = ;
} Bounds bounds = GetBounds(clone);
Vector3 Min = bounds.min;
Vector3 Max = bounds.max;
GameObject cameraObj = new GameObject("render camera");
cameraObj.transform.position = new Vector3(cloneTransform.position.x, (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); Camera renderCamera = cameraObj.AddComponent<Camera>();
renderCamera.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 1f);
renderCamera.clearFlags = CameraClearFlags.Color;
renderCamera.cameraType = CameraType.Preview;
renderCamera.cullingMask = << ;
int angle = (int)(Mathf.Atan2((Max.y - Min.y) / , (Max.z - Min.z)) * / 3.1415f * );
renderCamera.fieldOfView = angle; RenderTexture texture = new RenderTexture(, , , RenderTextureFormat.Default);
renderCamera.targetTexture = texture; renderCamera.RenderDontRestore(); RenderTexture tex = new RenderTexture(, , , RenderTextureFormat.Default);
Graphics.Blit(texture, tex); Object.DestroyImmediate(clone);
Object.DestroyImmediate(cameraObj); return tex;
}
/// <summary>
/// 获得某物体的bounds
/// </summary>
/// <param name="obj"></param>
private Bounds GetBounds(GameObject obj)
{
Vector3 Min = new Vector3(, , );
Vector3 Max = new Vector3(-, -, -);
MeshRenderer[] renders = obj.GetComponentsInChildren<MeshRenderer>();
for (int i = ; 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;
} Vector3 center = (Min + Max) / ;
Vector3 size = new Vector3(Max.x - Min.x, Max.y - Min.y, Max.z - Min.z);
return new Bounds(center, size);
}

后补:unity在2017.2版本已经修复了这个问题,可以放心用Tex=AssetPreview.GetAssetPreview(Object m)as Texture了。

感谢博友@跳出定向思维的发现,之前的unity旧版本也可以通过给prefab添加标签来解决问题,添加了任意标签后就可以使用自带的获取预览api了。

获取unity prefab的预览图像的更多相关文章

  1. Android Camera 预览图像被拉伸变形的解决方法【转】

    问题描述: 预览图像被拉伸变形 问题原因: 由于预览图像大小跟SurfaceView 大小不一致引起 解决方法: 获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再 ...

  2. 为Unity的新版ugui的Prefab生成预览图

    using UnityEngine;using System.Collections;using UnityEditor;using System.IO; [CustomPreview(typeof( ...

  3. js获取base64格式图片预览上传并用php保存到本地服务器指定文件夹

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  4. JS预览图像

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. JS预览图像将本地图片显示到浏览器上的代码

    js代码实现: 从file域获取本地图片url并将本地图片显示到浏览器上. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  6. JS预览图像将本地图片显示到浏览器上

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  7. Android平台之不预览获取照相机预览数据帧及精确时间截

    在android平台上要获取预览数据帧是一件极其容易的事儿,但要获取每帧数据对应的时间截并不那么容易,网络上关于这方面的资料也比较少.之所以要获取时间截,是因为某些情况下需要加入精确时间轴才能解决问题 ...

  8. Android Camera2获取预览尺寸和fps范围

    升降摄像头安卓手机刚上市的时候,有些很流行的app刚打开时,前置摄像头就升起来了.好像就是出来看一眼然后又收回去. 虽然我们不调用拍照功能,只是为了获取相机的信息,也是可能让摄像头升起来的. Came ...

  9. 【腾讯优测干货分享】Android 相机预览方向及其适配探索

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583ba1df25d735cd2797004d 由于Android系统的开放策略 ...

随机推荐

  1. 最新IP地址数据库Dat格式-高性能高并发版(2019年3月)

    最新IP地址数据库->Dat  二进制文件 高性能高并发-qqzeng-ip.dat 格式 全球IP数据库-20190301-Dat 版                国内IP数据库-20190 ...

  2. 新人补钙系列教程之:AS3事件处理--事件流

    一个flash应用程序可能会非常复杂,比如,有很多可视实例嵌套在一起,这样的话会形成一个树形结构,这个结构的根是stage,然后一级级到不同的实例,一般来说,要把这个树形结构倒过来看,即stage在顶 ...

  3. jstat命令的使用及VM Thread分析

    http://www.javatang.com/archives/2017/10/20/12131956.html 前面提到了一个使用jstack的shell脚本,通过命令可以很快地定位到指定线程对应 ...

  4. python读写文件write和flush

    打开文件用open,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式. file object = open(file_name [, access_mode][, buffering]) ...

  5. hdu 1030 Delta-wave(数学题+找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030 Delta-wave Time Limit: 2000/1000 MS (Java/Others ...

  6. hibernate学习系列-----(1)开发环境搭建

    其实一两个月前就在了解hibernate方面的知识了,但一直以来,都没有好好的总结,而且一直使用的是myeclipse,感觉有些傻瓜式的操作就可以搭建起hibernate的开发环境,但这样一点都不好, ...

  7. Java 二分法查找

    算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...

  8. [转]php-fpm配置具体解释

    [转]php-fpm配置具体解释 php-fpm具体解释 原文链接:http://php-fpm.anight.org/wiki:http://www.php-fpm.com/翻译:http://sy ...

  9. 设计模式——浅复制VS深复制

    背景 在学习原型模式的时候,採用了一个差别与其它模式的新方法.採用了"克隆(Clone)方法.通过实现ICloneable接口中的Clone()方法来达到克隆的目的. 代码实现过程中,存在了 ...

  10. 【Datastage】Datastage在win10上安装报错:This Application requires one of the following versions of the .NET Framework:v1.1.4322 Do you want to install this .NET Framework version now?

    Datastage在win10上安装报错如下: 这个错误的意思是:.netFramWork的版本不符合要求,于是,我在网上下载了一个版本一致的 下载地址为:http://pan.baidu.com/s ...