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?
unity
optimization
terrain-rendering
terrain
heightmap
Daniel Pendergast
źródło
źródło
Odpowiedzi:
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
źródło
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.)?
źródło
W Unity5 zaimplementowaliśmy ogromne tereny, przetwarzając dane SRTM dla całej ziemi w mapy wysokości dla
TerrainData
obiektów o różnych poziomach szczegółowości [1]. Jest kilka rzeczy do rozważenia:Same krawędzie map wysokości muszą pokrywać się z co najmniej jedną próbką i musisz odpowiednio ustawić swoje tereny.
Terrain.SetNeighbors
nie połączy siatki, uwzględni jedynie różne poziomy szczegółowości wykonane przez Unity.Koniecznie potrzebujesz 2 ^ n + 1 próbek wysokości na
TerrainData
obiekt, w przeciwnym razie Unity przypisze wysokość 0 do nieuzbrojonych części.Jeśli masz mniej niż 2 GB
TerrainData
, możesz uniknąć ich posiadania jako Zasobów w folderze zasobów iResource.Load
podczas 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ąWWW
obiektu. Ma to niepożądany efekt uboczny wywołaniaShader.Parse
każ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.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 /
źródło
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
źródło
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.
źródło