
Unity Oyun İçi Dosya Seçme/Kaydetme Penceresi (Android Destekli) 2019
26 Ağustos 2019Yeniden merhabalar,
Bu Unity dersinde, oyun esnasında nasıl dosya seçme veya kaydetme diyaloğu gösterebileceğimizi göreceğiz. Bu diyalog, Windows’a ilaveten Android platformunu da desteklemekte. Deneme şansım olmasa da büyük olasılıkla Mac ve Linux platformları da sorunsuz bir şekilde destekleniyordur.
İndirmelinki: https://github.com/yasirkula/UnitySimpleFileBrowser/raw/master/SimpleFileBrowser.unitypackage
Kurulum
İndirdiğiniz unitypackage‘ı Assets-Import Package yoluyla projenize import edin.
Eğer plugin’i Android’de kullanmayı düşünüyorsanız, Edit-Project Settings-Player‘dan Write Permission‘ı External (SDCard) yapın.
Kullanım
Plugin’i kullanmaya yarayan fonksiyonlar, FileBrowser sınıfının içerisinde bulunmakta. Ancak bu sınıfa erişmeden önce, kodunuzun başına using SimpleFileBrowser;
eklemeniz lazım.
A) Diyalog Göstermek
bool ShowSaveDialog( OnSuccess onSuccess, OnCancel onCancel, bool folderMode = false, string initialPath = null, string title = "Save", string saveButtonText = "Save" )
Dosya kaydetme diyaloğu gösterir. Plugin aynı anda sadece bir diyalog gözükmesine izin verdiği için, eğer zaten aktif olan bir diyalog varsa, bu fonksiyon bir şey yapmadan direkt false döndürür. Aksi taktirde true döndürülür. Halihazırda aktif bir diyalog var mı kontrol etmek için, FileBrowser.IsOpen‘ın değerine bakabilirsiniz (true ise aktif bir diyalog vardır).
onSuccess: Dosyanın kaydedileceği konum seçildikten sonra bu fonksiyon çağrılır. Buraya string parametre alan bir fonksiyon girilmek zorundadır. Dosyanın kaydedileceği konum bu string’de depolanır.
onCancel: Dosya kaydetme işlemi iptal edilirse bu fonksiyon çağrılır. Bu fonksiyon bir parametre almaz. Eğer işlem iptal edilince özel bir şey yapmak istemiyorsanız, onCancel’a değer olarak null verebilirsiniz.
folderMode: Eğer değeri true olursa, dosya kaydetme diyaloğu yerine klasör kaydetme diyaloğu gözükür.
initialPath: Diyalog ilk açıldığında hangi klasörün içinde olacağımızı belirler. Varsayılan olarak diyalog Belgelerim ile başlar.
title: Diyaloğun başlığında yazacak olan yazıyı belirler.
saveButtonText: Diyaloğun kaydet butonunda yazacak olan yazıyı belirler.
bool ShowLoadDialog( OnSuccess onSuccess, OnCancel onCancel, bool folderMode = false, string initialPath = null, string title = "Load", string loadButtonText = "Select" )
Dosya seçme diyaloğu gösterir. loadButtonText, diyaloğun seç butonunda yazacak olan yazıyı belirler.
IEnumerator WaitForSaveDialog( bool folderMode = false, string initialPath = null, string title = "Save", string saveButtonText = "Save" )
ShowSaveDialog gibi, bu fonksiyon da dosya kaydetme diyaloğu gösterir. Ancak bu fonksiyon bir IEnumeratordöndürdüğü için, yield komutu vasıtasıyla bir coroutine içerisinde bekletilebilir. Diyalog kapanana kadar yield devam eder.
Diyalog kapatıldıktan sonra, işlemin iptal edilip edilmediğini öğrenmek için FileBrowser.Success‘in değeri kontrol edilebilir. Eğer değeri true ise işlem iptal edilmemiştir. Bu durumda dosyanın kaydedileceği konum FileBrowser.Result‘ta depolanır.
IEnumerator WaitForLoadDialog( bool folderMode = false, string initialPath = null, string title = "Load", string loadButtonText = "Select" )
ShowLoadDialog‘un WaitForSaveDialog gibi coroutine destekleyen versiyonudur.
void HideDialog( bool invokeCancelCallback = false )
Aktif bir diyalog varsa onu zorla kapatmaya yarar. Eğer invokeCancelCallback‘in değeri true ise, o diyaloğu açan fonksiyonun onCancel‘ı çalıştırılır.
B) Diyaloğu Kişiselleştirmek
bool AddQuickLink( string name, string path, Sprite icon = null )
Diyaloğun hızlı erişim menüsüne yeni bir klasör ekler. name, bu klasörün ismini belirlerken path ise klasörün konumunu tutar. Eğer bir ikon belirlenmezse, varsayılan olarak klasör ikonu kullanılır.
void SetExcludedExtensions( params string[] excludedExtensions )
Yoksayılacak dosya uzantılarını belirler. Varsayılan olarak, kısayol uzantısı olan .lnk ve sistem geçici dosya uzantısı olan .tmp uzantılı dosyalar yoksayılır.
void SetFilters( bool showAllFilesFilter, params string[] filters )
Dosya uzantılarını filtrelemeye yarar. Eğer showAllFilesFilter’ın değeri true ise, tüm dosya uzantılarını göstermeye yarayan “All Files (.*)” isimli bir filtre de listeye eklenir. Klasör seçme/kaydetme modunda bu filtrelerin bir etkisi yoktur.
void SetFilters( bool showAllFilesFilter, params FileBrowser.Filter[] filters )
Dosya uzantılarını filtrelemenin daha gelişmiş bir yoludur. Bir önceki fonksiyonda her bir dosya uzantısı ayrı bir filtre olurken bu fonksiyonda örneğin .jpeg ve .png uzantılarını tek bir filtrede birleştirmek mümkündür. FileBrowser.Filterobjesinin constructor’ı, parametre olarak filtre için bir isim ve ardından filtrelenecek uzantıları alır.
bool SetDefaultFilter( string defaultFilter )
Diyalog açıldığında varsayılan olarak aktif olacak olan filtreyi belirler.
C) Çalışma Zamanı İzinleri (Runtime Permissions) Hakkında
Android 6.0 sürümü itibariyle artık önemli bir Android fonksiyonuna erişmeden önce, çalışma zamanında bu fonksiyona erişim izni istemek zorundayız. FileBrowser fonksiyonları, çalışmadan önce otomatik olarak cihazdaki dosyalara erişim izni isterler ancak dilerseniz kendi başınıza da bu iznin durumunu sorgulayabilir veya izin isteyebilirsiniz.
Permission CheckPermission()
Cihazdaki dosyalara erişim izninin durumunu sorgular ve bir FileBrowser.Permission enum‘u döndürür. Eğer dosyalara erişim iznimiz varsa, bu enum’un değeri Permission.Granted olurken eğer henüz iznimiz yoksa Permission.ShouldAsk olur. Eğer kullanıcı karşısına gelen izin ekranını “Bir daha sorma” seçili bir şekilde reddederse veya kullanıcının cihazında aktif olan bir ebeveyn kontrol sistemi bu iznin verilmesini engelliyorsa, Permission.Denied döndürülür. Bu durumda kullanıcı izni cihazın ayarlar menüsünden elle vermek zorundadır.
Eğer dosyalara erişim iznimiz yoksa, diyalog güvenlik sebebiyle çoğu klasörün içini gösteremeyecektir.
Permission RequestPermission()
Dosyalara erişim izni ister ve sonucu bir FileBrowser.Permission enum’unda döndürür. Diyalog göstermeye yarayan fonksiyonlar, bu fonksiyonu otomatik olarak çağırırlar.