Unity Oyun İçi Dosya Seçme/Kaydetme Penceresi (Android Destekli)

Yayınlandı: 05 Haziran 2018 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , , , , , , ,

Yeniden 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.

İndirme linki: https://github.com/yasirkula/UnitySimpleFileBrowser/raw/master/SimpleFileBrowser.unitypackage

Detaylar için yazının devamını okuyabilirsiniz…

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 IEnumerator dö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.Filter objesinin 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.

Örnek Kod

using UnityEngine;
using System.Collections;
using SimpleFileBrowser;

public class FileBrowserTest : MonoBehaviour
{
	// Not1: FileBrowser'un döndürdüğü konumların sonunda '\' karakteri yer almaz
	// Not2: FileBrowser tek seferde sadece 1 diyalog gösterebilir

	void Start()
	{
		// Filtreleri belirle (opsiyonel)
		// Eğer filtreler oyun esnasında hep aynı kalacaksa, filtreleri her seferinde
		// tekrar tekrar belirlemek yerine sadece bir kere belirlemek yeterlidir
		FileBrowser.SetFilters( true, new FileBrowser.Filter( "Resimler", ".jpg", ".png" ), new FileBrowser.Filter( "Metin Dosyaları", ".txt", ".pdf" ) );

		// Varsayılan filtreyi belirle (opsiyonel)
		// Eğer varsayılan filtre başarıyla belirlendiyse fonksiyon true döndürür
		// Bu örnekte, varsayılan filtre olarak .jpg'i tutan "Resimler"i belirle
		FileBrowser.SetDefaultFilter( ".jpg" );

		// Yoksayılacak dosya uzantılarını belirle (opsiyonel) (varsayılan olarak .lnk ve .tmp uzantılı dosyalar yoksayılır)
		// Bu fonksiyonu çağırırsanız, siz elle eklemediğiniz müddetçe .lnk ve .tmp uzantıları artık yoksayılmaz
		FileBrowser.SetExcludedExtensions( ".lnk", ".tmp", ".zip", ".rar", ".exe" );

		// Yeni bir hızlı erişim klasörü ekle (opsiyonel) (eğer işlem başarılı olursa true döndürülür)
		// Bir hızlı erişim klasörünü sadece bir kere eklemek yeterlidir
		// İsim: Kullanıcılar
		// Konum: C:\Users
		// İkon: varsayılan (klasör ikonu)
		FileBrowser.AddQuickLink( "Kullanıcılar", "C:\\Users", null );

		// Dosya kaydetme diyaloğu göster
		// onSuccess: null, bir şey yapma (bir başka deyişle, bu amaçsız bir diyalog)
		// onCancel: null, bir şey yapma
		// Klasör modu: kapalı (dosya modu aktif), İlk konum: "C:\", Başlık: "Farklı Kaydet", Kaydet butonu yazısı: "Kaydet"
		// FileBrowser.ShowSaveDialog( null, null, false, "C:\\", "Farklı Kaydet", "Kaydet" );

		// Klasör seçme diyaloğu göster 
		// onSuccess: klasörün konumunu konsola yazdır
		// onCancel: konsola "İptal edildi" yazdır
		// Klasör modu: açık, İlk konum: varsayılan (Belgelerim), Başlık: "Klasör Seç", Seç butonu yazısı: "Seç"
		// FileBrowser.ShowLoadDialog( (konum) => { Debug.Log( "Seçilen klasör: " + konum ); }, 
		//                                () => { Debug.Log( "İptal edildi" ); }, 
		//                                true, null, "Klasör Seç", "Seç" );

		// Coroutine örneğini çalıştır
		StartCoroutine( DosyaSecmeDiyaloguGosterCoroutine() );
	}

	IEnumerator DosyaSecmeDiyaloguGosterCoroutine()
	{
		// Dosya seçme diyaloğu göster ve kullanıcının diyaloğu kapatmasını bekle
		// Klasör modu: kapalı (dosya modu aktif), İlk konum: varsayılan (Belgelerim), Başlık: "Yüklenecek Dosyayı Seçin", Seç butonu yazısı: "Yükle"
		yield return FileBrowser.WaitForLoadDialog( false, null, "Yüklenecek Dosyayı Seçin", "Yükle" );

		// Diyalog kapatıldı
		// Konsola işlemin başarılı olup olmadığını yazdır (FileBrowser.Success)
		// Ayrıca seçilen dosyanın konumunu da yazır (FileBrowser.Result) (eğer FileBrowser.Success false ise, değeri null'dır)
		Debug.Log( FileBrowser.Success + " " + FileBrowser.Result );
	}
}

Sonraki derslerde görüşmek dileğiyle!

yorum
  1. PoeWang dedi ki:

    Bu sistem ile oyun içerisinde bir singletion objesini kaydedebilirmiyiz.Bu sayede bu singletion objesini başka bir oyunda kullanarak harita filan aktarılabilir diye düşündüm.

    • yasirkula dedi ki:

      Bu plugin’in tek yaptığı şey, bir klasör veya dosya yolu döndürmek. Ardından bu klasöre/dosyaya verilerinizi istediğiniz şekilde kaydetmek veya kayıtlı verileri yüklemek, plugin’in kapsamı dışında.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.