Unity Oyunlarınızdan Screenshot’lar Almak (Editör İçerisinden)

Yayınlandı: 08 Ağustos 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Yeniden merhabalar,

Zaman zaman, Unity içerisinde oyununuzdan hızlıca bir screenshot alma ihtiyacı duyabilirsiniz. Veya oyununuzun Google Play/App Store sayfası için farklı çözünürlüklerde birden çok screenshot almanız gerekebilir. Bu gibi durumlar için bir editör arayüzü yazdım ve bu derste de bu arayüzü paylaşacağım.

Link: https://gist.github.com/yasirkula/fba5c7b5280aa90cdb66a68c4005b52d

Kullanım detayları için yazının devamını okuyabilirsiniz…

Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) MultiScreenshotCapture adında yeni bir C# script oluşturmak ve script’in içeriğini linkteki kodla değiştirmek. Ardından Window-Multi Screenshot Capture ile, resimde gördüğünüz arayüze erişebilirsiniz.

Bu arayüz ile, aynı anda birden çok çözünürlükte screenshot alabilirsiniz. Bu çözünürlükleri Resolutions kısmına girebilirsiniz. Oradaki Current Resolution, kameranın mevcut çözünürlüğünde screenshot almanıza yarar. Resolution Multiplier ile, tüm çözünürlüklerin belli bir değerle çarpılmasını sağlayabilirsiniz (örneğin çözünürlüğün yarısı ebatlarında screenshot almak istiyorsanız, değerini 0.5 yapabilirsiniz).

Arayüzdeki diğer ayarlar ise şöyle:

  • Target Camera: değeri Game View olursa Game penceresinden screenshot alınır, yoksa Scene penceresinden screenshot alınır
  • Capture Overlay UI: eğer Render Mode‘u “Screen Space – Overlay” olan Canvas’larınızın da screenshot’ta gözükmesini istiyorsanız, bu seçeneği işaretleyin
  • Save as PNG: resmin PNG olarak mı JPEG olarak mı kaydedileceğini belirler
  • Allow transparent background: screenshot’ın arkaplanının saydam olmasını sağlar. Sadece Game penceresinden çekilen PNG screenshot’larda işe yarar. Saydam arkaplan için kameranızda post-processing olmamalı, “Clear Flags“ın değeri “Solid Color” olmalı ve kameranın Background renginin alpha (saydamlık) değeri 0 olmalı
  • Save to: screenshot’lar bu klasöre kaydedilir. Değerini boş bırakırsanız, screenshot’lar masaüstünüze kaydedilir

İşe yaraması dileğiyle; sağlıcakla kalın.

