Unity3D开发之设置模型显示在UI前面

    项目中我们会遇到类似这种需求,弹出一个小UI界面,我们可以在UI界面上看到我们的三维模型。对于广大Unity开发者都知道,unity引擎默认UI渲染在最上层。所以,想要实现这个功能需要我们自己去处理下。

    我这里提供了两个实现的方法。各有优缺点。根据自己的需求来选择。首先我们需要额外一个摄像机ModelCamera来专门渲染我们要显示的模型。我们设置模型的Layer层为Model,自己随便定义。然后在我们主相机上,设置Culling mask去掉Model层,如下图:

Unity3D开发之设置模型显示在UI前面_第1张图片

然后设置我们的另一个ModelCamera的Clear Flags为Depth Only。这个选项的含义是代表只渲染指定层级的物体。然后设置Culling mask在Model上勾选,其他全部取消勾选。这样代表此相机只渲染Model层的物体。如下图。好了,前戏结束了,下面是进入两个不同的方法了。

Unity3D开发之设置模型显示在UI前面_第2张图片

    方法一:

    我们使用一张 Render Texture将ModelCamera摄像机渲染到的东西保存下来,然后在UI上创建一个RawImage,将Render Texture附加到RawImage的Texture上。这里注意我们要设置Render Texture的属性,不然显示会有问题。Render Texture贴图设置如下:

Unity3D开发之设置模型显示在UI前面_第3张图片

以防我们显示的内容变形,我们要根据显示图片的大小设置Render Texture的Size。Size越大越清楚哦,但是同样耗费性能。这个方法的缺点是只能观看效果,并不能做一些鼠标与模型的互动。如果只是为了显示效果的可以选择此方法。

方法二:

下面这个方法的优点是我们可以做鼠标与模型的交互。我们知道三维空间想让UI显示在模型的后面只有使用世界Canvas。对,就是新建一个Canvas,将Canvas的RenderMode设置为WorldSpace模式。设置如下:

Unity3D开发之设置模型显示在UI前面_第4张图片

然后我们就是三维世界调UI的位置,这是耗时的操作,自己慢慢调。要设置显示在屏幕位置,就要调节ModelCamera的ViewRect。如果需要做交互,我们就可以让ModelCamera发射射线和模型做射线检测啦。很简单。以下为个人不确定观点:因为创建了两个Canvas,所以方法二性能消耗是高于方法一的。

    好了,以上是我在做项目时解决问题的方法,希望能帮助到你。如有疑问,欢迎留言交流。对于博客认为讲解不明之处,欢迎多多指导。

    如果本博客对你有帮助,记得点关注哦!

2018.7.11更新

上面说的第二种方法中,需要我们手动调UI位置以及ModelCamera的ViewRect。很费劲。今天看到一个非常不错的方法,可以指定我们摄像机渲染的图像到屏幕指定区域上。

 

就是这个API : Camera.pixelRect 

这个属性的设置类型是Rect。我们可以看到Rect的结构是(x,y,Xmax,Ymax)。所以假如我们想把渲染到的内容显示在屏幕中间位置,且显示的大小为100*100的正方形,代码如下:

modelCamera.pixelRect = new Rect(Screen.width/2-50,Screen.height/2-50,100,100);

2020.1.14更

方法一里设置rendertexture的方式并不是十分准确。设置成ARGB64在有些平台是不支持的。默认的格式是ARGB32,基本所有平台都支持,所以建议是使用ARGB32.但是会造成一个问题,在每次渲染后上一次渲染到贴图上的颜色没有去掉。导致每次渲染都填充到贴图中,渲染不正确。解决方案有两种:第一种选择输出renderTexture的camera的clear flag为Solid Color,并设置颜色透明度为0.第二种如果选择的clear flag为Depth Only 我们就需要些一个脚本来消除上一帧的颜色缓冲。

void OnPreRender()
    {
        //在摄像机渲染之前 清除贴图内容
        renderTexture.Release();
    }

所以可以看出camera的clear flag标签中,Skybox和Solid Color都是清除上一帧颜色缓冲的标签,而depth only和Dont clear都没有清除颜色缓冲的功能。

你可能感兴趣的:(Unity)