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…
Merhaba, direkt istediğimiz bir numaraya mesaj atmak için kullanılabilir mi? Nasıl yapılabilir?
Maalesef bu eklenti ile mümkün değil. Bu konuda araştırma yapmadığım için başka bir eklentiye de yönlendiremiyorum.
Merhaba, ekran görüntüsü yerine image gameobject’ imizi png şeklinde atmak istersek nasıl yapmalıyız?
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.
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?
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).
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?
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.
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.
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.
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ı?
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.
ç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;
Maalesef plugin’de bu özellik yok.
Teşekkürler..
teşekkür ederim, emeğinize sağlık…..
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!
Plugin’lerimi bu tarz birkaç YouTube videosunda görmüştüm. Paylaştığınız için teşekkür ederim.
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.
Rate plugin’i yazmayı planlamıyorum. Bahsettiğiniz API’nin resmî Unity dokümantasyonuna şuradan erişebilirsiniz: https://developer.android.com/guide/playcore/in-app-review/unity
Piyasadaki diğer çözümlerden bazıları (büyük ihtimalle bu API’yi kullanmıyorlar, ben denemedim):
– https://github.com/elraccoone/unity-request-review
– https://github.com/PingAK9/Mobile-Dialog-Unity
– https://github.com/nikhilagrawal2000/RatingPlugin
– https://github.com/sisso/UnityRate
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?
Ben bunun privacy policy’e eklenmesi gereken bir şey olduğunu düşünmüyorum ama avukat olmadığım için kesin cevap veremiyorum.
Peki. Çok teşekkür ederim.
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?
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.
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?
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.
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.
Hocam Android build aldım ve paylaşım özelliği telefonda mükemmelen çalışıyor.
Ellerinize sağlık!
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
Artık AndroidManifest’e bir şey eklemeniz gerekmiyor, otomatik olarak ekleme yapılıyor. Eklediğiniz provider satırını silip tekrar dener misiniz?
Ç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.
Ne demek, rica ederim.
Hocam bununla uygulamamızı da Whatsapp, Facebook gibi yerlerde paylaşabilir miyiz?
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.
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
Ş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.
hocam benim untiy dosyasında PlaybackEngines\ yok
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.
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
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.
android:name=”com.yasirkula.unity.UnitySSContentProvider” kısmındaki yasirkula yazan kısmı değiştirmek gerekiyor mu?
Çalışması için oraya hiç dokunmamanız lazım.
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?
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/
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.