Unity'de nasıl büyük araziler yapabilirim?


Yanıtlar:


21

Araziyi kare "parçalara" ayırın, Update () içine önem verdiklerinizi (çoğunlukla şu anda aktif olan kameranın yakınında olanlar) yükleyin ve - yer için sarılıysanız (muhtemelen olacaksınız), gerekli olmayanları uzaklaştırın .

Uzak görüş mesafesi için düşük hesaplanmış düşük poli modelleri kullanın, düşük görüş mesafesine sahip olmanın sakıncası yoksa. Ayrıca, herhangi bir şey için (NPC hareketi veya başka bir simülasyon gibi) uzak arazinin arazi yükseklik haritasına ihtiyacınız varsa, bellekte tutmak için arazinizin düşük çözünürlüklü veya değişken çözünürlüklü bir varyantını oluşturun; bunun için tüm arazi verilerini kullanmayın. Bu, oyun yükünde otomatik olarak yapılabilir, ancak genellikle derleme veya paket sırasında bu önceden oluşturulmuş verileri oluşturan bir araç yapmak daha iyi bir fikirdir.

Son olarak: Kayan nokta hassasiyeti sorunlarından kaçınmak için, ana kameranızdan (0.0f, 0.0f, 0.0f) her uzaklaştığında tüm sahneyi yeniden konumlandırmanız gerekir.

Birlik Yanıtları ile ilgili olası soru http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html


Teşekkür ederim! mükemmel cevap. Sadece bir soru, arazilerin komşularını ayarladığımda, araziler kenarlarda aynı yükseklikte değilse ne olur?
Daniel Pendergast

1
@ Dan: Manzarada delikler açılacak. Bununla başa çıkmanın farklı yolları vardır, kabaca "manzaranın kenarlarda aynı yüksekliğe sahip olduğundan emin olun", "delikleri maskelemek için kenarlardan aşağıya doğru dikey olarak uzanan etekler ekleyin" ve "oluşturulan üçgen şeritleri ekleyin delikleri birbirine dikmek için. " Hangisini kullanacağınız size bağlıdır (ve kısmen motor). İkincisi, etekler ile en sık gördüğüm.
Martin Sojka

1
ya da dediğim gibi, arazileri
dikmek

Kimsenin senaryosu var mı?
Daniel Pendergast

@ Dan: Cevaptaki Birlik Yanıtları bağlantısında bazı komut dosyaları var. Bunun yanı sıra, şu anda Unity için kod konusunda size yardımcı olamıyorum, tüm (hobi seviyesi) oyun programlamam renderleme motoru olarak Ogre3D ile yapılır.
Martin Sojka

3

Bölgeleri parçalara ayırmanız gerekecek, yani. birkaç küçük arazi. Bu againsleri birbirinden (bir senaryo ile) 'kesmeniz' gerekecek, böylece aralarında 'delikler' olmayacak, aksi takdirde hemen yapmaya başlayabilirsiniz.

Unity3D ~ 3.0'dan beri öğeleri (arazileri ve öğeleri okuyamazsınız) çok uzağa taşıyamayacağınızı (+/- 100000 adım IIRC gibi) bilmek isteyebilirsiniz, böylece bu dünyanın maksimum boyutunu etkileyecektir.

Bunu zaten çevrimiçi RPG oyunumda kullanıyorum (sadece gerçek tasarım için değil, seviye tasarımı için Unity3D kullanıyorum).

Merak ettiğim için oyununuz hakkında (ilerleme, tür, grafik, stil vb.) Bilgi paylaşmak ister misiniz?


2

Tüm TerrainDataAyrıntılar için SRTM verilerini farklı Ayrıntı Düzeylerine sahip nesneler için yükseklik haritalarına işleyerek Unity5'te büyük araziler uyguladık [1]. Dikkate alınması gereken birkaç nokta var:

  1. Yükseklik haritalarının kenarlarının en az bir örnekle örtüşmesi ve arazilerinizi buna göre konumlandırmanız gerekir. Terrain.SetNeighborsağa bağlanmaz, sadece Unity tarafından yapılan farklı ayrıntı düzeylerini açıklar.

  2. Her TerrainDatanesne için mutlaka 2 ^ n + 1 yükseklik örneğine ihtiyacınız vardır , aksi takdirde Unity ayarlanmamış parçalara sadece 0 yükseklik atayacaktır.

  3. 2 GB'tan daha az alanınız varsa TerrainData, bunları bir Kaynak klasöründe Varlıklar olarak ve Resource.Loadçalışma zamanında bunlardan kaçınabilirsiniz. 2GB'tan fazla alanınız varsa, Unity derlemeleri ile 2GB'tan fazla kaynak bulunamayacağı için bu yaklaşım artık çalışmaz. Bu durumda AssetBundles oluşturmanız ve bunları eşzamansız olarak WWWnesne ile yüklemeniz gerekir . Bu, Shader.Parseher biri yaklaşık 500 ms'lik bir yük ile çağrılmanın istenmeyen yan etkisine sahiptir . Bunu forumlarda bildirdim [2] ve hala bir cevap bekliyorum. Sonunda bir hata raporu göndereceğim.

  4. Kullanmayı düşünmeyin AssetDatabase.LoadAssetAtPath, Unity derlemelerinde değil, yalnızca editörde mevcuttur.

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


0

Üçüncü taraf çözümleri var.

Bu kod 99,999 metre genişliğinde arazi yapabilir, dağlar herhangi bir gürültü formülüdür, ancak isterseniz 100 harita formülünü bir haritaya karıştırabilirsiniz. örneğin, bu arazide, bir haritadaki toplam üçgen sayısı 66 milyon, düşük çözünürlük ve 200 milyon orta çözünürlük arasındadır. İşte 66 milyon üçgen harita, burada 0.7 milyon üçgen fotoğraf makinesi etrafında güncelleniyor. unityplayer dev arazi, WASD ve Uzay


Bunun için kaynak kodu var mı? Tüm gördüğüm bir birlik eklenti oyunudur.
AttackingHobo

kaynak kodu var, yazmak için biraz zaman aldı. yahoo
d0t

0

Arazinizi parçalar halinde yüklemenizi tavsiye ederim. Daha küçük araziler kullanarak ve belki de betiğiniz, transform.position - terrain.transform.position kullanarak arazinize belirli bir yakınlıkta olup olmadığınızı kontrol edebilir. Aslında oyununuzu bir bütün olarak nasıl optimize edeceğinize dair bir blog yazısı yazdım ve yığın yüklemeden bahsettim. Bu yardımcı olur umarım.


Bu tavsiyenin 6 yıl önce Martin Sojka tarafından kabul edilen cevapta zaten mevcut olduğunu unutmayın. Yalnızca ilgili bir bağlantıyı paylaşmak isterseniz, bu cevaba ilişkin bir yorum daha uygun olabilir.
DMGregory

Gelecekte yapacağım. Teşekkür ederim. Hala yığın borsasında yayınlama konusunda yeniyim :)
Hudson
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.