Скриншот с прозрачным фоном

Бывают ситуации, когда нужно сделать скриншот в процессе разработки, прямо в редакторе. Но, проблема в том, что если задействовать стандартные методы, тогда разрешение будет ограничено текущими настройками, как быть, если необходимо большее разрешение? Например, сделать снимок определенного участка карты в высоком разрешении, для последующей его обработке в графическом редакторе и затем, на данной основе строить миникарту. Либо если вы сделали какой-либо объект и хотите создать его иконку с прозрачным фоном. В этом случаи, надо отключить все остальные объекты на сцене, кроме целевого, выбрать соответствующую настройку в скрипте и готово.

Скрипт TransparentScreenshot вешаем на камеру:

using UnityEngine;
using System.Collections;

public class TransparentScreenshot : MonoBehaviour {

	[SerializeField] private Camera _camera;
	[SerializeField] private KeyCode key; // клавиша управления в игровом режиме
	[SerializeField] private int width = 1000;
	[SerializeField] private int height = 1000;
	[SerializeField] private bool isTransparent = true; // прозрачный фон или по умолчанию
	private byte[] bytes;

	string ScreenShotName()
	{
		return string.Format("{0}/screen_{1}x{2}_{3}.png", 
			Application.dataPath, 
			width, height, 
			System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
	}

	public void Screenshot()
	{
		if(isTransparent) _camera.clearFlags = CameraClearFlags.Depth;
		RenderTexture rt = new RenderTexture(width, height, 24);
		_camera.targetTexture = rt;
		Texture2D screenShot = new Texture2D(width, height, TextureFormat.ARGB32, false);
		_camera.Render();
		RenderTexture.active = rt;
		screenShot.ReadPixels(new Rect(0, 0, width, height), 0, 0);
		_camera.targetTexture = null;
		RenderTexture.active = null;
		#if UNITY_EDITOR
		DestroyImmediate(rt);
		#else
		Destroy(rt);
		#endif
		bytes = screenShot.EncodeToPNG();
		string filename = ScreenShotName();
		System.IO.File.WriteAllBytes(filename, bytes);
		Debug.Log("Создан скриншот: " + filename);
		#if UNITY_EDITOR
		DestroyImmediate(screenShot);
		#else
		Destroy(screenShot);
		#endif
		bytes = new byte[0];
	}

	void LateUpdate()
	{
		if(Input.GetKeyDown(key))
		{
			Screenshot();
		}
	}
}

Скриншоты будут сохраняться в папку Assets вашего проекта.



Чтобы делать скриншоты в редакторе, добавим кнопку в инспекторе:

#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(TransparentScreenshot))]

public class TransparentScreenshotEditor : Editor {

	public override void OnInspectorGUI()
	{
		DrawDefaultInspector();
		TransparentScreenshot t = (TransparentScreenshot)target;
		GUILayout.Label("Создать скриншот в инспекторе:", EditorStyles.boldLabel);
		if(GUILayout.Button("Take Screenshot"))
		{
			t.Screenshot();
		}
	}
}
#endif

Примечание:
Сделать снимок UI объектов можно в режиме Screen Space - Camera или World Space.

Скачать демо:
Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 1

Офлайн
Revan_Matrix 20 августа 2019
Очень помогло с проектом
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика