जवाबों:
अपने टाइलमैप के आयताकार क्षेत्र से सभी टाइलों के साथ एक सरणी प्राप्त करने के लिए, उपयोग करें 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()
।यहाँ इसके साथ एक और तरीका है .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);
}
पता लगाना 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)
, लेकिन मुझे लगता है कि जांच नहीं की।
GetComponent<Tilemap>()
।