Mengapa Unity dalam mode 2d menggunakan penskalaan dan ukuran othografis standar seperti ini?

8

Saya sebelumnya menggunakan SFML, XNA, Monogame, dll. Untuk membuat game 2d, di mana jika saya menampilkan sprite 100px pada layar, itu akan membutuhkan 100px . Jika saya menggunakan ubin 128px untuk membuat latar belakang, ubin pertama akan berada di (0, 0) sedangkan yang kedua akan berada di (128, 0).

Unity di sisi lain, memiliki sistem unit ganjil sendiri, penskalaan pada semua transformasi, pixel-to-unit, ukuran othografis, dll, dll. Jadi pertanyaan saya adalah dua kali lipat, yaitu:

  1. Mengapa Unity memiliki sistem ini secara default untuk 2d? Apakah ini untuk pengembang seluler? Apakah ada manfaat besar yang tidak saya lihat?
  2. Bagaimana saya bisa mengatur lingkungan saya, sehingga jika saya memiliki 128x128 sprite di Photoshop, itu ditampilkan sebagai 128x128 sprite di Unity ketika saya menjalankan permainan saya?

Perhatikan bahwa saya menargetkan desktop secara eksklusif.

Orang baru
sumber
1
Mengapa ini terjadi adalah karena Unity adalah mesin 3D yang baru-baru ini memiliki grafik 2D yang dicangkokkan. Bagaimana cara menangani semuanya adalah sesuatu yang saya ingin tahu jawabannya, untuk melihat apakah orang lain memiliki pendekatan yang lebih baik daripada saya.
jhocking
Fungsi GUI dan komponen tekstur GUIT Unity memungkinkan Anda menggambar tekstur ke layar dengan ukuran asli, secara langsung. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Jika Anda membutuhkan lebih banyak fleksibilitas, taruhan terbaik Anda adalah dengan menentukan skala yang konsisten - seperti 1U = 128px - dan menerapkannya secara konsisten untuk semua paha depan / sprite / kamera Anda.
DMGregory
Saya akan menghindari kelas GUI Unity; karena mode langsung GUI di Unity cukup tidak efisien, mereka sedang membangun sistem GUI baru (akan merilisnya sebenarnya, dalam versi 4.6).
jhocking

Jawaban:

4

Menangani koordinat 2D dan penskalaan dalam Unity cukup sederhana, tetapi tidak jelas dan seperti yang Anda perhatikan tidak seperti cara alat dev lainnya bekerja. Mengapa ini terjadi adalah karena Unity adalah mesin 3D yang baru-baru ini memiliki grafik 2D.

Secara khusus, 1 unit di Unity belum tentu 1 piksel dalam gambar. Ketika Anda mengimpor gambar sebagai Sprite 2D sebenarnya ada pengaturan Pixel-to-Unit yang dapat dibuat 1: 1 tapi saya sarankan membiarkannya pada default 100: 1 karena beberapa alasan (mesin fisika tidak berfungsi dengan benar pada 1: 1, dan standarnya lebih baik untuk kompatibilitas dengan kode orang lain).

Pengaturan penskalaan ini berarti bahwa semua posisi dibagi 100. Cukup mudah selama Anda selalu mengingat penskalaan; ketika Anda ingin memindahkan sprite 256 piksel (katakanlah) maka Anda memindahkannya 2,56 Anda mungkin juga ingin menulis fungsi utilitas untuk membulatkan angka menjadi 2 tempat desimal / piksel terdekat: Mathf.Round (float * 100) / 100f


Adapun pengaturan kamera pixel-sempurna, pertama-tama mengaturnya sebagai kamera ortografis. Saat Anda memilih kamera, dalam pengaturannya ada drop-down untuk proyeksi Perspektif atau Orthografis; Perspektif berarti hal-hal akan terlihat 3D, sementara ortografis menampilkan adegan datar. Tepat di bawah drop-down ini adalah Ukuran; atur ukuran ortografis kamera menjadi setengah dimensi piksel layar yang Anda inginkan.

