Unity-menettelytapojen TileMap-sukupolvi luomatta peliobjektia ruutua kohti

Olen etsinyt Internetiä etsimään tehokasta tapaa luoda menettelytapakartta luomatta GameObject-ruutua. Kaikki löytämäni TileMap-oppaat luovat ruutuja luomalla satoja GameObject-tiedostoja. Siksi hierarkia Unityssä laajenee odottamatta.

Olen melko varma, että tämä ei ole ”oikea” tapa tehdä se. Varsinkin kun olen nähnyt uudet Unity 2D -työkalut, jotka tukevat tilakarttoja. Unity teki sen niin, voit luoda ruutuja ”yhdessä” peliobjektissa, ei kullekin ruudulle.

Joten miten teen sen oikein ja tehokkaasti?

Kommentit

  • Olet ’ rististänyt tämän kahdelle SE-sivustolle. Valitse yksi.
  • Mitä ’ Onko erityinen huolenaiheenne suuren määrän GameObjectsin luomisessa? Jos se ’ on vain hierarkian sotku, on helppo korjata asia. Unity ’ erittelyn tulisi yhdistää samanlaiset ruudut joka tapauksessa yhteen erään, joten tällöin ’ ei todennäköisesti aiheudu suurta vetorangaistusta. Minimoi näytön ulkopuoliset ruudut ja Myös ruutujen päivitystoiminnoissa käytetty aika on ratkaistavissa olevia ongelmia. Oletko profiloinut pelisi ja tunnistanut spesifikaation c pullonkaula, jota ’ yrität ratkaista?
  • @DMGregory No, jos ajattelemme 100 * 100 karttaa ruudulla (jos oletamme, että loitonnimme nähdäksesi kokonaisen kartta), se tekee 10.000 peliobjektia kohtauksessa. Se tarkoittaa myös 10 000 tarpeetonta muunnososaa. En tiedä edes ’, voiko yhtenäisyys tukea 10.000 objektia hieararkiaikkunassa. Tiedän, että se jäätyy parin sadan jälkeen.

Vastaa

Täällä olen tietoinen:

Vaihtoehto 1. GameObject ruutua kohden. Se ei ole täysin kauhea tietyissä tapauksissa. Tarpeistasi riippuen se voi toimia tarpeeksi hyvin.

Vaihtoehto 2. Yksi nelikulmainen tai tasoinen, joka viittaa ajon aikana luomaan tekstuuriin. käytä lähinnä laatan atlas-tekstuuria ”maalataksesi” karttasi yhtenä uutena tekstuurina. Kartan koosta riippuen saatat haluta tietysti olla useita nelosia / tasoja, joista kukin edustaa kartan osia.

Vaihtoehto 3. Luo oma verkko. Tämä olisi todennäköisesti menetelmä, jota pidät eniten, kun se on otettu käyttöön. Se ”antaa sinulle paljon joustavuutta ja luultavasti parhaan suorituskyvyn. Luodaan olennaisesti neloset ruutua kohden ja asetat jokaisen kärjen UV: n kartoittamaan laatan atlasesi laatat.

Vaihtoehdolle 2, I” Suosittelen, että katsot tämän videosarjan, jonka on kirjoittanut quill18creates: 3D TileMap -opetusohjelma – quill18creates

Vaihtoehdolle 3 tämä on minun koodi, tweaksilla, joten se ei välttämättä ole täydellinen:

