앱에서 공유하기 기능은 자주 쓰이는 기능 중 하나입니다. 예를들어 자신의 스코어를 공유거나 게임에 초대하거나 또는 링크를 공유하는데 쓰입니다. 유니티에서 안드로이드 일반 공유하기 기능을 플러그인 없이 간단하게 구현할 수 있습니다.
일반 공유하기는 내 앱에서 다른앱을 통해 텍스트나 이미지를 전달하는 기능입니다. 긴말없이 바로 코드를 보겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AndroidShare : MonoBehaviour {
private const string subject = "즐거운 피지컬 코딩과 메이커 교육앱 후르츠 루프! 지금 시작해 보세요";
private const string body = "https://play.google.com/store/apps/details?id=com.CEREALLAB.FruitsLoop&showAllReviews=true";
// 외부에서 Share메서드를 가져다 사용한다.
public void Share() {
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
intentObject.Call<AndroidJavaObject>("setType", "text/plain");
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), body);
AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject jChooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share Via");
currentActivity.Call("startActivity", jChooser);
#endif
}
}
참고: http://blog.naver.com/PostView.nhn?blogId=lidoukens&logNo=220600977533/
이렇게 작성해도 공유하기 기능은 정상적으로 작동됩니다. 그러나
주의해야 할 것은 AndroidJavaObject / AndroidJavaClass 의 처리가 매우 부하가 높다는 것입니다.
따라서 생성한 AndroidJavaObject와 AndroidJavaClass는 사용 후 모노 가비지컬렉터에서 Realease해야 합니다. 가능한 한 빨리 제거되도록 using(){ } 을 사용하여 관리하는 것이 좋습니다. 이것이 없으면 삭제된 것을 확인할 수 없습니다.
- 유니티 메뉴얼
Using 블록은 삭제(disposal; 해제)를 보장합니다. 흔히 쓰는 foreach 문에도 컴파일러는 using 블록으로 처리합니다. 컴파일러는 다음과 같은 코드를
foreach (var element in somethingEnumerable) { ... }
논리적으로 다음과 같은 코드로 바꾸어서 컴파일 합니다.
using (var rator = somthingEnumerable.GetEnumerator())
while (rator.MoveNext()) {
var element = rator.Current;
...
}
그래서 위 AndroidShare 코드를 using 블록을 사용하면 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AndroidShareUsing : MonoBehaviour {
private const string subject = "즐거운 피지컬 코딩과 메이커 교육앱 후르츠 루프! 지금 시작해 보세요";
private const string body = "https://play.google.com/store/apps/details?id=com.CEREALLAB.FruitsLoop&showAllReviews=true";
public void Share() {
#if UNITY_ANDROID && !UNITY_EDITOR
using (AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent"))
using (AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent")) {
intentObject.Call<AndroidJavaObject>("setAction", intentObject.GetStatic<string>("ACTION_SEND"));
intentObject.Call<AndroidJavaObject>("setType", "text/plain");
intentObject.Call<AndroidJavaObject>("putExtra", intentObject.GetStatic<string>("EXTRA_SUBJECT"), subject);
intentObject.Call<AndroidJavaObject>("putExtra", intentObject.GetStatic<string>("EXTRA_TEXT"), body);
using (AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"))
using (AndroidJavaObject jChooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share Via"))
currentActivity.Call("startActivity", jChooser);
}
#endif
}
}
사실 저 메서드가 자주 쓰이는 것은 아니지만 어쨋든 부하를 줄이는 건 좋은거니까요. 메뉴얼대로 따라줍시다. 감사합니다. (깨알같은 앱 홍보)
도움이 크게 됬습니다. 감사합니다!!