Unity 2D, piksel sanat oyunları yapmak için kullanılabilir mi?


16

Unity 4.3'te sunulan yeni 2D özelliklere bakıyorum ve sanırım bir şey eksik olabilirim.

Bana göre, spriteları ölçeklendirmenin iyi olduğu yüksek çözünürlüklü 2D oyunlar için tasarlanmış gibi görünüyorlar, ancak piksel sanat oyunları için uygun değiller.

Bir piksel sanat hareketli grafik, ekranda tam olarak 1: 1 piksel görüntülenecek şekilde tasarlanmıştır: ölçekleme onu yok eder (doğrusal yukarı ölçekleme bir istisnadır, yani 2x, 3x, 4x vb. Ölçeklendirebilirsiniz).

Ancak "sadece olduğu gibi görüntülemek" için hiçbir yol bulamadım, görünüşe göre Unity uygun gördüğü çözünürlük için ölçeklendirme ısrar ediyor: Camera.size parametresini ve hareketli grafiğin "pikselden birime" parametresini kontrol edebilirim , ancak bu sonucu elde etmeyi başaramadım.


1
Eğer yanılmıyorsam, 4.3'ten önce "Organ Trail" oyunu tamamen Unity3d'de yapıldı.
felipe

Yanıtlar:


19

Bu makalede , 4.3 çıkmadan önce bile bazı yararlı açıklamalar verilmektedir:

“Piksel resmi” görünümüne gidiyorsanız, kameranın ortografik boyutu kritik öneme sahiptir; Bu, Unity'de 2D çivilemenin en zor kısmıdır.

Ortografik boyut, kamera projeksiyonunun üst yarısında kaç tane dünya birimi bulunduğunu ifade eder. Örneğin, ortografik boyutu 5 olarak ayarlarsanız, görünüm penceresinin dikey uzantıları tam olarak 10 birim dünya alanı içerecektir. (Yatay uzantılar ekran en boy oranına bağlıdır.)

Sprite dörtlü'nün bir tarafa 1 birim olduğunu hatırlayın. Bu, ortografik boyutun, görünüm alanında (2'ye bölünmüş) kaç tane sprite dikey olarak yığınlayabileceğinizi söylemesi anlamına gelir.

Piksel sanatının temiz görünmesini sağlamak için hareketli grafiğin kaynak dokusunun her pikselinin görünüm ekranı görüntüsüyle 1: 1 eşleştiğinden emin olmanız gerekir. Kaynak piksellerin atlanmasını veya ikiye katlanmasını istemezsiniz ya da spritelarınız bozuk ve “kirli” görünür. Bu 1: 1 oranını sağlamanın hilesi, dikey ekran çözünürlüğünüze uygun bir dikey boyutun bir hareketli grafiğin piksel yüksekliğine bölünmesidir.

Diyelim ki 960x640'ta koşuyorsunuz ve 64x64 sprite kullanıyorsunuz. Dikey ekran çözünürlüğünü (640) bir hareketli grafiğin (64) piksel yüksekliğine bölmek, 640 piksel olarak dikey olarak istiflenebilen 64x64 hareketli sayısı olarak 10 verir. Ortografik boyutun yarı yükseklikte olduğunu unutmayın, bu nedenle bu durumda hedef ortografik boyutunuz 5 (10'un yarısı) olacaktır. Şöyle görünmelidir:

Ortografik boyutunuzu bu hedefin yarısına veya iki katına ayarlarsanız, hareketli grafiğin dikey boyutu yine de görünümün dikey boyutuna eşit olarak bölüneceğinden kullanılabilir sonuçlar elde edebilirsiniz. Ancak ortografik boyutu yanlış ayarlarsanız, bazı piksellerin atlandığını veya iki katına çıktığını göreceksiniz ve gerçekten çok kötü görünecek:

Değişken Çözünürlük

Temiz piksel resmi oluşturmak için tek bir sabit çözünürlükle sınırlı kalmanıza gerek yoktur. Değişken çözünürlükleri işlemenin en basit yolu fotoğraf makinenize geçerli dikey çözünürlüğe ve bilinen (sabit) hareketli grafik boyutuna göre ayarlanan özel bir komut dosyası eklemektir :

// set the camera to the correct orthographic size
// (so scene pixels are 1:1)
s_baseOrthographicSize = Screen.height / 64.0f / 2.0f;
Camera.main.orthographicSize = s_baseOrthographicSize;

Bu basit bir düzeltme olsa da, bir dezavantajı var: ekran çözünürlüğü azaldıkça, daha az ve daha az dünya göreceksiniz ve spritelar daha fazla ekran alacak. Bu, kaynak ve ekran pikselleri arasında 1: 1 oranını korumanın sonucudur: 64x64 hareketli grafik, 640x480'de 1920x1200'de olduğundan daha fazla yer kaplar. Bunun bir sorun olup olmadığı oyununuzun ihtiyaçlarına bağlıdır.

Spritelarınızın ekran çözünürlüğünden bağımsız olarak aynı görünür boyutta kalmasını istiyorsanız, ortografik boyutu sabit bir değere ayarlayın ve ekran çözünürlüğünden bağımsız olarak orada bırakın. Bunun dezavantajı, spritelarınızın artık 1: 1 kaynak / ekran piksel oranına sahip olmamasıdır. Sadece hedef çözünürlüğünüzün tam yarısı ya da tam olarak iki katı olan çözünürlüklere izin vererek bunun kötü etkilerini azaltabilirsiniz.

(biraz vurgu eklendi)

Yükseklik çözünürlüğü hareketli grafik boyutuna bölünebilirse bu daha iyi çalışır, ancak olmasa bile, yine de iyi bir sonucun iyi bir yaklaşımını verir.


TL; DR :cameraSelf.orthographicSize = screenH / (float)spriteSize / 2f;


5
Başka bir yararlı şey, doku filtrelemeyi 'Nokta' olarak ayarlamaktır.
felipe

@Felipe iyi bir nokta: Bunu unuttum çünkü zaten anladım.
o0 '.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.