플러그인으로 유니티 에셋에 추가한 안드로이드 aar과 데이터를 주고받는 방식이다. 안드로이드 플러그인을 만드는 방법은 링크 참고. 아래는 유니티에서 aar에 유저ID를 보내고 해당 유저의 닉네임과 이메일주소 데이터를 받아와서 유니티 로그로 뿌리는 간단한 예제다.
Android로부터 받은 JSON데이터를 역직렬화하기 위한 데이터 클래스
using System;
using UnityEngine;
[Serializable]
public class UserData
{
[SerializeField]
private string userId;
[SerializeField]
private string nickname;
[SerializeField]
private string email;
public string UserId { get => userId; }
public string Nickname { get => nickname; }
public string Email { get => email; }
}
Android와 데이터를 주고받을 MonoBehaviour. 게임오브젝트에 컴포넌트로 붙어서 하이어라키에 올라가 있어야 작동한다.
using UnityEngine;
public class TransferWithAndroid : MonoBehaviour
{
void Start()
{
sendMessage();
}
/////////////////////////////////////
// 안드로이드에 데이터 보내기
/////////////////////////////////////
void SendMessage()
{
// 보낼 데이터 준비
string userId = "kje1234";
// 데이터를 받을 안드로이드 플러그인의 클래스 주소
string androidClass = "패키지명.모듈명.TransferWithUnity";
// 데이터를 받을 안드로이드 플러그인의 메소드명
string androidMethod = "receiveMessage";
// 데이터를 받을 안드로이드 클래스를 인스턴스화
AndroidJavaObject _javaInstance = new AndroidJavaObject(androidClass);
// 데이터 전송. 파라미터1: 호출할 안드로이드 메소드명, 파라미터2: 해당 메소드에 전달할 인자
// 전달할 인자가 둘 이상이면 object[] 배열에 인자들을 넣고 배열을 파라미터2에 넣으면 됨
_javaInstance.Call(androidMethod, userId);
}
/////////////////////////////////////
// 안드로이드로부터 데이터 받기
/////////////////////////////////////
// 메소드가 static이면 안 됨
void ReceiveMessage(string jsonMessage)
{
//수신한 JSON 데이터를 UserData객체로 역직렬화 (UnityEngine 라이브러리 사용)
UserData userData = JsonUtility.FromJson<UserData>(jsonMessage);
//수신한 데이터로 작업 예시: 로그 띄우기
Debug.Log("userId: " + userData.UserId);
Debug.Log("nickname: " + userData.Nickname);
Debug.Log("email: " + userData.Email);
}
}
안드로이드와 빈번하게 데이터를 주고받아서 안드로이드 인스턴스를 메모리에 계속 올려둘 필요가 있다면 AndroidJavaObject를 싱글턴 패턴으로 생성하는 방법을 고려해볼 수 있다. 이 방법에 대해서는 링크 참고.
JSON 변환을 위한 GSON 라이브러리 의존성 등록
dependencies {
implementation 'com.google.code.gson:gson:버전'
}
Unity로 보낼 데이터를 JSON으로 직렬화하기 위한 데이터 클래스
data class UserData(
val userId: String,
val nickname: String,
val email: String
)
Unity와 데이터를 주고받을 클래스
class TransferWithUnity {
/////////////////////////////////////
// 유니티로부터 데이터 받기
/////////////////////////////////////
// 메소드가 static (companion object) 이면 안 됨
fun receiveMessage(userId: String){
//받은 userId로 작업 진행 예시
val userData = UserData(userId, "rocketman", "kje1234@gmail.com")
sendMessage(userData)
}
/////////////////////////////////////
// 유니티에 데이터 보내기
/////////////////////////////////////
// UserData객체를 JSON으로 직렬화시켜서 전송 (GSON 라이브러리 사용)
fun sendMessage(userData: UserData){
val gson = Gson()
val jsonMessage = gson.toJson(userData)
// 데이터를 받을 유니티 스크립트가 컴포넌트로 붙어 있는 게임오브젝트명
val unityGameObject = "TransferWithAndroid"
// 데이터를 받을 유니티 스크립트의 메소드명
val unityMethod = "ReceiveMessage"
UnityPlayer.UnitySendMessage(unityGameObject, unityMethod, jsonMessage)
}
}