Unity Android Sosyal Medyada İçerik Paylaşma

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

Tekrardan merhabalar,

Bu Unity dersinde, Android ve iOS platformlarında nasıl sosyal medyada dosya ve(ya) yazı paylaşabileceğinizi göstereceğim. Bu şekilde, örneğin level bitince, kullanıcı skorunu veya oyundan bir screenshot’ı Facebook, WhatsApp, Twitter vs. sosyal platformlarda paylaşabilir.

Hazırsanız başlayalım…

Kurulum

Öncelikle şu adresteki NativeShare.unitypackage‘ı Assets-Import Package yoluyla projenize import edin: https://github.com/yasirkula/UnityNativeShare/releases

Alternatif olarak, asset’i Asset Store’dan da import edebilirsiniz: https://assetstore.unity.com/packages/tools/integration/native-share-for-android-ios-112731

Eğer iOS’a build alacaksanız, Plugins/NativeShare/Editor/NSPostProcessBuild.cs scriptindeki PHOTO_LIBRARY_USAGE_DESCRIPTION‘ın değerini dilerseniz değiştirin. Buraya girdiğiniz yazı, kullanıcı paylaşılan resmi veya videoyu galeriye kaydetmek isterse, galeriye erişim izni isterken gözükecek. Android’e build alacaksanız özel bir şey yapmanız gerekmiyor.

Kullanım

Öncelikle new NativeShare() şeklinde yeni bir NativeShare objesi oluşturun. Ardından bu objenin aşağıdaki fonksiyonlarından istediklerinizi çağırarak paylaşılan içeriği kişiselleştirebilirsiniz:

SetSubject( string subject ): Paylaşılan içeriğin konusunu belirler. Bu değer daha çok e-posta uygulamalarında kullanılır.

SetText( string text ): Paylaşılan içeriğe yazı ekler. Ancak Facebook gibi bazı uygulamalar hem resim hem de yazı paylaşmaya kalkışırsanız yazıyı yoksayarlar, bu konuda maalesef yapacak bir şey yok.

AddFile( string filePath, string mime = null ): Paylaşılan içeriğe dosya (örneğin resim veya video) eklemeye yarar. Bu fonksiyonu birden çok kez çağırarak birden fazla dosyayı aynı anda paylaşabilirsiniz. filePath‘e değer olarak dosyanın konumunu girin. Eğer dosyanın mime‘ını biliyorsanız mime parametresine değer olarak girebilirsiniz (örneğin PNG resim paylaşıyorsanız image/png girebilirsiniz). Bilmiyorsanız veya uğraşmak istemiyorsanız bu değeri null olarak bırakabilirsiniz. Bu durumda dosyanın mime’ı, dosya uzantısından otomatik olarak belirlenmeye çalışılacaktır. mime parametresinin iOS’ta bir etkisi yoktur.

AddFile( Texture2D texture, string createdFileName = “Image.png” ): Texture2D objesini bir resim dosyasına çevirip paylaşılan içeriğe eklemeye yarar. Oluşturulan resim dosyasının ismi, createdFileName parametresi tarafından belirlenir.

SetTitle( string title ): İçeriğin paylaşılacağı uygulamayı seçmeye yarayan diyaloğun başlığındaki yazıyı belirler. Bu parametrenin iOS’ta bir etkisi yoktur.

SetCallback( ShareResultCallback callback ): Kullanıcı içeriği paylaştıktan sonra, callback fonksiyonunun otomatik olarak çağrılmasını sağlar. Bu fonksiyon 2 parametre alır:

  • ShareResult result: Kullanıcı içeriği paylaştıysa Shared, işlemi iptal ettiyse NotShared, bu bilgi edinilemiyorsa Unknown değerini alır. Maalesef ki çoğu uygulama, kullanıcı uygulamayı açtıktan sonra içeriği paylaşmasa bile Shared döndürür; bunun önüne geçmek mümkün değildir
  • string shareTarget: Kullanıcı içeriği hangi uygulama ile paylaşmayı seçtiyse, o uygulamanın class ismini döndürür. Bu bilgi edinilemiyorsa null veya boş bir string döndürür