Misalnya, Anda ingin layar 1024x768 piksel-sempurna. Nah itu berarti ketinggian kamera harus 384 piksel. Bagilah dengan 100 (karena skala piksel-ke-unit) dan Anda mendapatkan 3,84 untuk ukuran kamera. Sekali lagi, matematika itu hanyalah SCREEN_SIZE / 2 / 100f


(Saya menunggu untuk melihat jawaban lain apa yang didahulukan, tetapi sudah beberapa hari. Saya telah melakukan 2D di Unity untuk sementara waktu menggunakan Toolkit 2D , tetapi saya relatif baru dengan fitur-fitur 2D bawaan)

jhocking
sumber
2

Seperti kata jhocking, ini adalah hasil dari menyemai 2D menjadi IDE 3D. Tapi, ada solusinya, itu hanya agak misterius.

Langkah pertama adalah membuka Pengaturan Impor sprite Anda dari panel Proyek. Setelah Jenis Tekstur diatur ke Sprite atau Advanced (Advanced memberi Anda pilihan praktis lainnya, tetapi Sprite adalah default jika Anda membuat proyek 2D di awal), ada bidang Pixels To Units dengan default 100.

Saya bercanda dengan sistem ubin, jadi saya menggunakan ubin 16x16 piksel dan mengatur Piksel Ke Unit ke 16. Matematika bekerja seperti: Ukuran dalam piksel (baik X atau Y) / Piksel Ke Unit = Unit Kesatuan dalam Transform . Kubus 16 piksel dengan PTU 16 membutuhkan 1 unit dalam ruang Unity.

Saya belum mencoba, tetapi saya berharap PTU 1 akan membuat hal-hal pixel sempurna.

Pengaturan kamera ortografis agak sakit kepala. Sekali lagi, ini berdasarkan pengaturan Pixels to Units, tetapi juga beberapa hal lainnya. Pada dasarnya itu setengah tinggi layar dari Pengaturan Player (yaitu 1080, 768, apa pun iPhone 5, tidak dapat diganggu untuk mencarinya) dibagi dengan Pixels To Units.

PatrionDigital
sumber
1

Pixel unit bukan cara yang baik untuk mewakili dunia besar karena cara angka floating point bekerja. Dengan angka floating point, Anda kehilangan presisi dengan angka yang sangat besar. Angka yang mendekati 0 memiliki presisi terbaik. Dengan demikian, beberapa mesin gim cenderung memilih sistem metrik MKS (Meters / Kilogram / Detik). Unity default ke meter, sehingga karakter game dapat dengan mudah direpresentasikan sebagai tinggi 1,0-2,0 meter dengan presisi yang sangat baik.

Berat rata-rata dan tinggi manusia laki-laki adalah sekitar 50kg dan tinggi 1,8 meter. Jika Anda mencoba membuat karakter dengan tinggi 1.200 piksel, beratnya akan menjadi sekitar 33.000 piksel unit. Jika kemudian Anda ingin menambahkan objek yang sangat berat seperti bus ke game, Anda akan memiliki sejumlah besar unit piksel. Anda dapat dengan mudah melihat bagaimana ini dapat menyebabkan perhitungan yang sangat tidak tepat untuk tabrakan.

Jika Anda sangat bertekad untuk menggunakan unit piksel, Anda dapat dengan mudah menghitung rasio piksel ke meter.

LVBen
sumber
Tetapi semua ini tidak berlaku untuk sebagian besar game 2D yang bahkan hampir tidak perlu menggunakan fisika sama sekali. Masalahnya adalah bahwa Unity menyarankan dukungan untuk 2D tetapi sangat sederhana dan membutuhkan banyak studi untuk menyederhanakan apa yang Anda butuhkan dari mesin 2D.
Kokodoko