//For this, your GameObject this script is attached to would have a //Transform Component, a Mesh Filter Component, and a Mesh Renderer //component. You will also need to assign your texture atlas / material //to it. void Start() { meshFilter = GetComponent<MeshFilter>(); BuildMesh(); } public void BuildMesh() { int numTiles = mapSizeX * mapSizeY; int numTriangles = numTiles * 6; int numVerts = numTiles * 4; Vector3[] vertices = new Vector3[numVerts]; UVArray = new Vector2[numVerts]; int x, y, iVertCount = 0; for (x = 0; x < mapSizeX; x++) { for (y = 0; y < mapSizeY; y++) { vertices[iVertCount + 0] = new Vector3(x, y, 0); vertices[iVertCount + 1] = new Vector3(x + 1, y, 0); vertices[iVertCount + 2] = new Vector3(x + 1, y + 1, 0); vertices[iVertCount + 3] = new Vector3(x, y + 1, 0); iVertCount += 4; } } int[] triangles = new int[numTriangles]; int iIndexCount = 0; iVertCount = 0; for (int i = 0; i < numTiles; i++) { triangles[iIndexCount + 0] += (iVertCount + 0); triangles[iIndexCount + 1] += (iVertCount + 1); triangles[iIndexCount + 2] += (iVertCount + 2); triangles[iIndexCount + 3] += (iVertCount + 0); triangles[iIndexCount + 4] += (iVertCount + 2); triangles[iIndexCount + 5] += (iVertCount + 3); iVertCount += 4; iIndexCount += 6; } mesh = new Mesh(); //mesh.MarkDynamic(); if you intend to change the vertices a lot, this will help. mesh.vertices = vertices; mesh.triangles = triangles; meshFilter.mesh = mesh; UpdateMesh(); //I put this in a separate method for my own purposes. } //Note, the example UV entries I have are assuming a tile atlas //with 16 total tiles in a 4x4 grid. public void UpdateMesh() { int iVertCount = 0; for (int x = 0; x < mapSizeX; x++) { for (int y = 0; y < mapSizeY; y++) { UVArray[iVertCount + 0] = new Vector2(0, 0); //Top left of tile in atlas UVArray[iVertCount + 1] = new Vector2(.25f, 0); //Top right of tile in atlas UVArray[iVertCount + 2] = new Vector2(.25f, .25f); //Bottom right of tile in atlas UVArray[iVertCount + 3] = new Vector2(0, .25f); //Bottom left of tile in atlas iVertCount += 4; } } meshFilter.mesh.uv = UVArray; } 

kommentit

  • Vastauksesi auttoivat minua takaisin päivää. Tarkastelen nyt vanhoja kysymyksiäni, ja olen ’ tajunnut, etten ole koskaan tarkistanut tätä vastausta hyväksytyksi ’. Anteeksi yhden ikuisuuden myöhäisestä hyväksynnästä ^^ Kiitos vastauksesta.

Vastaa

Kuten sinä (luulen ), johon viitattiin, Unityn etenemissuunnitelmassa on suunnitelmia laatakartan muokkausohjelmasta. Odotan sitä innolla, koska juuri nyt se on vähän hämmentävää, miten edetä.

Sillä välin paras lähestymistapa I ”Näkemykseni on tehdä karttasi Tilediin ja tuoda se sitten X-UniTMX: llä Unityyn. Ilmeisesti tämä ei kuitenkaan ole prosessuaalinen luominen; kuvittelen, että käyttäisit samaa tekniikkaa kuin X-UniTMX käyttää verkon luomiseen.

Vastaa

