Unity Android Sosyal Medyada İçerik Paylaşma

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

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 unitypackage‘ı Assets-Import Package yoluyla projenize import edin: https://github.com/yasirkula/UnityNativeShare/raw/master/NativeShare.unitypackage

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.

Eğer Android’e build alacaksanız, projenizin Assets/Plugins/Android klasöründe bir AndroidManifest.xml dosyası bulunması gerekiyor. Henüz bir AndroidManifest’iniz yoksa C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer konumundaki Unity’nin varsayılan AndroidManifest.xml dosyasını kopyalayıp (dosya Apk gibi bir alt klasörde de olabilir) projenizin Assets/Plugins/Android klasörüne yapıştırın (Plugins veya Android klasörleri yoksa elle oluşturun).

Ardından AndroidManifest’te <application>...</application> etiketleri arasına şunu yapıştırın:

<provider // >_>
  android:name="com.yasirkula.unity.UnitySSContentProvider"
  android:authorities="EŞSİZ_BİR_STRİNG"
  android:exported="false"
  android:grantUriPermissions="true" />

Buradaki “EŞSİZ_BİR_STRİNG“i kendinize has eşsiz bir yazı ile değiştirin (mesela oyununuzun bundle identifier‘ı). Bu değerin eşsiz olması gerekmesinin sebebi, bir cihaza aynı authorities‘e sahip birden çok uygulamanın yüklenememesidir. Bu string’de boşluk veya Türkçe karakter kullanmayın (ne olur ne olmaz). Örneğin:

DİKKAT: Eğer kamerayı kullanmaya yarayan NativeCamera plugin’imi de kullanıyorsanız, iki plugin’in provider‘larının EŞSİZ_BİR_STRİNG‘lerine birbirinden farklı değerler verin yoksa düzgün çalışmıyorlar.

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.

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.

İş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!" ).Share();
}

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

yorum
  1. 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

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

  3. Mehmet dedi ki:

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

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

yasirkula için bir cevap yazın Cevabı iptal et

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.