using System; using UnityEditor; using UnityEngine; namespace JBooth.MicroVerseCore.Browser { public class CaptureSceneView { private static bool updateBehaviour = false; /// /// Capture a screenshot of the sceneview /// public static Texture2D Capture( int width, int height) { Texture2D texture = null; Camera camera = SceneView.lastActiveSceneView.camera; // save data which we'll modify RenderTexture prevRenderTexture = RenderTexture.active; RenderTexture prevCameraTargetTexture = camera.targetTexture; bool prevCameraEnabled = camera.enabled; float prevFieldOfView = camera.fieldOfView; // create rendertexture int msaaSamples = 1; RenderTexture renderTexture = RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, msaaSamples); try { // make the enabled status optional. enabled = true works for hdrp. // it didn't work in older unity versions, we had enabled = false: // old info: // disabling the camera is important, otherwise you get e. g. a blurry image with different focus than the one the camera displays // see https://docs.unity3d.com/ScriptReference/Camera.Render.html // camera.enabled = false; camera.enabled = updateBehaviour; // set rendertexture into which the camera renders camera.targetTexture = renderTexture; // render a single frame camera.Render(); texture = CreateTexture2D(renderTexture); } catch (Exception ex) { Debug.LogError("Screenshot capture exception: " + ex); } finally { RenderTexture.ReleaseTemporary(renderTexture); // restore modified data RenderTexture.active = prevRenderTexture; camera.targetTexture = prevCameraTargetTexture; camera.enabled = prevCameraEnabled; camera.fieldOfView = prevFieldOfView; } return texture; } /// /// Create a Texture2D from a RenderTexture /// /// /// private static Texture2D CreateTexture2D(RenderTexture renderTexture) { Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.RGB24, false); RenderTexture prevRT = RenderTexture.active; { RenderTexture.active = renderTexture; texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture.Apply(); } RenderTexture.active = prevRT; return texture; } /// /// Create a texture with a random color /// /// /// /// /// private static Texture2D CreateRandomColorTexture(int width, int height) { Color randomColor = UnityEngine.Random.ColorHSV(); Texture2D texture = new Texture2D(width, height); var pixels = texture.GetPixels(); for (var i = 0; i < pixels.Length; ++i) { pixels[i] = randomColor; } texture.SetPixels(pixels); texture.Apply(); return texture; } } }