İşiniz bitince NativeShare objesinin Share() fonksiyonunu kullanarak içeriği paylaşabilirsiniz.

Örnek Kod

Aşağıdaki kod, ekrana tıklayınca screenshot alıp bu screenshot’ı bir yazı ve konu eşliğinde paylaşmaya yarar:

void Update()
{
	if( Input.GetMouseButtonDown( 0 ) )
		StartCoroutine( ScreenshotAlVePaylas() );
}

private IEnumerator ScreenshotAlVePaylas()
{
	yield return new WaitForEndOfFrame();

	Texture2D ss = new Texture2D( Screen.width, Screen.height, TextureFormat.RGB24, false );
	ss.ReadPixels( new Rect( 0, 0, Screen.width, Screen.height ), 0, 0 );
	ss.Apply();

	// Screenshot'ı geçici bir dosyaya yaz
	string dosyaKonumu = Path.Combine( Application.temporaryCachePath, "geçici resim.png" );
	File.WriteAllBytes( dosyaKonumu, ss.EncodeToPNG() );

	// Artık screenshot'a ihtiyacımız kalmadı
	Destroy( ss );

	// Dosyayı yazı ve konu eşliğinde paylaş
	new NativeShare().AddFile( dosyaKonumu )
		.SetSubject( "Konu buraya gelecek" ).SetText( "Merhaba Dünya!" )
		.SetCallback( ( result, shareTarget ) => Debug.Log( "Paylaşma durumu: " + result + ", seçilen uygulama: " + shareTarget ) )
		.Share();
}

İşte bu kadar! İlerleyen derslerde görüşmek üzere…

