तिलमप से सभी टाइल कैसे प्राप्त करें?


13

मैं TileMapएकता में नई प्रणाली की थोड़ी सी कोशिश कर रहा हूं और मैं एक सूची या 2 डी सरणी के रूप में टाइल्स तक पहुंचने का एक तरीका ढूंढ रहा था, लेकिन मुझे इसके अलावा कुछ भी नहीं मिल रहा है, GetTile(Vector3Int vector)जो केवल एक टाइल देता है ... क्या कोई रास्ता है? यह करने के लिए ?

जवाबों:


18

अपने टाइलमैप के आयताकार क्षेत्र से सभी टाइलों के साथ एक सरणी प्राप्त करने के लिए, उपयोग करें tilemap.GetTilesBlock(BoundsInt bounds)। आपको टाइलों की एक-आयामी सरणी मिलेगी, इसलिए आपको टाइलों की अगली पंक्ति शुरू होने पर अपने आप को जानना होगा। किसी भी खाली कोशिकाओं को एक nullमूल्य के साथ दर्शाया जाएगा ।

यदि आप सभी टाइलें चाहते हैं, तो उपयोग करें tilemap.cellBounds। यह आपको एक BoundsIntवस्तु मिलती है जो कि टिलामैप के पूर्ण उपयोग किए गए क्षेत्र को कवर करती है। यहां एक उदाहरण स्क्रिप्ट दी गई है, जो एक ही गेम ऑब्जेक्ट पर तिलमैप से सभी टाइलें प्राप्त करती है और अपने निर्देशांक के साथ टाइलों को सूचीबद्ध करती है:

using UnityEngine;
using UnityEngine.Tilemaps;

public class TileTest : MonoBehaviour {
    void Start () {
        Tilemap tilemap = GetComponent<Tilemap>();

        BoundsInt bounds = tilemap.cellBounds;
        TileBase[] allTiles = tilemap.GetTilesBlock(bounds);

        for (int x = 0; x < bounds.size.x; x++) {
            for (int y = 0; y < bounds.size.y; y++) {
                TileBase tile = allTiles[x + y * bounds.size.x];
                if (tile != null) {
                    Debug.Log("x:" + x + " y:" + y + " tile:" + tile.name);
                } else {
                    Debug.Log("x:" + x + " y:" + y + " tile: (null)");
                }
            }
        }        
    }   
}

सीमा के बारे में और आपको अपेक्षा से अधिक टाइलें क्यों मिल सकती हैं: वैचारिक रूप से, एकता तिलमैप्स का असीमित आकार है। cellBoundsबढ़ती है जब तुम टाइल रंग रूप में की जरूरत है, लेकिन वे फिर से हटना नहीं है, तो आप उन्हें मिटा। इसलिए जब आपके खेल में अच्छी तरह से परिभाषित मानचित्र आकार होता है, तो आप मानचित्रों को संपादित करते समय कभी फिसल जाते हैं, तो आपको कुछ आश्चर्य हो सकता है। इस मुद्दे के आसपास काम करने के तीन तरीके हैं:

  • tilemap.CompressBounds()बाहरी टाइलों को सीमाएं बहाल करने के लिए कॉल करें (उम्मीद है कि आपको उन्हें मिटाने के लिए याद किया जाएगा)
  • इस पर निर्भर होने के बजाय boundsअपने आप को वस्तु बनाएं ।new BoundsInt(origin, size)cellBounds
  • सेट tilemap.originऔर tilemap.sizeवांछित मूल्यों और फिर कॉल करने के लिए tilemap.ResizeBounds()

11

यहाँ इसके साथ एक और तरीका है .cellBounds.allPositionsWithin

public Tilemap tilemap;
public List<Vector3> tileWorldLocations;

// Use this for initialization
void Start () {
    tileWorldLocations = new List<Vector3>();

    foreach (var pos in tilemap.cellBounds.allPositionsWithin)
    {   
        Vector3Int localPlace = new Vector3Int(pos.x, pos.y, pos.z);
        Vector3 place = tilemap.CellToWorld(localPlace);
        if (tilemap.HasTile(localPlace))
        {
            tileWorldLocations.Add(place);
        }
    }

    print(tileWorldLocations);
}

2

पता लगाना Tilemap से सभी कस्टम टाइल प्राप्त करने के लिए और कारण के लिए कैसे के दौरान ITilemapनहीं है GetTilesBlockतरीका है जिसके जवाब में उल्लेख किया है मैं इस तरह एक विस्तार विधि जोड़ने का सुझाव देते हैं (2D केवल):

public static class TilemapExtensions
{
    public static T[] GetTiles<T>(this Tilemap tilemap) where T : TileBase
    {
        List<T> tiles = new List<T>();

        for (int y = tilemap.origin.y; y < (tilemap.origin.y + tilemap.size.y); y++)
        {
            for (int x = tilemap.origin.x; x < (tilemap.origin.x + tilemap.size.x); x++)
            {
                T tile = tilemap.GetTile<T>(new Vector3Int(x, y, 0));
                if (tile != null)
                {
                    tiles.Add(tile);
                }
            }
        }
        return tiles.ToArray();
    }
}

इस मामले में, यदि आपके पास, मान लें, कस्टम टाइल टाइलरॉड, जो टाइल या टाइलबेस से विरासत में मिला है, तो आप कॉल के साथ सभी टाइलरॉड टाइल प्राप्त कर सकते हैं:

TileBase[] = tilemap.GetTiles<RoadTile>();

के लिए ITilemap हम पैरामीटर बदल सकते हैं (this Tilemap tilemap)करने के लिए (this ITilemap tilemap), लेकिन मुझे लगता है कि जांच नहीं की।


ITilemap इंटरफ़ेस से आपको किस स्थिति में निपटने की आवश्यकता है? तिलमैप प्रणाली के साथ अपने प्रयोगों के दौरान मैंने इसका सामना नहीं किया। मैंने हमेशा तिलमप घटक का अधिग्रहण किया GetComponent<Tilemap>()
फिलिप

~ फिलिप, इंटरफ़ेस के बारे में कुछ भी नहीं बता सकता है, क्योंकि मैंने केवल घटक के साथ काम किया है।
दिमित्री तबकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.