Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de Varlık Bulma: AssetDatabase.FindAssets() ile Verimli Arama

Paylaşan: Unity Eğitim 21 October 2025 8 dakika okuma 106 görüntülenme

Unity projelerinizde çalışırken, bazen belirli türdeki varlıklara (asset) veya belirli bir isme sahip dosyalara programatik olarak erişmeniz gerekebilir. Bu durum genellikle özel editör araçları, otomasyon scriptleri veya proje genelinde belirli bir varlık türünü yönetmek istediğinizde ortaya çıkar. İşte tam bu noktada Unity'nin AssetDatabase sınıfı ve özellikle AssetDatabase.FindAssets() metodu devreye girer. Bu makalede, AssetDatabase FindAssets yöntemini derinlemesine inceleyecek, nasıl kullanıldığını, pratik ipuçlarını ve yaygın hataları ele alacağız.

AssetDatabase.FindAssets() Nedir ve Neden Önemlidir?


AssetDatabase sınıfı, Unity editörü içinde projenizdeki varlıkları yönetmek için kullanılan güçlü bir API setidir. Bu sınıf, varlıkları yükleme, kaydetme, taşıma, silme ve hatta oluşturma gibi işlemleri yapmanıza olanak tanır. Ancak unutulmamalıdır ki, AssetDatabase sınıfı sadece Unity Editör ortamında çalışır ve oyunun çalışma zamanında (runtime) kullanılamaz. Oyununuzun derlenmiş bir sürümünde varlıkları bulmak veya yüklemek için farklı yöntemler (örneğin Resources.Load veya Adreslenebilir Varlıklar - Addressable Assets) kullanmanız gerekir.

AssetDatabase.FindAssets() metodu, projenizdeki varlıkları belirli kriterlere göre aramanızı sağlar. Bu kriterler varlığın tipi, adı, etiketi veya yolu olabilir. Metodun dönüş değeri doğrudan varlık nesneleri değil, bu varlıkların benzersiz tanımlayıcıları olan bir GUID (Global Unique Identifier) dizisidir. Bu GUID'ler daha sonra AssetDatabase.GUIDToAssetPath() ve AssetDatabase.LoadAssetAtPath() gibi diğer AssetDatabase metodları ile gerçek varlık nesnelerine dönüştürülebilir.

Filtre String'i ile Güçlü Aramalar


AssetDatabase.FindAssets() metodunun en önemli özelliği, arama kriterlerini belirten bir 'filtre string'i' almasıdır. Bu filtre string'i, Unity'nin proje penceresindeki arama çubuğunda kullandığınız syntax'e benzerdir. İşte bazı yaygın filtre örnekleri:

  • t:TypeName: Belirli bir türdeki tüm varlıkları bulur. Örneğin, t:Texture2D tüm dokuları, t:ScriptableObject tüm ScriptableObject'leri bulur.

  • n:AssetName: Belirli bir isme sahip varlıkları bulur. Örneğin, n:PlayerModel.

  • l:LabelName: Belirli bir etikete (label) sahip varlıkları bulur. Örneğin, l:Environment.

  • p:FolderPath: Belirli bir klasör yolu içindeki varlıkları bulur. Örneğin, p:Assets/Models.

  • f:FolderName: Belirli bir klasör adının altındaki varlıkları bulur. Örneğin, f:Prefabs.


Birden fazla filtreyi boşluk bırakarak birleştirebilirsiniz. Bu, bir 'AND' operatörü gibi çalışır ve tüm kriterlere uyan varlıkları döndürür. Örneğin, t:Texture2D n:Player hem doku olan hem de adında "Player" geçen varlıkları bulur.

AssetDatabase FindAssets Kullanım Örnekleri


Şimdi AssetDatabase FindAssets metodunun pratik kullanımına dair bazı kod örneklerine göz atalım.

1. Belirli Bir Türdeki Tüm Varlıkları Bulma


Projenizdeki tüm ScriptableObject türündeki varlıkları bulmak için:
using UnityEditor;
using UnityEngine;