yorum
  1. Enes dedi ki:

    Merhaba, direkt istediğimiz bir numaraya mesaj atmak için kullanılabilir mi? Nasıl yapılabilir?

  2. Enes dedi ki:

    Merhaba, ekran görüntüsü yerine image gameobject’ imizi png şeklinde atmak istersek nasıl yapmalıyız?

    • yasirkula dedi ki:

      Eğer Sprite’ı bir Sprite Atlas’a koymadıysanız, AddFile(image.sprite.texture) yapabilirsiniz. Aksi taktirde o Image’ın Sprite’ını Texture2D türünde bir değişkende tutup onu AddFile’a vermeniz gerekiyor.

  3. Mustafa dedi ki:

    Merhaba, dosya konumunda dosya türünü .pdf .docx yapsam bile SetText kısmındaki text whatsapp üzerinden normal text şeklinde atılıyor. docx ya da pdf şeklinde nasıl atılır?

    • yasirkula dedi ki:

      AddFile ile attığınız dosyalar dosya olarak, SetText ile attığınız metinler düz yazı olarak atılır. Hem metin hem dosya yollamaya çalıştığınızda, bazı uygulamalar ya metni ya da dosyayı yok sayabilir (bunu derste söylemediğimi fark ettim. Bu sıkıntı plugin’den ziyade, sosyal medya uygulamalarından kaynaklanıyor, bazıları metin ve dosya kısımlarının aynı anda otomatik olarak doldurulmasına izin vermiyor).

  4. Enes dedi ki:

    Merhabalar, android’e bir uygulama yapmak istiyorum. Quiz hazırlayıp insanlara sosyal ağlardan göndereceğiz. Onlar da gönderilmiş bağlantıya tıklayıp, telefonlarındaki yüklü uygulamaya quizi indirip çözebilecekler. Böyle bir dosya paylaşımı nasıl yapılır?

    • yasirkula dedi ki:

      Quizleri bence bir sunucuda tutmanız gerekecek. Her quiz’in sunucuda bir id’si var diyelim. Kullanıcılarla “quizuygulamam://QUIZ_IDSI” gibi bir link paylaşıp, “quizuygulamam” ile başlayan bu tarz linklerin sizin uygulamanız ile açılmasını işletim sistemine söylemeniz lazım: https://docs.unity3d.com/Manual/enabling-deep-linking.html. Linkin çalışması için tabi ki oyunun yüklü olması gerekiyor.

      • Enes dedi ki:

        Dosya şeklinde whatsapp benzeri bir yerden atılıp uygulamanın yüklü olduğu kişiler birlikte aç yapıp quizi çözmeleri tarzında bir şey mümkün mü? Sunucuyla uğraşmadan yani.

      • yasirkula dedi ki:

        Dosya uzantısını sizin uygulamanızın açabildiğini belirtirseniz mümkün. Ama benim bildiğim bu kadar, pratikte nasıl oluyor bilmiyorum.

  5. Ahmet dedi ki:

    Merhaba konudan bağımsız ama benim bir sorum olacaktı. Ben bir sinema salonu yapmak istiyorum ve o yüzden tarayıcı ekranını oyunu vermem gerekiyor bunu yapmamın bir yolu var mı?

    • yasirkula dedi ki:

      Projeye import ettiğiniz bir MP4 videoyu oyun içindeki bir materyale Texture olarak vermek istiyorsunuz diye anlıyorum. Bunun için VideoPlayer component’i ile ilgili video derslere bakabilirsiniz.

  6. nuri dedi ki:

    çok başarılı bir eklenti olmuş. benim bir sorum olacak paylaştığımız resmi link şeklinde paylaşmamız mümkün mü. yani tıklayınca oyunun adresine yönlendirebilir miyiz;

  7. USEL dedi ki:

    teşekkür ederim, emeğinize sağlık…..

  8. Murat Tatar dedi ki:

    Jake McNeal bunun kullanımını anlatan video çekmiş https://www.youtube.com/watch?v=vLJJoWzja7g
    5300 kişi izlemiş.
    Etkiniz ülke sınırlarını aşmış durumda. Teşekkürler!

  9. Mustafa Pomakoğlu dedi ki:

    Hocam native share eklentinizi kullanıyorum çok memnunum. Ancak kullanıcı oyun ya da uygulama içerisindeyken, uygulamadan çıkmadan play store da yorum yapmasını sağlayabileceğimiz bir eklenti yazmayı düşünüyor musunuz? Takdir edersiniz ki kullanıcı ne kadar çok beğenirse beğensin play store a girip ya da linke tıklayıp oy kullanmaya eriniyor. Bildiğim kadarıyla google bununla ilgili bir api geliştirdi fakat kullanımını hiçbir yerde görmedim.

  10. Atilla dedi ki:

    Hocam merhaba,
    Yazdığınız eklentiyi mobil oyunumda kullanıyorum. Tekrar çok teşekkürler. İlerleyen zamanlarda oyunu Play Store’da yayımlayacağım. Bu konuda şöyle bir sorum var:

    Eklenti ekran görüntüsünü geçici olarak kaydediyor ve oyunum bu veriyi başka bir yere, bir sunucuya vs. göndermiyor. Kullanıcı sosyal paylaşım işini yaptıktan sonra artık o ekran görüntüsü yok olmuş oluyor ama yine de son tahlilde kullanıcının ekranının görüntüsünü alma işlevi var kodumuzun içinde. Bu durum kullanıcı verisinin korunması açısından bir problem oluşturur mu? Google bu ekran görüntüsü alma meselesinden dolayı sorun çıkarabilir mi? Bununla ilgili privacy policy’ye eklememiz gereken bir şey olabilir mi?

    • yasirkula dedi ki:

      Ben bunun privacy policy’e eklenmesi gereken bir şey olduğunu düşünmüyorum ama avukat olmadığım için kesin cevap veremiyorum.

    • Enes dedi ki:

      Merhaba, siz yazınca benim de aklıma takıldı. Araştırdığımda bir şey bulamadım. Bu konuda bir şey eklememize gerek var mıymış? Öğrenebildiniz mi?

  11. Atilla dedi ki:

    Hocam merhaba,

    NativeShare paketini assetstore’dan import ettim. assets->plugins klasörü içinde paket görünüyor ancak Visual Studio ile, proje solutionu içindeki scriptlerde NativeShare classına erişemiyorum. Daha önce harici paket indirme deneyimim olmadı. İnternetten bayağı araştırdım ama çözümünü bulamadım.
    Çalışmalarınız için çok teşekkürler.

    • yasirkula dedi ki:

      Eğer Unity’nin konsolunda hata gözükmüyorsa Visual Studio sıkıntısını yoksayabilirsiniz. Unity de hata veriyorsa, Assembly Definition File kullanıyor musunuz?

      • Atilla dedi ki:

        Hızlı cevabınız için çok teşekkür ederim. Harikasınız!
        Unity’de denedim. “Shared” metni basıldı konsola. Herhangi bir hata kodu yok unity konsolunda. Assembly Definition File hiç kullanmadım.
        Bu arada, PC’de herhangi bir reaksiyon olmaması normal değil mi?
        Android için build alınca share özelliği açılacak galiba.

      • yasirkula dedi ki:

        PC’de böyle olması normal, dediğiniz gibi Android’de share özelliğinin açılması lazım. Unity hata vermediği için bence bu Visual Studio hatasını yoksayın.

      • Atilla dedi ki:

        Hocam Android build aldım ve paylaşım özelliği telefonda mükemmelen çalışıyor.
        Ellerinize sağlık!

  12. Mehmet dedi ki:

    Merhaba Yasir senin native share eklentini kullanmak istiyorum herşeyi yaptım AndroidManifest e ekledim ama build alırken bu hatayı alıyorum sebebi nedir https://imgyukle.com/i/E5G9sp

    • yasirkula dedi ki:

      Artık AndroidManifest’e bir şey eklemeniz gerekmiyor, otomatik olarak ekleme yapılıyor. Eklediğiniz provider satırını silip tekrar dener misiniz?

  13. Kürşat Kuyumcu dedi ki:

    Çok sağolun, yabancıların yaptığı pluginleri bir türlü çalıştıramadağımdan bu baya iyi geldi. Kullanımı kolay ve iyi çalışıyor.

  14. Bünyamin dedi ki:

    Hocam bununla uygulamamızı da Whatsapp, Facebook gibi yerlerde paylaşabilir miyiz?

    • yasirkula dedi ki:

      Bunlar gibi sosyal ağlarda, oyununuzdan resim veya yazı paylaşabilirsiniz. Uygulamanızı paylaşmaktan kastınız “X uygulamasını çok beğendim, hadi sen de dene!” gibi yazı paylaşmak ise evet bu mümkün. Minimum sıkıntı yaşamak için aynı anda sadece ya resim ya da yazı paylaşmanızı öneririm, ikisini birden paylaşınca bazı sosyal ağ uygulamaları ya resmi ya da yazıyı otomatik olarak paylaşılan içerikten silebiliyor.

  15. Arda dedi ki:

    tam olarak dediğiniz şeyi yapamadım normalde udemy üzerinden kurs aldım ama hoca cevap veremedği için tıkandım kusura bakmayın sizide yordum teşekkürler cevaplarınız için

    • yasirkula dedi ki:

      Şunun gibi bir koddan bahsettim:

      if (Random.Range (0, 2) == 0)
      Instantiate(elmas_prefab, son_zemin_konum + new Vector3( 0f, 2f, 5f ), Quaternion.identity);

      Veya elmas spawn etme kodunuzu direkt zeminin Awake fonksiyonuna taşıyabilirsiniz. Mesela %50 şans ile transform.position’da elmas spawn edebilirsiniz.

  16. Arda dedi ki:

    hocam benim untiy dosyasında PlaybackEngines\ yok

    • yasirkula dedi ki:

      Unity’nin kurulu olduğu konumda AndroidManifest.xml şeklinde arama yapabilirsiniz. Eğer Unity’i kurarken Android modülünü seçmediyseniz, kurulum dosyasını açıp Android modülünü de seçmeniz lazım. Unity’de Build Settings’ten platform olarak Android’e geçiş yapmaya çalıştığınızda başarısız oluyorsanız, bu da Android modülünün kurulu olmadığına bir işarettir.

      • Arda dedi ki:

        hocam yine konuyla alakası ama çözümünü bir türlü bulamadım
        ben zigzag tarzı oyun yapıyorum ve random yol oluşturmam böyle
        public class Zemin_Olusturucu : MonoBehaviour
        {
        public GameObject son_zemin;
        void Start()
        {
        for (int i = 0; i < 30; i++)
        {
        Zemin_Olustur();
        }
        }

        public void Zemin_Olustur()
        {
        Vector3 yon;
        if (Random.Range (0, 2) == 0)
        {
        yon = Vector3.left;
        }
        else
        {
        yon = Vector3.back;
        }
        son_zemin = Instantiate(son_zemin, son_zemin.transform.position + yon, son_zemin.transform.rotation);
        }
        }
        ve ben elmas eklemek istiyorum bazı bölgelerine nasıl yaparım şimdiden teşekkürler

      • yasirkula dedi ki:

        Kodunuza “private Vector3 son_zemin_konum;” değişkenini ekleyip Instantiate’inizi şöyle değiştirmeyi deneyin:

        son_zemin_konum += yon + new Vector3( 0f, 0f, 10f );
        Instantiate(son_zemin, son_zemin_konum, Quaternion.identity);

        Elmas eklemek için ise Instantiate’in altında bir başka Random.Range kullanabilir, eğer kod if’in içine girerse “son_zemin_konum + new Vector3( 0f, 2f, 5f )” gibi bir konumda elmas spawn’layabilirsiniz.

  17. Mehmet dedi ki:

    android:name=”com.yasirkula.unity.UnitySSContentProvider” kısmındaki yasirkula yazan kısmı değiştirmek gerekiyor mu?

  18. mustafa pomakoğlu dedi ki:

    hocam unity asset store dan paketi indirdim. Android Manifest.xml dosyasına kod satırlarını ekledim. using System.IO; kütüphanesini ekledim. Yukarıdaki örnek kodu Paylas.cs isminde script dosyasının içine attım. Ancak ben bir butona tıklanınca ekranı paylaşmak istediğim için update fonksiyonunu kullanmadım. PaylasClick() diye bir fonksiyon oluşturup StartCoroutine( ScreenshotAlVePaylas() ); satırını içine yazdım. bu fonksiyonun da butona tıklanınca çalışmasını sağladım. Yukarıdaki örnekte de sadece geçici dosya.png yi screenshot.png olarak değiştirdim. Sistem hiçbir hata vermedi ama tepki de vermedi:) apk dosyasına çevirip cihazdan çalıştırdım. yine değişen bişey olmadı.

    İşiniz bitince NativeShare objesinin Share() fonksiyonunu kullanarak içeriği paylaşabilirsiniz. demişsiniz ama bu dosya MonoBehaviour olmadığından bir nesneye atıp Share() fonksiyonunu çalıştıramıyorum. Nerde eksik birşeyler yapıyorum acaba?

    • yasirkula dedi ki:

      Editörde çalışmaması normal ama Android’de çalışması lazımdı. ScreenshotAlVePaylas coroutine’inin, dosyanın ismi hariç örnek kodla birebir aynı olduğunu varsayıyorum. Bir ihtimal AndroidManifest’e satırları yanlış eklemiş olabilirsiniz, isterseniz AndroidManifest’inizi buradan veya mail yoluyla paylaşabilirsiniz. İlaveten, AndroidManifest.xml dosyanızın Assets/Plugins/Android klasörü içerisinde olduğundan emin olun (birebir bu konumda olmak zorunda, alt klasörlerde vs. de değil). Son olarak da, logcat kullanarak bir hata mesajı alıyor musunuz kontrol edebilirsiniz: https://yasirkula.com/2015/10/13/unity-android-oyunlarinizi-debug-etmek/

      • mustafa pomakoğlu dedi ki:

        Hocam herşeyi harfiyen uyguladım. Editörde çalıştırıyorum. Sıfır hatayla çalışıyor, konsola da Shared! yazdırıyor. logcat taraması yaptırdım hata vermiyor. Ancak sizin yazdığınız ilk cümleyi dikkatli okumadığım için 2 gündür uğraşıyorum:) Build edip cep telefonunda denemediğimi yeni farkettim. Paketleyip cihaza atınca ilk denemede sorunsuz çalıştı. Deneyecek arkadaşlar boşa zaman kaybetmesin diye yazma gereği duydum. Beni nasıl bir dertten kurtardığınızı bilseniz hocam. Sİze çok çok teşekkkür ederim.

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 )

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.