উত্তর:
আপনার টাইলম্যাপের একটি আয়তক্ষেত্রাকার অঞ্চল থেকে সমস্ত টাইলসের সাথে একটি অ্যারে পেতে, ব্যবহার করুন 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()
।এটি করার আরও একটি উপায় এখানে way .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);
}
টাইলম্যাপ থেকে কীভাবে সমস্ত কাস্টম টাইলস পাবেন এবং জবাবগুলিতে উল্লিখিত পদ্ধতি 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>()
।