Unity3d场景渲染出图

tech2022-10-05  86

制作了精美的场景,需要出图给同事使用,还在用QQ截图?那渣渣的画质,根本满足不了需求,现在好了,有了我们的ScreenshotTaker工具,帮你轻松解决这个问题。

请复制代码内容到脚本中,并置于Editor文件夹下。

//C# Example using UnityEditor; using UnityEngine; [ExecuteInEditMode] public class Screenshot : EditorWindow { int resWidth = Screen.width*4; int resHeight = Screen.height*4; public Camera myCamera; int scale = 1; string path = ""; bool showPreview = true; RenderTexture renderTexture; bool isTransparent = false; // Add menu item named "My Window" to the Window menu [MenuItem("Tools/Saad Khawaja/Instant High-Res Screenshot")] public static void ShowWindow() { //Show existing window instance. If one doesn't exist, make one. EditorWindow editorWindow = EditorWindow.GetWindow(typeof(Screenshot)); editorWindow.autoRepaintOnSceneChange = true; editorWindow.Show(); editorWindow.title = "Screenshot"; } float lastTime; void OnGUI() { EditorGUILayout.LabelField ("Resolution", EditorStyles.boldLabel); resWidth = EditorGUILayout.IntField ("Width", resWidth); resHeight = EditorGUILayout.IntField ("Height", resHeight); EditorGUILayout.Space(); scale = EditorGUILayout.IntSlider ("Scale", scale, 1, 15); EditorGUILayout.HelpBox("The default mode of screenshot is crop - so choose a proper width and height. The scale is a factor " + "to multiply or enlarge the renders without loosing quality.",MessageType.None); EditorGUILayout.Space(); GUILayout.Label ("Save Path", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(); EditorGUILayout.TextField(path,GUILayout.ExpandWidth(false)); if(GUILayout.Button("Browse",GUILayout.ExpandWidth(false))) path = EditorUtility.SaveFolderPanel("Path to Save Images",path,Application.dataPath); EditorGUILayout.EndHorizontal(); EditorGUILayout.HelpBox("Choose the folder in which to save the screenshots ",MessageType.None); EditorGUILayout.Space(); //isTransparent = EditorGUILayout.Toggle(isTransparent,"Transparent Background"); GUILayout.Label ("Select Camera", EditorStyles.boldLabel); myCamera = EditorGUILayout.ObjectField(myCamera, typeof(Camera), true,null) as Camera; if(myCamera == null) { myCamera = Camera.main; } isTransparent = EditorGUILayout.Toggle("Transparent Background", isTransparent); EditorGUILayout.HelpBox("Choose the camera of which to capture the render. You can make the background transparent using the transparency option.",MessageType.None); EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField ("Default Options", EditorStyles.boldLabel); if(GUILayout.Button("Set To Screen Size")) { resHeight = (int)Handles.GetMainGameViewSize().y; resWidth = (int)Handles.GetMainGameViewSize().x; } if(GUILayout.Button("Default Size")) { resHeight = 1440; resWidth = 2560; scale = 1; } EditorGUILayout.EndVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField ("Screenshot will be taken at " + resWidth*scale + " x " + resHeight*scale + " px", EditorStyles.boldLabel); if(GUILayout.Button("Take Screenshot",GUILayout.MinHeight(60))) { if(path == "") { path = EditorUtility.SaveFolderPanel("Path to Save Images",path,Application.dataPath); Debug.Log("Path Set"); TakeHiResShot(); } else { TakeHiResShot(); } } EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); if(GUILayout.Button("Open Last Screenshot",GUILayout.MaxWidth(160),GUILayout.MinHeight(40))) { if(lastScreenshot != "") { Application.OpenURL("file://" + lastScreenshot); Debug.Log("Opening File " + lastScreenshot); } } if(GUILayout.Button("Open Folder",GUILayout.MaxWidth(100),GUILayout.MinHeight(40))) { Application.OpenURL("file://" + path); } if(GUILayout.Button("More Assets",GUILayout.MaxWidth(100),GUILayout.MinHeight(40))) { Application.OpenURL("https://www.assetstore.unity3d.com/en/#!/publisher/5951"); } EditorGUILayout.EndHorizontal(); if (takeHiResShot) { int resWidthN = resWidth*scale; int resHeightN = resHeight*scale; RenderTexture rt = new RenderTexture(resWidthN, resHeightN, 24); myCamera.targetTexture = rt; TextureFormat tFormat; if(isTransparent) tFormat = TextureFormat.ARGB32; else tFormat = TextureFormat.RGB24; Texture2D screenShot = new Texture2D(resWidthN, resHeightN, tFormat,false); myCamera.Render(); RenderTexture.active = rt; screenShot.ReadPixels(new Rect(0, 0, resWidthN, resHeightN), 0, 0); myCamera.targetTexture = null; RenderTexture.active = null; byte[] bytes = screenShot.EncodeToPNG(); string filename = ScreenShotName(resWidthN, resHeightN); System.IO.File.WriteAllBytes(filename, bytes); Debug.Log(string.Format("Took screenshot to: {0}", filename)); Application.OpenURL(filename); takeHiResShot = false; } EditorGUILayout.HelpBox("In case of any error, make sure you have Unity Pro as the plugin requires Unity Pro to work.",MessageType.Info); } private bool takeHiResShot = false; public string lastScreenshot = ""; public string ScreenShotName(int width, int height) { string strPath=""; strPath = string.Format("{0}/screen_{1}x{2}_{3}.png", path, width, height, System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")); lastScreenshot = strPath; return strPath; } public void TakeHiResShot() { Debug.Log("Taking Screenshot"); takeHiResShot = true; } }

使用方法,非常的简单,不需要动脑,看图吧。

看完教程,亲自动手实践吧。

最新回复(0)