public static class AssetFinder
{
public static void FindAllScriptableObjects()
{
string[] guids = AssetDatabase.FindAssets("t:ScriptableObject");
Debug.Log($"Projede {guids.Length} adet ScriptableObject bulundu.");

foreach (string guid in guids)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
ScriptableObject so = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
Debug.Log($"Bulunan ScriptableObject: {so.name} ({assetPath})");
}
}
}


2. Belirli Bir Klasör İçindeki Varlıkları Bulma


Sadece Assets/Prefabs klasörü içindeki tüm prefab'leri bulmak için:
using UnityEditor;
using UnityEngine;

public static class AssetFinder
{
public static void FindPrefabsInFolder()
{
// Klasör yolunu ve tür filtresini birleştirin
string[] guids = AssetDatabase.FindAssets("t:GameObject p:Assets/Prefabs");
Debug.Log($"Assets/Prefabs içinde {guids.Length} adet Prefab bulundu.");

foreach (string guid in guids)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
Debug.Log($"Bulunan Prefab: {prefab.name} ({assetPath})");
}
}
}


3. Birden Fazla Kriterle Arama


Adında "Enemy" geçen ve Texture2D türünde olan tüm varlıkları bulmak için:
using UnityEditor;
using UnityEngine;

public static class AssetFinder
{
public static void FindEnemyTextures()
{
string[] guids = AssetDatabase.FindAssets("t:Texture2D n:Enemy");
Debug.Log($"Adında 'Enemy' geçen {guids.Length} adet Doku bulundu.");

foreach (string guid in guids)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
Debug.Log($"Bulunan Doku: {texture.name} ({assetPath})");
}
}
}


Pratik İpuçları


1. Editör Uzantılarında Dinamik Varlık Seçimi


Kendi özel editör pencerenizi veya Inspector'ınızı oluştururken, kullanıcıların belirli varlıkları elle sürükle-bırakmak yerine, projedeki uygun varlıkları otomatik olarak listelemek veya seçmek için AssetDatabase FindAssets kullanabilirsiniz. Örneğin, tüm yetenek ikonlarını listeleyip bir açılır menüden seçmelerini sağlamak.
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;

public class SkillIconSelectorWindow : EditorWindow
{
private List<Texture2D> skillIcons = new List<Texture2D>();
private int selectedIconIndex = 0;

[MenuItem("Tools/Skill Icon Selector")]
public static void ShowWindow()
{
GetWindow<SkillIconSelectorWindow>("Skill Icons");
}

private void OnEnable()
{
LoadSkillIcons();
}

private void LoadSkillIcons()
{
skillIcons.Clear();
string[] guids = AssetDatabase.FindAssets("t:Texture2D l:SkillIcon"); // 'SkillIcon' etiketli tüm dokuları bul
foreach (string guid in guids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
Texture2D icon = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
if (icon != null) skillIcons.Add(icon);
}
}

private void OnGUI()
{
if (skillIcons.Count == 0)
{
EditorGUILayout.LabelField("Hiç yetenek ikonu bulunamadı. Lütfen varlıklarınıza 'SkillIcon' etiketi ekleyin.");
return;
}

string[] iconNames = skillIcons.ConvertAll(icon => icon.name).ToArray();
selectedIconIndex = EditorGUILayout.Popup("Select Icon", selectedIconIndex, iconNames);

if (skillIcons.Count > selectedIconIndex)
{
Texture2D selectedIcon = skillIcons[selectedIconIndex];
GUILayout.Label(selectedIcon);
EditorGUILayout.ObjectField("Current Selection", selectedIcon, typeof(Texture2D), false);
}
}
}


2. Otomatik Referans Atama ve Doğrulama


Projenizdeki belirli bir ScriptableObject türünü (örneğin, oyun ayarlarını tutan bir GameSettings nesnesi) bulup, başka bir editör script'inde ona otomatik olarak referans atayabilir veya varlığın doğru yerde olup olmadığını doğrulayabilirsiniz. Bu, özellikle büyük projelerde tutarlılığı sağlamak için çok faydalıdır.

3. Performans İçin Önbellekleme


