Unity에서 Android 일반 공유하기 기능

jinwook4217·2018년 11월 29일
2
post-thumbnail

앱에서 공유하기 기능은 자주 쓰이는 기능 중 하나입니다. 예를들어 자신의 스코어를 공유거나 게임에 초대하거나 또는 링크를 공유하는데 쓰입니다. 유니티에서 안드로이드 일반 공유하기 기능을 플러그인 없이 간단하게 구현할 수 있습니다.

일반 공유하기는 내 앱에서 다른앱을 통해 텍스트나 이미지를 전달하는 기능입니다. 긴말없이 바로 코드를 보겠습니다.


AndroidShare.cs

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 블록을 사용하면 다음과 같습니다.

AndroidShareUsing.cs

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
	}
}

사실 저 메서드가 자주 쓰이는 것은 아니지만 어쨋든 부하를 줄이는 건 좋은거니까요. 메뉴얼대로 따라줍시다. 감사합니다. (깨알같은 앱 홍보)

profile
유니티 개발을 조금씩 해왔습니다.

1개의 댓글

comment-user-thumbnail
2021년 10월 19일

도움이 크게 됬습니다. 감사합니다!!

답글 달기