UI中显示模型一般都两种方法,
1.直接把3d模型放到ui里面(要处理层级问题和适配问题)
2.把模型直接渲染到Rendertexture上面(层级基本不用处理适配就是框架里面的适配)
不是说把renderTexture就是好,一切看实际情况
例如你要做剧情对话,那些ui有变暗或者渐现效果,用renderTexture比较好处理这些效果
-----------------------------------------------------------------------------------------------------------------
现在有遇到难题多个模型渲染难道要我一个模型一个摄像机吗?当然这种操作不科学
所以写了个管理器用一个摄像机渲染多个模型
原理是手动调用摄像机渲染(每次渲染都设置层,渲染完就还原原来的层)
m_camera.Render();
效果如下图
下面是管理器完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public sealed class RenderTextureMgr : MonoBehaviour
{
public Camera m_camera { get; private set; }
public Light m_light { get; private set; }
private static RenderTextureMgr mgr;
public static RenderTextureMgr GetIns()
{
if (null == mgr)
{
GameObject go = new GameObject("RenderToTexture");
mgr = go.AddComponent<RenderTextureMgr>();
mgr.enabled = false;
mgr.Init();
}
return mgr;
}
/// <summary>
/// 初始化创建摄像机和灯光
/// </summary>
public void Init()
{
GameObject.DontDestroyOnLoad(gameObject);
m_camera = gameObject.AddComponent<Camera>();
m_camera.farClipPlane = 100;
m_camera.aspect = 1;
m_camera.clearFlags = CameraClearFlags.SolidColor;
m_camera.cullingMask = 1 << 5;
m_camera.backgroundColor = Color.clear;
m_camera.enabled = false;
m_camera.fieldOfView = 35;
m_camera.orthographic = false;
//m_camera.orthographicSize = 1;
m_camera.transform.position = new Vector3(-500, -500, -500);
m_light = gameObject.AddComponent<Light>();
m_light.type = LightType.Directional;
m_light.intensity = 1.25f;
m_light.cullingMask = 1 << 5;
}
public void Render(RenderTexture renderTexture, Transform target)
{
if (null == renderTexture || null == target)
{
return;
}
//获取所有render记录layer
Dictionary<Renderer, int> layerDict = new Dictionary<Renderer, int>();
Renderer[] children = target.GetComponentsInChildren<Renderer>();
for (int i = children.Length; --i >= 0;)
{
Renderer child = children[i];
layerDict[child] = child.gameObject.layer;
child.gameObject.layer = 5;
}
//设置renderTexture
m_camera.targetTexture = renderTexture;
//主动调用摄像机渲染(camera.enable = false都可以渲染)
m_camera.Render();
//还原渲染层
for (int i = children.Length; --i >= 0;)
{
Renderer child = children[i];
child.gameObject.layer = layerDict[child];
}
layerDict.Clear();
layerDict = null;
}
}
下面是测试脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestRender : MonoBehaviour
{
public RenderTexture rt;
public RawImage image;
private RenderTexture m_rt;
private void Awake()
{
m_rt = new RenderTexture(rt);
image.texture = m_rt;
}
private void Update()
{
RenderTextureMgr.GetIns().Render(m_rt, transform);
}
}
把测试脚本挂的模型上面,把ui上面的rawimage控件拖过去,把设置好的rendertexture拖过去就可以测试
测试设置如下图
最后附上工程
链接:https://pan.baidu.com/s/1WFRZ7QK5WSgXMY_YKyfanw
提取码:jme4
复制这段内容后打开百度网盘手机App,操作更方便哦