Voit vain luoda laatat, jotka on luotu syvemmälle hierarkiaan ja sulkea kyseinen kansio. Älä myöskään häiritse. Voit myös piilottaa peliobjektisi hierarkialta `myTile.hideFlags = HideFlags. HideInHierarchy ”ei ole varma siitä, kuinka paljon suorituskykyä saavutettaisiin.

100×100-kuvioiden näyttäminen näytöllä ei ole koskaan hyvä idea tekstuurien piirtäminen on raskaampaa kuin monikulmioiden piirtäminen joka tapauksessa. Jos haluat loitontaa niin pitkälle, sinulla on parempi isommilla tekstuureilla. Sama koskee zoomausta, sinun ei pidä piirtää pintakuvioita, joita ei tarvitse piirtää.

Se, mitä yleensä teen (en ole Unity-kaveri), on luokka luokkaa kartalle ja käyttää 2-ulotteinen taulukko kaikkien laattojesi säilyttämiseen. Tämä taulukko voi olla yksinkertaisesti intoja tai laatta-luokka, jossa on pari intia, jotka viittaavat tekstuureihisi, laatatyyppiin, esineisiin jne. Sitten se piirretään seuraavasti:

for (int y = 0; y < mapHeight; y++) { for(int x = 0; x < mapHeight; x++) { Graphics.DrawTexture(new Rect(x * tileWidth, y * tileHeight, tileWidth, tileHeigt), tileTexture); } } 

Käyttämäni piirtomenetelmä näyttää olevan graafisen käyttöliittymän piirtäminen, mutta se saattaa olla täysin sopiva tehtävään. Muussa tapauksessa sinun täytyy kaivaa sprite-hallintaan ja löytää tapa joka toimii tällä menetelmällä.

Voit käyttää tekstuuria viittaamalla sanakirjaa, kuten int 1 ruutuluokassasi viittaa johonkin tekstuuriin ja int 2 viittaa toiseen.Rivillä, jolla piirrät tekstuuria, annat sanakirjalla oikean tekstuuriobjektin. Tällä tavalla sen ei pitäisi luoda GameObjectia eikä siten luoda tarpeetonta yleiskustannusta.

Voit tehdä saman melkein kaikelle, mikä ei vaadi GameObjectin hallinnan tasoa. Muista kuitenkin, että tällä tavoin se piirtää karttasi jokaisen ruudun, mikä todennäköisesti ei tuhoa esineitä automaattisesti, kuten mielestäni yhtenäisyys tekee peliobjekteista. Mutta vain piirtäminen sen, minkä on oltava näytöllä, on erittäin helppoa. Tiedät näytön / näkymän koon, kameran sijainnin ja ruudun koon. Joidenkin yksinkertaisten matematiikkojen pitäisi piirtää tarkalleen mitä tarvitaan.

Yhtenäisyys on silti 3D-moottori. Se tukee vain 2D: tä 3D-tavalla. Mutta voit periaatteessa tehdä saman nelosille / silmille, joissa on tekstuureja ja ortografiakamera. Pelkästään tarvittavien silmien piirtäminen on melko halpaa.

Vastaa

Voxel- / lohkopohjaisen projektin parissa työskentelevänä , En voi olla ajattelematta vain saman lähestymistavan käyttöä, vain 2D-tilassa. Voit rakentaa ruudukon kaltaisen verkon menettelyllisesti ja määrittää UV-kanavalle oikeat koordinaatit laattojen visuaaleista tekstuurikartassasi. 3D: ssä sinun on tehtävä paljon enemmän työtä kuin tämä on korkean suorituskyvyn saavuttamiseksi, mutta 2D: ssä se todennäköisesti riittää.

Vastaa

Voit aina käyttää LeanPoolia . Se on ilmainen omaisuus omaisuuskaupassa. Se tekee esineiden yhdistämisen sinulle. Sitten voit tehdä yksinkertaisen hävitysjärjestelmän kameranäkymän ympärille, joka kutee / kutee laattojen peliobjektit, kun ne tulevat / poistuvat kameranäkymästä. En ole varma siitä, kuinka suuri tilikarttasi tulee olemaan, mutta Unity pystyy käsittelemään melko vähän peliobjekteja. LeanPoolilla on vertailukohtauksia Unityssä, joissa voit kutea / de kutea tuhat esinettä laatikkotörmäyskomponenteilla ja mielestäni mahdollisesti renderöintikomponentti myös jokaisella, ja se tekee sen hyvin nopeasti.

https://gamedevacademy.org/how-to-script-a-2d-tile-map-in-unity3d/

Tässä on linkki, joka näyttää sinulle esimerkki LeanPoolin käytöstä tilakartan kanssa.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *