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.
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)
Teşekkür ederim. Sahnedeki kameranızın Tag’i Main Camera değil diye tahmin ediyorum.
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 🙂
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).
Ekran görüntüsü almayı bir tuşa atayabilir miyiz. Bunu yapmak için nasıl bir değişiklik yapabiliriz
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.
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
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
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#
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.
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.
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.
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.
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)
“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.
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.
Şu yorumum yardımcı olabilir: https://yasirkula.com/2014/09/05/unity-sikca-sorulan-sorular-s-s-s/#comment-23939