Bagaimana saya bisa membuat medan besar di Unity?

19

Bagaimana saya bisa membuat medan yang sangat besar di Unity? Sepertinya saya bisa mengatur lebar dan panjang ke nilai besar. Tetapi resolusi Heightmap hanya mencapai 4097 dan resolusi Detail hanya mencapai 4048.

Ada ide?

Daniel Pendergast
sumber
Saya minta maaf karena menjadi buzzkill: sol.gfxile.net/mmorpg.html
Nailer

Jawaban:

21

Pisahkan medan menjadi "bongkahan" persegi, muat orang-orang yang Anda sayangi (kebanyakan: Mereka yang berada di dekat kamera yang aktif) di Perbarui () dan - jika Anda kekurangan ruang (kemungkinan besar akan terjadi), bongkar yang tidak diperlukan jauh .

Gunakan model poli-rendah yang dihitung sebelumnya untuk LoD medan jauh, kecuali Anda tidak memiliki jarak pandang yang rendah. Selain itu, jika Anda memerlukan peta ketinggian terain dari medan jauh untuk apa pun (seperti gerakan NPC atau simulasi lainnya), buat varian resolusi rendah atau variabel yang bervariasi untuk terain di memori Anda; jangan gunakan data terain lengkap untuk itu. Ini bisa dilakukan secara otomatis saat memuat game, tetapi umumnya merupakan ide yang lebih baik untuk membuat alat yang membuat data pra-dihasilkan ini selama pembuatan atau paket.

Akhirnya: Untuk menghindari masalah presisi floating point, Anda harus memposisikan ulang seluruh adegan setiap kali kamera utama Anda bergerak menjauh (0.0f, 0.0f, 0.0f).

Pertanyaan yang mungkin relevan tentang Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html

Martin Sojka
sumber
Terima kasih! jawaban yang bagus Hanya satu pertanyaan, ketika saya mengatur tetangga dari medan, apa yang akan terjadi jika medan tidak pada ketinggian yang sama di tepi?
Daniel Pendergast
1
@Dan: Anda akan mendapatkan lubang di lanskap. Ada berbagai cara untuk mengatasi hal ini, kira-kira di sepanjang garis "pastikan lanskap memiliki ketinggian yang sama di tepinya", "tambahkan rok berjalan secara vertikal dari tepi ke bawah untuk beberapa ketinggian untuk menutupi lubang" dan "tambahkan strip segitiga yang dihasilkan untuk menjahit lubang bersama. " Yang mana yang Anda gunakan terserah Anda (dan mesinnya, sebagian). Yang kedua, dengan rok, adalah yang paling sering saya lihat.
Martin Sojka
1
atau seperti yang saya katakan, Anda ingin menggunakan skrip untuk
melapisi
Adakah yang punya skrip?
Daniel Pendergast
@Dan: Ada beberapa skrip di tautan Unity Answers dalam jawabannya. Selain itu, saya tidak dapat membantu Anda dengan kode untuk Unity saat ini, semua pemrograman game (tingkat hobi) saya dilakukan dengan Ogre3D sebagai mesin rendering.
Martin Sojka
3

Anda harus memecah medan dalam potongan, yaitu. beberapa medan yang lebih kecil. Anda harus 'saling melipat' satu sama lain (dengan naskah) sehingga tidak akan ada 'lubang' di antara mereka, tetapi jika tidak, Anda bisa langsung mulai melakukannya.

Anda mungkin ingin tahu juga bahwa karena Unity3D ~ 3.0 Anda tidak dapat memindahkan item (baca medan dan item) terlalu jauh (seperti +/- 100000 langkah IIRC) sehingga ini akan memengaruhi ukuran maksimum dunia Anda.

Saya menggunakan ini dalam game RPG online saya (dengan pengecualian bahwa saya hanya menggunakan Unity3D untuk desain level, bukan untuk game yang sebenarnya).

