Application.CaptureScreenshot() はシンプルでいいんですが、スクリーンキャプチャ画像が欲しいときは Application.CaptureScreenshot() では細かいところに手が届かないため基本的にその他の手段を使ったキャプチャコードを書くことになり急に難易度が上がります。
今回2つのキャプチャタイプの関数を紹介します。
1. カメラに映っているオブジェクトをキャプチャする
Cameraの Viewport Rect を変更した場合こちらのコードそのままではうまくいかなかったためところどころ書き直して別スクリプトから呼び出せるように変更しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using UnityEngine; using System.IO; public class Capture : MonoBehaviour { public enum Format { PNG, JPG }; public void Take(Camera targetCamera, string filePath, bool alpha, Format format = Format.PNG) { // camera size Vector2 min = targetCamera.ViewportToScreenPoint(Vector2.zero); Vector2 max = targetCamera.ViewportToScreenPoint(Vector2.one); int width = Mathf.CeilToInt(max.x - min.x); int height = Mathf.CeilToInt(max.y - min.y); int y = Screen.height - Mathf.FloorToInt(min.y + height); TextureFormat alphaFormat; if (alpha) alphaFormat = TextureFormat.RGBA32; else alphaFormat = TextureFormat.RGB24; // RenderTexture set RenderTexture renderTexture = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32); RenderTexture oldTargetTexture = targetCamera.targetTexture; RenderTexture oldActiveTexture = RenderTexture.active; targetCamera.targetTexture = renderTexture; targetCamera.Render(); RenderTexture.active = renderTexture; // set texture Texture2D texture2 = new Texture2D(width, height, alphaFormat, false); texture2.ReadPixels(new Rect(min.x, y, width, height), 0, 0); texture2.Apply(); // RenderTexture remove RenderTexture.active = oldActiveTexture; targetCamera.targetTexture = oldTargetTexture; RenderTexture.ReleaseTemporary(renderTexture); // save image if (format == Format.PNG) { filePath += ".png"; File.WriteAllBytes(filePath, texture2.EncodeToPNG()); } else { filePath += ".jpg"; File.WriteAllBytes(filePath, texture2.EncodeToJPG()); } } } |
2. カメラに映っている一部分を切り抜いてキャプチャする
Rectで指定した範囲をキャプチャしてくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; using System.IO; public class Capture : MonoBehaviour { public enum Format { PNG, JPG }; public void Take(Camera targetCamera, Rect rect, string filePath, bool alpha, Format format = Format.PNG) { // RenderTexture set RenderTexture renderTexture = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32); RenderTexture oldTargetTexture = targetCamera.targetTexture; RenderTexture oldActiveTexture = RenderTexture.active; targetCamera.targetTexture = renderTexture; targetCamera.Render(); RenderTexture.active = renderTexture; TextureFormat alphaFormat; if (alpha) alphaFormat = TextureFormat.RGBA32; else alphaFormat = TextureFormat.RGB24; // set texture Texture2D texture2 = new Texture2D(Mathf.CeilToInt(rect.width), Mathf.CeilToInt(rect.height), alphaFormat, false); texture2.ReadPixels(rect, 0, 0); texture2.Apply(); // RenderTexture remove RenderTexture.active = oldActiveTexture; targetCamera.targetTexture = oldTargetTexture; RenderTexture.ReleaseTemporary(renderTexture); // save image if (format == Format.PNG) { filePath += ".png"; File.WriteAllBytes(filePath, texture2.EncodeToPNG()); } else { filePath += ".jpg"; File.WriteAllBytes(filePath, texture2.EncodeToJPG()); } } } |
コメントを残す