Eğer aynı AssetDatabase FindAssets sorgusunu editörde defalarca çalıştırmanız gerekiyorsa (örneğin, her OnGUI çağrısında), bu durum editörün yavaşlamasına neden olabilir. Bu tür durumlarda, GUID'leri veya hatta doğrudan yüklenmiş varlıkları önbelleğe almak mantıklıdır. Varlıklar değiştiğinde (yeni bir varlık eklendiğinde, silindiğinde veya taşındığında) önbelleği yenilemeniz gerekebilir. Bu genellikle AssetPostprocessor veya EditorApplication.projectChanged gibi olaylarla yapılabilir.

Yaygın Hatalar ve Çözümleri


1. Yanlış Filtre String'i Kullanımı


Hata: Filtre string'inde yazım hataları yapmak veya beklenen varlık türü/adı ile eşleşmeyen filtreler kullanmak. Örneğin, t:Texure2D yerine t:Texture2D yazmak veya varlık adında "Player" olmamasına rağmen n:Player filtresini kullanmak.

Çözüm: Unity'nin proje penceresindeki arama çubuğunu kullanarak filtrelerinizi önceden test edin. Doğru sonuçları aldığınızdan emin olduktan sonra koduza entegre edin. Filtre string'lerinin büyük/küçük harf duyarlılığına dikkat edin (özellikle tür isimlerinde).

2. Runtime'da Kullanmaya Çalışmak


Hata: AssetDatabase.FindAssets() metodunu oyunun çalışma zamanında (örneğin bir MonoBehaviour'ın Start() metodunda) çağırmaya çalışmak.

Çözüm: AssetDatabase sınıfı sadece Unity Editör'ünde kullanılabilir. Eğer oyunun çalışma zamanında varlıklara ihtiyacınız varsa, varlıkları önceden editörde bulup referanslarını oyun nesnelerinize atayın, Resources.Load() kullanın veya Unity'nin Adreslenebilir Varlıklar (Addressable Assets) sistemini değerlendirin.

3. GUID'den Obje'ye Dönüştürmeyi Unutmak


Hata: AssetDatabase.FindAssets()'in GUID dizisi döndürdüğünü unutup, doğrudan bu diziyi kullanmaya çalışmak.

Çözüm: Her zaman GUID'leri AssetDatabase.GUIDToAssetPath() ile yola, ardından AssetDatabase.LoadAssetAtPath() ile gerçek varlık nesnelerine dönüştürmeniz gerektiğini unutmayın.

4. Arama Kapsamını Daraltmamak


Hata: Çok geniş kapsamlı aramalar yapmak (örneğin sadece t:Texture2D gibi) ve büyük projelerde bu aramaların editörde yavaşlamaya neden olması.

Çözüm: Mümkün olduğunca spesifik filtreler kullanın. Eğer varlıklarınız belirli bir klasördeyse, p:FolderPath filtresini kullanarak arama kapsamını daraltın. Bu, hem performansı artırır hem de yanlışlıkla istenmeyen varlıkların bulunmasını engeller.

Performans ve Optimizasyon Notları


AssetDatabase.FindAssets() bir editör API'si olduğu için, oyununuzun runtime performansını doğrudan etkilemez. Ancak, editörde sıkça veya çok geniş kapsamlı aramalar yapmak, editörün yanıt verme süresini olumsuz etkileyebilir. Özellikle büyük projelerde, yüz binlerce varlık arasında arama yapmak zaman alabilir. Bu nedenle:

  • Gereksiz yere tekrarlanan çağrılardan kaçının. Bir varlık listesine ihtiyacınız varsa, bunu bir kez yükleyin ve önbelleğe alın.

  • Arama kapsamını her zaman mümkün olduğunca daraltın. Klasör filtreleri (p: veya f:) bu konuda çok yardımcı olur.

  • Eğer varlıklarınızın değiştiğini biliyorsanız (örneğin yeni bir varlık içeri aktarıldıysa), AssetDatabase.Refresh() çağrısı yapmanız gerekebilir, ancak bu da pahalı bir işlemdir ve dikkatli kullanılmalıdır.


AssetDatabase FindAssets, Unity editöründe güçlü ve esnek varlık arama yetenekleri sunar. Bu metodu ustaca kullanarak, kendi editör araçlarınızı geliştirebilir, proje iş akışlarınızı otomatikleştirebilir ve genel üretkenliğinizi önemli ölçüde artırabilirsiniz.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!