yorum
  1. Furkan dedi ki:

    Selamlar Yasir, öncelikle yazılımlarını çok başarılı bulduğumu söyleyebilirim. Sorum şu bu kodu ekleyip screenshot almaya çalıştığımda nullreference hatası veriyor. Sebebi ne olabilir ?

    NullReferenceException: Object reference not set to an instance of an object
    MultiScreenshotCaptureNamespace.MultiScreenshotCapture.OnGUI () (at Assets/Editor/MultiScreenshotCapture.cs:346)

    • yasirkula dedi ki:

      Teşekkür ederim. Sahnedeki kameranızın Tag’i Main Camera değil diye tahmin ediyorum.

      • Furkan dedi ki:

        Evet normal kamera değil yönetim Cinemachine Virtual Camera üzerinde, çözümü “if (currentResolutionEnabled)
        CaptureScreenshot((targetCamera == TargetCamera.GameView ?
        Camera.main : SceneView.lastActiveSceneView.camera).pixelRect.size);”
        bu kısmı yorum satırı haline getirerek çözümledim.
        Gerçekten eline sağlık. Iosa uygulama geliştirdiğim zaman 3 farklı çözünürlükte ss almam gerekiyordu. Windows Ekran Alıntı Aracını kullanarak elimle yapıyordum. Sonrasında internet üzerinden çözünürlüklerini tekrar düzenliyordum ama yine de kalite düşüyordu. Şimdi senin kodun sayesinde 3 farklı çözünürlükte ki resmi tek seferde kayıt edebiliyorum ve kalitesi hiç düşmüyor. Teşekkür ederim böyle birşeyi ücretsiz sunduğun için. Başarılarının devamını diliyorum 🙂

      • yasirkula dedi ki:

        Rica ederim. Cinemachine de kullansanız Camera objesine Main Camera tag’i vererek sorunu o şekilde de çözebilirsiniz (kameranın tag’i farklı diye varsayıyorum).

  2. ibrahim dedi ki:

    Ekran görüntüsü almayı bir tuşa atayabilir miyiz. Bunu yapmak için nasıl bir değişiklik yapabiliriz

    • yasirkula dedi ki:

      Bunu eklemek için EditorApplication.update’te Repaint’i çağırıp OnGUI fonksiyonunda da Event.current.type’ın değeri EventType.KeyDown ise, Event.current.keyCode’a bakmak gerekiyor diye düşünüyorum.

      • yasirkula dedi ki:

        DÜZELTME: Denediğimde bu yöntemin çalışmadığını gördüm. O yüzden GUILayout.Button("Capture Screenshots") koşulunun içindeki kodu bir public fonksiyona alıp, ne zaman screenshot almak istiyorsanız (örneğin bir script’in Update’inde çalışan Input.GetKeyDown koşulunda), şu kodu çalıştırabilirsiniz:

        #if UNITY_EDITOR
        UnityEditor.EditorWindow.GetWindow<MultiScreenshotCaptureNamespace.MultiScreenshotCapture>().Fonksiyonunİsmi();
        #endif

  3. Cihan dedi ki:

    Ne kadar yardımcı oldun bilemezsin. Çok teşekkür ederim.
    Bir soru sormak istiyorum izniniz varsa.
    Unreal’da 2k veya 4k resimlerle capture edilerek (jpeg veya png) video kaydı alınabiliniyor, buna benzer bir uygulama unity için biliyor musunuz?

    Uygulamanızla çektiğim sahneyi de göstereyim. 🙂
    https://i.imgur.com/qxp2pSM.jpg

    • yasirkula dedi ki:

      Sahneniz çok güzel gözüküyor elinize sağlık. Sadece masalardaki siyah çizgiler başta bana anti aliasing eksikliğinden gibi geldi ama sanırım anti aliasing zaten açık (şimdi pencerelerin alt kenarlarına bakınca yine tereddüte düştüm). Dediğiniz gibi resim sekansı oluşturmak veya direkt mp4 video kaydetmek için Unity’nin Unity Recorder paketini kullanabilirsiniz. Örnek bir ders: https://learn.unity.com/tutorial/working-with-the-unity-recorder-2019-3#

      • Cihan dedi ki:

        Cevap verdiğiniz için çok teşekkür ederim bilmiyordum bu paketi teşekkür ederim.

        Görsele gelince. Ben tırtıklı seviyorum bu yüzden aa açmadım. 🙂 Kino’nun sharp efekti ve panini’nin bombesi eklenince köşeler daha belirgin oluyor ama aşılamayacak şeyler değil.

  4. Cevat akdemir dedi ki:

    Merhaba Yasir Kula,
    Siteni gerçekten beğendim ve hoşuma gitti yardımcı oluyor bana sizden bir isteğim olacak bir oyunun “tutorial” kısmını nasıl yapabiliriz örneğin sonsuz koşu oyunlarında tutorial bölümünde oyuncu parmağını kaydırmasını söyleyip kaydırana kadar da bekleyeceğiz sonra da diğer kısımlara engelden atlama vb. bunları nasıl yapabiliriz ?(oyun 2D)
    Saygılarımla iyi çalışmalar.

    • yasirkula dedi ki:

      Bu kısımlarda ben de çok iyi değilim. Ben parmak hareketini öğretmek için, UI sistemi ile oluşturduğum hareketli parmağı ekranda gösteriyorum ve kullanıcı yapması gereken parmak hareketini yaptığında, ekrandaki parmağı parmak.gameObject.SetActive(false) ile kapatıyorum. Kullanıcının parmak hareketini yaptığını anlamak kolay: eğer o hareketi yapınca X aksiyonu gerçekleşiyorsa, X aksiyonunun içinde parmak.gameObject.SetActive(false) çalıştırılıyor.

      • Cevat akdemir dedi ki:

        Bunu bende denedim 1 kere gösterip sonra objeyi kalıcı olarak sildim ama oyunda gösterdiğinde çok kaba(çok fazla kalabalık)görünüyordu ekran tutorial için ayrı bi sahne oluşturup öğreticiyi yapabilsem iyi olurdu çünkü bir yayıncı test edecek yakında oyunu böylecd oyuncunun ilgisini falanda çekerdi.

  5. Reflection kullanma nedenin tam olarak nedir? Direk objenin kendisinden çağırmaya göre daha mı avantajlı? (Reflectionın unity üzerindeki avantajı hakkında çok bilgim yok biraz da açıklarsanız güzel olur)

    • yasirkula dedi ki:

      “internal” ve “private” değişkenlere/fonksiyonlara dışarıdan sadece Reflection ile erişilebildiği için, böyle değişken ve fonksiyonlara erişirken Reflection kullandım.

  6. Furkan dedi ki:

    Selam Yasir, siteni bayadır takip ediyorum. Game Maker üzerinde çalışıyordum ama Unity’e geçmeye karar verdim. JS ve C# ile ilgili hiçbir bilgim yok. Nerden nasıl başlamalıyım? Türkçe kaynak olarak önerebileceğin video yada yazılı dersler varmı? Udemy üzerinden de olur.

Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.