Hanya karena saya ingin tahu, apakah Anda ingin berbagi info tentang game Anda (seperti peningkatan, jenis, grafik, gaya, dll.)?

Valmond
sumber
2

Kami benar-benar mengimplementasikan medan besar di Unity5 dengan memproses data SRTM untuk seluruh bumi menjadi peta ketinggian untuk TerrainDataobjek dengan Level Detail yang berbeda [1]. Ada beberapa hal yang perlu dipertimbangkan:

  1. Bagian paling tepi dari peta ketinggian harus tumpang tindih dengan setidaknya satu sampel dan Anda perlu mengatur posisi medan Anda dengan tepat. Terrain.SetNeighborstidak akan menghubungkan jala, hanya akun untuk berbagai tingkat detail yang dilakukan oleh Unity.

  2. Anda, tentu saja, membutuhkan 2 ^ n + 1 sampel tinggi per TerrainDataobjek, jika tidak Unity hanya akan menetapkan tinggi 0 ke bagian yang belum disetel.

  3. Jika Anda memiliki kurang dari 2GB TerrainData, Anda dapat menggunakannya dengan Aset di folder Sumber Daya dan Resource.Loadsaat runtime. Jika Anda memiliki lebih dari 2GB pendekatan ini tidak lagi berfungsi karena tidak ada lebih dari 2GB sumber daya dengan Unity builds. Dalam hal ini Anda harus membangun AssetBundles dan memuatnya secara asinkron dengan WWWobjek. Ini memiliki efek samping yang tidak diinginkan dari panggilan Shader.Parseuntuk masing-masing dengan overhead sekitar 500ms. Saya melaporkan ini di forum [2] dan masih menunggu balasan. Saya akan mengirimkan laporan bug pada akhirnya.

  4. Jangan berpikir untuk menggunakan AssetDatabase.LoadAssetAtPath, itu hanya tersedia di editor dan bukan di Unity builds.

[1] https://www.youtube.com/watch?v=2UsyVuWoFbQ
[2] http://forum.unity3d.com/threads/shader-parse-delays-loading-of-assetbundle-containing-no-shader 0,358235 /

sradomski
sumber
0

Ada solusi pihak ketiga.

kode ini dapat membuat medan seluas 99.999 meter, pegunungan adalah formula kebisingan apa pun, tetapi Anda dapat mencampur 100 rumus kebisingan ke dalam satu peta jika Anda mau. misalnya, di medan ini, jumlah total segitiga yang tersedia di peta adalah antara 66 juta, resolusi rendah, dan 200 juta resolusi menengah. di sini adalah peta segitiga 66 juta, di mana segitiga 0,7 juta diperbarui di sekitar kamera. medan raksasa unityplayer, WASD dan Space

com. dimengerti
sumber
Apakah ada kode sumber untuk itu? Yang saya lihat hanyalah sebuah game plugin persatuan.
AttackingHobo
saya punya kode sumber, butuh beberapa saat untuk menulis. Saya di semut d0t stewart at yahoo d0t com
com.prehensible
0

Saya akan merekomendasikan memuat medan Anda dalam potongan. Dengan menggunakan medan yang lebih kecil, dan mungkin skrip Anda dapat memeriksa apakah Anda berada dalam jarak tertentu ke medan Anda dengan menggunakan transform.position - terrain.transform.position. Saya benar-benar menulis posting blog tentang cara mengoptimalkan game Anda secara keseluruhan, dan saya berbicara tentang chunk loading. Semoga ini membantu.

Hudson
sumber
Perhatikan bahwa saran ini sudah ada dalam jawaban yang diterima dari Martin Sojka dari 6 tahun yang lalu. Jika Anda hanya ingin membagikan tautan yang relevan, komentar tentang jawaban itu mungkin lebih tepat.
DMGregory
Di masa depan aku akan melakukannya. Terima kasih. Saya masih baru untuk memposting di pertukaran tumpukan :)
Hudson