Jak mogę tworzyć ogromne tereny w Unity?

19

Jak mogę tworzyć wyjątkowo duże tereny w Unity? Wygląda na to, że mogę ustawić szerokość i długość na duże wartości. Ale rozdzielczość mapy wysokości wzrasta tylko do 4097, a rozdzielczość szczegółów tylko do 4048.

Jakieś pomysły?

Daniel Pendergast
źródło
Przepraszam za bzyczenie
Nailer

Odpowiedzi:

21

Podziel teren na kwadratowe „fragmenty”, załaduj te, na których Ci zależy (głównie: te w pobliżu aktualnie aktywnej kamery) w Aktualizacji () i - jeśli masz przywiązanie do miejsca (prawdopodobnie będziesz), rozładuj niepotrzebne daleko .

Używaj wstępnie obliczonych modeli low-poly dla LoD w dalekim terenie, chyba że nie przeszkadza ci mała odległość widzenia. Ponadto, jeśli potrzebujesz mapy wysokości terenu odległego do jakichkolwiek celów (takich jak ruch NPC lub inna symulacja), utwórz wariant terenu o niskiej rozdzielczości lub zmiennej rozdzielczości, aby zachować go w pamięci; nie używaj do tego pełnych danych terenu. Można to zrobić automatycznie po załadowaniu gry, ale ogólnie lepiej jest stworzyć narzędzie, które tworzy te wstępnie wygenerowane dane podczas kompilacji lub pakietu.

Wreszcie: aby uniknąć problemów z precyzją zmiennoprzecinkową, musisz zmienić położenie całej sceny za każdym razem, gdy główny aparat odsuną się od (0,0f, 0,0f, 0,0f).

Ewentualnie istotne pytanie dotyczące Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html

Martin Sojka
źródło
Dziękuję Ci! świetna odpowiedź. Tylko jedno pytanie, kiedy ustawiam sąsiadów terenów, co by się stało, gdyby tereny nie były na tej samej wysokości na krawędziach?
Daniel Pendergast,
1
@ Dan: Dostaniesz dziury w krajobrazie. Istnieją różne sposoby radzenia sobie z tym, z grubsza w stylu „upewnij się, że krajobraz ma taką samą wysokość na krawędziach”, „dodaj spódnice biegnące pionowo od krawędzi w dół na pewną wysokość, aby zamaskować dziury” i „dodaj wygenerowane trójkątne paski zszyć otwory ”. To, którego używasz, zależy od Ciebie (i silnika, częściowo). Drugi, ze spódnicami, to ten, który widziałem najczęściej.
Martin Sojka,
1
lub, jak powiedziałem, chciałbyś użyć skryptu do
zszywania
Czy ktoś ma jakieś skrypty?
Daniel Pendergast
@ Dan: Istnieje kilka skryptów pod linkiem Unity Answers w odpowiedzi. Poza tym w tej chwili nie mogę ci pomóc z kodem dla Unity, całe moje (hobby) programowanie gry odbywa się za pomocą Ogre3D jako silnika renderującego.
Martin Sojka,
3

Trzeba będzie rozbić tereny na części, tj. kilka mniejszych terenów. Będziesz musiał łączyć się ze sobą ponownie (za pomocą skryptu), aby nie było między nimi „dziur”, ale w przeciwnym razie możesz po prostu zacząć je robić od razu.

Możesz także chcieć wiedzieć, że od Unity3D ~ 3.0 nie możesz przenosić przedmiotów (czytać tereny i przedmioty) zbyt daleko (jak +/- 100000 kroków IIRC), więc wpłynie to na maksymalny rozmiar twojego świata.

Używam tego w mojej internetowej grze RPG (z wyjątkiem tego, że używam Unity3D tylko do projektowania poziomów, a nie do samej gry).

Tylko dlatego, że jestem ciekawy, czy chciałbyś podzielić się informacjami na temat swojej gry (np. Postęp, typ, grafika, styl itp.)?

Valmond
źródło
2

W Unity5 zaimplementowaliśmy ogromne tereny, przetwarzając dane SRTM dla całej ziemi w mapy wysokości dla TerrainDataobiektów o różnych poziomach szczegółowości [1]. Jest kilka rzeczy do rozważenia:

  1. Same krawędzie map wysokości muszą pokrywać się z co najmniej jedną próbką i musisz odpowiednio ustawić swoje tereny. Terrain.SetNeighborsnie połączy siatki, uwzględni jedynie różne poziomy szczegółowości wykonane przez Unity.

  2. Koniecznie potrzebujesz 2 ^ n + 1 próbek wysokości na TerrainDataobiekt, w przeciwnym razie Unity przypisze wysokość 0 do nieuzbrojonych części.

  3. Jeśli masz mniej niż 2 GB TerrainData, możesz uniknąć ich posiadania jako Zasobów w folderze zasobów i Resource.Loadpodczas ich uruchamiania. Jeśli masz więcej niż 2 GB, to podejście przestanie działać, ponieważ w kompilacjach Unity nie może być więcej niż 2 GB zasobów. W takim przypadku musisz zbudować AssetBundles i asynchronicznie załadować je za pomocą WWWobiektu. Ma to niepożądany efekt uboczny wywołania Shader.Parsekażdego z kosztem około 500 ms. Zgłosiłem to na forach [2] i nadal czekam na odpowiedź. W końcu prześlę raport o błędzie.

  4. Nie myśl o użyciu AssetDatabase.LoadAssetAtPath, jest dostępna tylko w edytorze, a nie w kompilacjach Unity.

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

sradomski
źródło
0

Istnieją rozwiązania innych firm.

ten kod może tworzyć tereny o szerokości 99 999 metrów, góry są dowolnymi formułami hałasu, ale możesz mieszać 100 formuł hałasu na jednej mapie, jeśli chcesz. na przykład w tym terenie całkowita liczba trójkątów dostępnych na mapie wynosi od 66 milionów, niskiej rozdzielczości do 200 milionów średniej rozdzielczości. tutaj jest 66 milionów map trójkątów, na których wokół kamery aktualizuje się 0,7 miliona trójkątów. gigantyczny teren Unityplayer, WASD i kosmos

zrozumiały
źródło
Czy jest na to kod źródłowy? Wszystko, co widzę, to wtyczka Unity.
AttackingHobo
Mam kod źródłowy, napisanie go zajęło mi trochę czasu. jestem w ant d0t stewart w yahoo d0t com
prehensible
0

Polecam ładowanie terenu na części. Korzystając z mniejszych terenów, być może skrypt może sprawdzić, czy jesteś w pobliżu terenu, używając transform.position - terrain.transform.position. Napisałem post na blogu, w jaki sposób zoptymalizować grę jako całość, i mówiłem o ładowaniu fragmentów. Mam nadzieję że to pomoże.

Hudson
źródło
Zwróć uwagę, że ta rada jest już obecna w zaakceptowanej odpowiedzi Martina Sojki sprzed 6 lat. Jeśli chcesz po prostu udostępnić odpowiedni link, komentarz do tej odpowiedzi może być bardziej odpowiedni.
DMGregory
W przyszłości będę. Dziękuję Ci. Nadal jestem nowy w wysyłaniu wiadomości na wymianę stosu :)
Hudson