Cum pot face terenuri uriașe în Unity? (Dezvoltarea jocurilor, Unitate, Optimizare, Redarea Terenului, Teren, Heightmap)

Daniel spune Reinstaurați-o pe Monica a intrebat.
a intrebat.

Cum pot să fac extrem de mult uriașe terenuri în Unity? Se pare că pot seta lățimea și lungimea la valori mari. Dar rezoluția Heightmap merge doar până la 4097, iar rezoluția Detail doar până la 4048.

Aveți vreo idee?

Comentarii

5 răspunsuri
Martin Sojka

Împărțiți terenul în „bucăți” pătrate, încărcați-le pe cele care vă interesează (în mare parte: Cele din apropierea camerei active în acel moment) în Update() și – dacă sunteți strâmtorat de spațiu (probabil că veți fi), descărcați-le pe cele care nu sunt necesare departe.

Folosiți modele precalculate low-poly pentru LoD-ul terenului îndepărtat, cu excepția cazului în care nu vă deranjează să aveți o distanță de vizualizare mică. De asemenea, dacă aveți nevoie de harta înălțimii terenului de la distanță pentru ceva (cum ar fi mișcarea NPC-urilor sau o altă simulare), creați o variantă cu rezoluție redusă sau variabilă a terenului dvs. pentru a o păstra în memorie; nu utilizați datele complete ale terenului pentru aceasta. Acest lucru se poate face automat la încărcarea jocului, dar, în general, este o idee mai bună să faceți un instrument care să creeze aceste date pre-generate în timpul compilării sau al pachetului.

În cele din urmă: Pentru a evita problemele de precizie în virgulă mobilă, va trebui să repoziționați întreaga scenă de fiecare dată când camera principală se îndepărtează mult de (0.0f, 0.0f, 0.0f).

Întrebare posibil relevantă pe Unity Answers http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html

Comentarii

  • Mulțumesc!!! răspuns excelent. Doar o întrebare, când setez vecinii terenurilor, ce s-ar întâmpla dacă terenurile nu sunt la aceeași înălțime pe margini?-.  > Por Daniel spune Reinstaurați-o pe Monica.
  • @Dan: Vei avea găuri în peisaj. Există diferite moduri de a rezolva acest lucru, aproximativ pe linia „asigură-te că peisajul are aceeași înălțime la margini”, „adaugă fuste care merg pe verticală de la margini în jos pentru o anumită înălțime pentru a masca găurile” și „adaugă benzi de triunghiuri generate pentru a coase găurile împreună”. Pe care dintre ele o folosiți depinde de dumneavoastră (și de motor, în parte). Cea de-a doua, cu fustele, este cea pe care am văzut-o cel mai des.  > Por Martin Sojka.
  • sau, așa cum am spus, ai vrea să folosești un script pentru a coase terenurile :-)-.  > Por Valmond.
  • Are cineva vreun script?-  > Por Daniel spune Reinstaurați-o pe Monica.
  • @Dan: Există câteva scripturi la link-ul Unity Answers din răspuns. În afară de asta, momentan nu te pot ajuta cu cod pentru Unity, toată programarea mea de jocuri (la nivel de hobby) se face cu Ogre3D ca motor de randare.-.  > Por Martin Sojka.
Valmond

Va trebui să împărțiți terenurile în bucăți, adică mai multe terenuri mai mici. va trebui să le „coaseți” pe acelea între ele (cu un script) astfel încât să nu existe „găuri” între ele, dar altfel puteți începe să le faceți imediat.

Ar fi bine să știi și că, de la Unity3D ~3.0, nu poți muta elementele (a se citi terenurile și elementele) prea departe (cam la +/-100000 pași IIRC), așa că acest lucru va influența dimensiunea maximă a lumii tale.

Oricum, eu folosesc acest lucru în jocul meu RPG online (cu excepția faptului că folosesc Unity3D doar pentru level design, nu și pentru jocul propriu-zis).

Doar pentru că sunt curios, ai vrea să împărtășești câteva informații despre jocul tău (cum ar fi avansarea, tipul, grafica, stilul etc.)?

sradomski

Am implementat terenuri uriașe în Unity5 prin procesarea datelor SRTM pentru întregul pământ în hărți de înălțime pentru TerrainData obiecte cu diferite niveluri de detalii[1]. Există câteva lucruri de luat în considerare:

  1. Marginile hărților de înălțime trebuie să se suprapună cu cel puțin un eșantion și trebuie să poziționați terenurile în consecință. Terrain.SetNeighbors nu va conecta ochiurile de plasă, ci doar va ține cont de diferitele niveluri de detaliu realizate de Unity.

  2. Aveți, în mod necesar, nevoie de 2^n + 1 eșantioane de înălțime per TerrainData obiect, în caz contrar Unity va atribui pur și simplu o înălțime de 0 pentru părțile nefixate.

  3. Dacă aveți mai puțin de 2GB de TerrainData, , vă puteți descurca dacă le aveți ca Assets într-un folder Resource și Resource.Load le în timpul execuției. Dacă aveți mai mult de 2GB, această abordare nu va mai funcționa, deoarece nu pot exista mai mult de 2GB de resurse cu Unity builds. În acest caz, va trebui să construiți AssetBundles și să le încărcați asincron cu ajutorul funcției WWW object. Acest lucru are efectul secundar neplăcut de a apela Shader.Parse pentru fiecare dintre ele, cu un cost suplimentar de aproximativ 500 ms. Am raportat acest lucru pe forumuri[2] și încă aștept un răspuns. Voi trimite un raport de eroare în cele din urmă.

  4. Nu vă gândiți să folosiți AssetDatabase.LoadAssetAtPath, , este disponibilă doar în editor și nu în compilările 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/

aliential

Există soluții de la terți.

acest cod poate face terenuri cu o lățime de 99.999 de metri, munții sunt orice formule de zgomot, dar puteți amesteca 100 de formule de zgomot într-o singură hartă dacă doriți.de exemplu, în acest teren, numărul total de triunghiuri disponibile într-o hartă este între 66 de milioane, cu rezoluție mică, și 200 de milioane cu rezoluție medie.Iată o hartă cu 66 de milioane de triunghiuri, în care 0,7 milioane de triunghiuri sunt actualizate în jurul camerei.unityplayer teren gigant, WASD și Space

Comentarii

  • Există un cod sursă pentru asta? Tot ceea ce văd este un joc de plugin unity.  > Por AttackingHobo.
  • am codul sursă, mi-a luat ceva timp să scriu. sunt la ant d0t stewart at yahoo d0t com-.  > Por aliential.
Hudson

V-aș recomanda să încărcați terenul în bucăți. Folosind terenuri mai mici, și poate că scriptul tău ar putea verifica dacă te afli într-o anumită apropiere de terenul tău folosind transform.position – terrain.transform.position. De fapt, am scris un articol pe blog despre cum să vă optimizați jocul în ansamblu și am vorbit despre încărcarea pe bucăți. Sper că acest lucru vă ajută.

Comentarii

  • Rețineți că acest sfat este deja prezent în răspunsul acceptat de Martin Sojka de acum 6 ani. Dacă doriți doar să împărtășiți un link relevant, un comentariu la acel răspuns ar putea fi mai potrivit.-  > Por DMGregory.
  • În viitor o voi face. Vă mulțumesc. Sunt încă începător în a posta pe stack exchange :)-.  > Por Hudson.