天天看点

PreviewRenderUtility的Example

用PreviewRenderUtility就不用自己再去创建摄像机来做模型在Editor下的预览了

需要注意,默认是用场景天空盒和场景灯光。参考ShaderForge编辑器的做法,配置自定义灯光

这些Unity都有提供接口,不用自己再去创建

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditorInternal;

public class Foo : EditorWindow
{
    Mesh mPreviewMesh;
    Material mPreviewMaterial;
    PreviewRenderUtility mPreviewRenderUtility;


    [MenuItem("Tools/Foo")]
    static void Setup()
    {
        GetWindow<Foo>();
    }

    void OnGUI()
    {
        if (mPreviewRenderUtility == null)
        {
            mPreviewRenderUtility = new PreviewRenderUtility();
            mPreviewRenderUtility.m_Camera.farClipPlane = 500;
            mPreviewRenderUtility.m_Camera.clearFlags = CameraClearFlags.SolidColor;
            mPreviewRenderUtility.m_Camera.transform.position = new Vector3(0, 0, -10);

            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var meshFilter = go.GetComponent<MeshFilter>();
            mPreviewMesh = meshFilter.sharedMesh;
            mPreviewMaterial = go.GetComponent<MeshRenderer>().sharedMaterial;

            DestroyImmediate(go);
        }

        var drawRect = new Rect(0, 0, 100, 100);
        mPreviewRenderUtility.BeginPreview(drawRect, GUIStyle.none);

        InternalEditorUtility.SetCustomLighting(mPreviewRenderUtility.m_Light, new Color(0.6f, 0.6f, 0.6f, 1f));

        mPreviewRenderUtility.DrawMesh(mPreviewMesh, Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(30, 45, 0), Vector3.one), mPreviewMaterial, 0);

        mPreviewRenderUtility.m_Camera.Render();
        var texture = mPreviewRenderUtility.EndPreview();

        InternalEditorUtility.RemoveCustomLighting();

        GUI.Box(drawRect, texture);
    }
}      

效果:

PreviewRenderUtility的Example

天空盒的话可以自行配置一个带Cubemap的shader:

PreviewRenderUtility的Example