টাইলম্যাপ থেকে কীভাবে সমস্ত টাইল পাবেন?


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

এটি করার আরও একটি উপায় এখানে 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);
}

2

টাইলম্যাপ থেকে কীভাবে সমস্ত কাস্টম টাইলস পাবেন এবং জবাবগুলিতে উল্লিখিত পদ্ধতি 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>()
ফিলিপ

~ ফিলিপ, ইন্টারফেস সম্পর্কে কিছুই বলতে পারে না, কারণ আমি শুধুমাত্র কম্পোনেন্টের সাথেও কাজ করেছি।
দিমিত্রি তাবাকভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.