Unity Yakalama Ekran Görüntüsü Eğitimi

Bu yazıda Unity formatında oyun içi ekran görüntülerinin nasıl alınacağını göstereceğim.

  • yeni bir komut dosyası oluşturun, onu SC_ScreenAPI olarak adlandırın ve içine aşağıdaki kodu yapıştırın:

SC_ScreenAPI.cs

using UnityEngine;

public static class SC_ScreenAPI
{
    /// <summary>
    /// </summary>
    /// <param name="limitSize">If above 0, will make sure that the width and height of the captured image are equal or less than specified.</param>
    /// <returns>Returns a Texture2D.</returns>
    public static Texture2D CaptureScreen(int limitSize = 0)
    {
        //Create a texture the size of the screen, RGB24 format
        int width = Screen.width;
        int height = Screen.height;
        Texture2D screenshot = new Texture2D(width, height, TextureFormat.RGB24, false);
        //Read screen contents into the texture
        screenshot.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        screenshot.Apply();

        if (limitSize > 0)
        {
            screenshot = ScaleTexture(screenshot, limitSize);
        }

        return screenshot;
    }

    static Texture2D ScaleTexture(Texture2D source, int limitSize)
    {
        int width = source.width;
        int height = source.height;
        bool resize = false;

        if (limitSize > 0)
        {
            if (width > limitSize || height > limitSize)
            {
                int newWidth = 0;
                int newHeight = 0;

                float tmpRatio = (width * 1.000f) / (height * 1.000f);
                if (tmpRatio == 1)
                {
                    newWidth = limitSize;
                    newHeight = limitSize;
                }
                else
                {
                    if (tmpRatio > 1)
                    {
                        newWidth = limitSize;
                        newHeight = (int)(limitSize / tmpRatio);
                    }
                    else
                    {
                        newWidth = (int)(limitSize * tmpRatio);
                        newHeight = limitSize;
                    }
                }

                width = newWidth;
                height = newHeight;
                if(width > 0 && height > 0)
                {
                    resize = true;
                }
            }
        }

        if (resize)
        {
            Texture2D result = new Texture2D(width, height, source.format, true);
            Color[] rpixels = result.GetPixels(0);
            float incX = (1.0f / (float)width);
            float incY = (1.0f / (float)height);
            for (int px = 0; px < rpixels.Length; px++)
            {
                rpixels[px] = source.GetPixelBilinear(incX * ((float)px % width), incY * ((float)Mathf.Floor(px / width)));
            }
            result.SetPixels(rpixels, 0);
            result.Apply();
            return result;
        }

        return source;
    }
}

Nasıl kullanılır

  • Ekran, Texture2D değerini döndüren SC_ScreenAPI.CaptureScreen(); çağrılarak yakalanır.
  • İsteğe bağlı olarak, görüntünün ölçeğini küçültecek bir limitSize değeri sağlayabilirsiniz (eğer genişliği veya yüksekliği sınır değerinden büyükse).

NOT: SC_ScreenAPI.CaptureScreen() çağrılması; hataları önlemek için çerçevenin bitiminden sonra yapılması gerekir, bu nedenle onu IEnumerator içinde kullanın

SC_ScreenCaptureTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SC_ScreenCaptureTest : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        //Press Q to capture screenshot
        if (Input.GetKeyDown(KeyCode.Q))
        {
            StartCoroutine(CaptureScreen());
        }
    }

    IEnumerator CaptureScreen()
    {
        yield return new WaitForEndOfFrame();

        //Here is a captured screenshot
        Texture2D screenshot = SC_ScreenAPI.CaptureScreen();

        //And here is how you get a byte array of the screenshot, you can use it to save the image locally, upload it to server etc.
        byte[] bytes = screenshot.EncodeToPNG();
    }
}
  • SC_ScreenCaptureTest'i sahnedeki herhangi bir nesneye ekleyin ve ardından ekran görüntüsü yakalamak için Q'yu kullanın.
Önerilen Makaleler
Birlik FPS Sayacı
Birlik için 2D Yakın Dövüş Saldırısı Eğitimi
Varlık Mağazasındaki En İyi Birlik Varlıkları
Unity'de 2D Para Toplama
Unity için Geri Sayım Sayacı Eğitimi
Zone Controller Pro - Unity Varlık Mağazası Paketi
Unity'de Yeni HDRP Su Sistemi Nasıl Kullanılır?