Bisakah Unity 2D digunakan untuk membuat game pixel-art?

16

Saya sedang melihat fitur 2D baru yang diperkenalkan di Unity 4.3, dan saya pikir saya mungkin kehilangan sesuatu.

Bagi saya sepertinya mereka dirancang untuk game 2D beresolusi tinggi, di mana penskalaan sprite ok, tetapi tidak cocok untuk game pixel-art.

Sprite pixel-art dirancang untuk ditampilkan dengan tepat 1: 1 piksel pada layar: penskalaan menghancurkannya (penskalaan linear merupakan pengecualian, yaitu Anda dapat menskalakannya 2x, 3x, 4x dll.).

Namun saya tidak menemukan cara untuk "hanya menampilkan apa adanya", tampaknya Unity bersikeras mengubah skala ke resolusi apa pun yang dianggapnya sesuai: Saya dapat mengontrol parameter Camera.size, dan parameter "piksel ke unit" dari sprite , tapi saya tidak berhasil mendapatkan hasil ini.

o0 '.
sumber
1
Jika saya tidak salah, game "Organ Trail" dibuat sepenuhnya di Unity3d, sebelum 4.3.
felipe

Jawaban:

19

Artikel ini memberikan beberapa penjelasan yang berguna, bahkan jika itu sebelum 4.3 keluar:

Jika Anda mencari tampilan "pixel art" maka ukuran ortografi kamera sangat penting; ini adalah bagian tersulit dari memaku 2D di Unity.

Ukuran ortografis menyatakan berapa banyak unit dunia yang terkandung di bagian atas proyeksi kamera. Misalnya, jika Anda menetapkan ukuran ortografis 5, maka luasan vertikal viewport akan berisi tepat 10 unit ruang dunia. (Batas horisontal tergantung pada rasio aspek tampilan.)

Ingatlah bahwa quad sprite Anda adalah 1 unit ke samping. Itu berarti ukuran ortografis memberi tahu Anda berapa banyak sprite yang dapat Anda susun secara vertikal di viewport (dibagi 2).

Untuk membuat pixel-art terlihat bersih, Anda perlu memastikan bahwa setiap piksel dari tekstur sumber sprite memetakan 1: 1 ke tampilan viewport. Anda tidak ingin piksel sumber dilompati atau digandakan, atau sprite Anda akan terlihat terdistorsi dan "kotor". Trik untuk memastikan rasio 1: 1 ini adalah dengan mengatur ukuran ortografis yang cocok dengan resolusi layar vertikal Anda dibagi dengan tinggi piksel sprite.

Katakanlah Anda menjalankan pada 960x640, dan Anda menggunakan sprite 64x64. Membagi resolusi layar vertikal (640) dengan tinggi piksel sprite (64) menghasilkan 10, jumlah 64x64 sprite yang dapat ditumpuk secara vertikal dalam 640 piksel. Ingat bahwa ukuran ortografis adalah setengah tinggi, sehingga ukuran ortografis target Anda dalam hal ini adalah 5 (setengah dari 10). Seharusnya terlihat seperti ini:

Jika Anda menetapkan ukuran ortografis Anda menjadi setengah atau dua kali lipat dari target itu, Anda mungkin masih mendapatkan hasil yang dapat digunakan, karena ukuran vertikal sprite masih akan dibagi secara merata ke dalam ukuran vertikal viewport. Tetapi jika Anda mengatur ukuran ortografis secara tidak benar, Anda akan melihat beberapa piksel dilewati atau berlipat ganda, dan memang akan terlihat sangat buruk:

Resolusi Variabel

Anda tidak perlu terbatas pada satu resolusi tunggal untuk membuat seni pixel bersih. Cara paling sederhana untuk menangani resolusi variabel adalah dengan melampirkan skrip khusus ke kamera Anda yang menetapkan ukuran ortografis sesuai dengan resolusi vertikal saat ini dan ukuran sprite (tetap) yang diketahui :

// 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;

Meskipun itu adalah perbaikan sederhana, itu memang memiliki kelemahan: karena resolusi layar menurun, Anda akan melihat semakin sedikit dunia, dan sprite akan mengambil lebih banyak dan lebih banyak layar. Itulah konsekuensi menjaga rasio 1: 1 antara piksel sumber dan layar: sprite 64x64 membutuhkan ruang lebih jelas pada 640x480 daripada di 1920x1200. Apakah ini masalah atau tidak tergantung pada kebutuhan gim spesifik Anda.

Jika Anda ingin sprite Anda tetap berukuran sama tanpa memandang resolusi layar, maka cukup atur ukuran ortografis ke nilai tetap dan biarkan di sana terlepas dari resolusi layar. Kekurangannya adalah sprite Anda tidak lagi memiliki rasio piksel sumber-ke-layar 1: 1. Anda dapat mengurangi efek buruk dari itu dengan hanya memungkinkan resolusi yang tepat setengah atau tepat dua kali lipat resolusi target Anda.

(beberapa penekanan ditambahkan)

Ini jelas bekerja lebih baik jika resolusi tinggi dibagi dengan ukuran sprite, tetapi bahkan ketika tidak, resolusi masih memberikan perkiraan yang baik dari hasil yang layak.


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

o0 '.
sumber
5
Hal lain yang bermanfaat adalah mengatur penyaringan tekstur ke 'Point'.
felipe
@Felipe poin bagus: Saya lupa tentang itu karena saya sudah menemukan jawabannya.
o0 '.