원리 개요 : Unity가 apk를 생성할 때 상대 경로가 Plugins/Android인 aar 파일을 apk에 입력합니다. Unity 자체 API를 통해 AndroidJavaClass는 aar의 코드를 호출하여 일부 Android 네이티브 레이어를 구현할 수 있습니다.
이 글의 내용 : AAR을 사용하여 Unity와 통신하는 기본적인 과정을 주로 작성하며, 특정 SDK 등에 대한 접근은 포함하지 않습니다. 아주 좋습니다. 따라서 저는 몇 가지 기본적인 방법만 제공할 수 있고 다른 방법은 모든 사람이 각자의 연구를 수행하는 것에 의존할 수 있습니다.
생성 aar
aar을 생성하기 위한 일반적인 단계는 다음과 같습니다.
- AndroiStudio 편집기에서 새 빈 프로젝트를 만듭니다(aar 패키지의 캐리어로만 사용됩니다. 나중에 이 프로젝트에 포함된 많은 항목이 필요하지 않음을 알 수 있습니다).
- 새 모듈 Android 라이브러리 추가
- Unity에서 제공하는 class.jar 패키지를 가져옵니다(주로 컴파일을 통과하기 위해, Unity 코드를 사용하지 않지만 Unity가 java를 호출하는 경우에는 그럴 필요가 없습니다).
- 필요한 함수 코드를 작성하고 함수에 따라 AndroiManifest.xml 및 build.gradle을 조정합니다. (주로 일부 참조 및 기타 콘텐츠를 구성하지만 반드시 조정할 필요는 없습니다.)
- Gradle의 assemble task를 실행합니다. (Debug, Release 버전을 선택할 수 있으나 조정 없이 동일하므로 단순 접근시에는 걱정하지 않으셔도 됩니다.)
다음은 각 단계의 작동을 자세히 소개합니다.
1. 빈 프로젝트를 새로 생성합니다
AndroidStudio를 처음 열면 프로젝트를 생성하라는 메시지가 표시됩니다. 프로젝트 템플릿이 제공됩니다. 가장 깔끔한 Android 프로젝트를 보려면 활동 없음을 선택하세요. 가장 간단한 표시를 원하거나 그냥 BasicActivity를 사용하세요. 둘 사이의 차이는 그리 크지 않습니다. 여기서는 No Activity를 만듭니다.
이 인터페이스는 프로젝트 이름과 기타 정보를 설정합니다. 이름과 패키지 이름은 서로 관련이 없습니다. 원하는 대로 가져오면 됩니다. 이러한 매개변수는 일반적으로 나중에 관련되지 않습니다.
AndroidStudio 왼쪽에는 현재 프로젝트의 구조를 볼 수 있는 옵션이 있는데, 프로젝트를 선택하면 하드디스크에 있는 프로젝트의 실제 디렉터리 구조가 표시되고, 안드로이드를 선택하면 간소화됩니다. 안드로이드를 개발할 때 파일에 주의를 기울이세요. , 이는 거의 영향을 미치지 않습니다.
빈 안드로이드 프로젝트에는 실제로 많은 파일이 있지만 실제로는 두 부분만 있는 것 같습니다. 앱은 우리 자신의 코드, 아이콘 및 개발 단계에서 주의해야 할 다른 컨텐츠들 또 다른 Gradle은 apk 생성 시 릴리즈 단계에서 주의를 기울여야 하는 부분인데, 앱 폴더에서도 마찬가지이므로 신경 쓸 필요가 없습니다. 개발 단계에서 Gradle과 관련된 모든 것에 대해 자세히 설명합니다(일부 종속성 등을 추가하려는 경우는 제외).
2. 새 모듈 추가
왼쪽 상단에서 파일>ProjectStucture를 선택하여 다음 패널을 엽니다.
기사 시작 부분에서 언급했듯이 우리는 aar용 캐리어를 생성하기 위해 이 Android 앱 프로젝트를 만들었습니다. 먼저 이 위치에 모듈을 추가할 수 있습니다(+ 기호 클릭).
모듈 이름과 PackageName도 마찬가지이며 임의적일 수 있지만 Unity가 이 패키지 이름 + 클래스 이름을 통해 Java 함수의 위치를 찾을 수 있기 때문에 여기서 패키지 이름은 Unity가 호출할 때 사용됩니다.
앱모듈을 선택해서 제거하면 실제로는 필요없기 때문에 삭제하지 않아도 상관없지만 여기서는 눈에 거슬리고 작업하기 불편할 뿐입니다.
제거 후에도 앱은 실제로 디스크에 남아 있지만 이제 마우스 오른쪽 버튼을 클릭하여 삭제할 수 있습니다. 여기서 삭제할 수 있습니다. 동시에 방금 생성한 라이브러리가 이미 있고 구조가 있음을 확인할 수 있습니다. 내부는 앱과 비슷합니다. 특별히 신경쓰실 부분은 없습니다.
내부의 두 폴더는 삭제할 수 있습니다. 둘 다 테스트용이므로 사용하지 않습니다. 이를 변경한 후 이 경로 아래의 build.gradle로 이동하여 여러 테스트 도구에 대한 참조를 제거할 수도 있습니다. 이 도구의 특정 기능을 알고 있어야 합니다. 이 도구를 삭제해도 후속 프로세스에 영향을 미치지 않는다고 말할 수 있습니다.) Gradle을 수정할 때마다 Android Studio는 이를 동기화하라는 메시지를 표시합니다. 여기서 Java가 인터넷. , 이때는 이전에 VPN을 구성한 적이 있을 수 있으므로 Baidu를 사용하고 삭제하세요.
3. Unity에서 제공하는 class.jar 패키지를 가져옵니다.
이 jar 패키지의 경로는 unity 설치 디렉터리 아래에 있습니다. 상대 경로는 다음과 같습니다. 저는 2019.4.19f1 버전을 사용하고 있습니다. 이 버전의 jar 패키지는 2019.4.19f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp 입니다. \Release\Classes
. UnityPlayerActivity Java 클래스가 없습니다. 이 클래스는 2019.4.19f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player 아래에 있습니다. 직접 가져와야 합니다. 여기서는 사용할 수 없습니다. 이므로 가져오지 않습니다.
libs 아래로 드래그하면 됩니다. 이때 파일은 디스크에만 배치되어 있습니다. 프로젝트는 아직 jar 패키지를 참조하지 않았으므로,classes.jar을 마우스 오른쪽 버튼으로 클릭하고 목록 하단에서 Add As Libraray를 선택해야 합니다. 일반적으로 이 jar 패키지에서 코드와 기타 내용을 볼 수 있습니다.
4. 코드 작성
이 단계는 사람마다 다르므로 이전 과정에서 기본 환경을 설정하고 나머지는 직접 사용자 정의하는 것이며 여기서는 테스트를 위한 가장 간단한 코드만 제공합니다.
package com.jodebug.myapplication;
import android.app.Fragment;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.unity3d.player.UnityPlayer;
public class TutorialTest extends Fragment {
private static final String TAG = "TestLibrary";
private String gameObjectName;
private static TutorialTest Instance = null;
public static TutorialTest GetInstance(String gameObject) {
if (Instance == null) {
Instance = new TutorialTest();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
private int callCount = 0;
public void UnityCall() {
callCount += 1;
// Java调用Unity代码,第一个参数是场景中,绑定了脚本的物体名,第二个参数是方法名,第三个参数是值
UnityPlayer.UnitySendMessage(gameObjectName, "JavaPluginCallback", String.valueOf(callCount));
}
}
여기에서는 AndroidManifest를 변경할 필요가 없으므로 이제 코드가 작성되었으므로 aar 패키징을 시작할 수 있습니다. 여기에 내 AndroidManifest(실제로는 기본 항목)의 콘텐츠를 게시합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jodebug.myapplication">
</manifest>
5. 조립 작업 실행
위치는 오른쪽, Gradle의 위치이고 내부에 myapplication 아래에 gear label이 있는 Task가 우리가 실행하고자 하는 Target입니다. 이것이 무엇인지 간단히 말씀드리자면 Gradle 패키지 스크립트에 대한 몇 가지 일반적인 지침입니다. Achievements는 패키지 지침이고 assemble_release 등은 접미사가 붙은 패키지의 다른 버전을 나타냅니다. Release는 릴리스 버전을 의미합니다. 접미사가 없으면 모든 버전이 생성됩니다. 실행 후 빌드 폴더 아래에 aar이 생성됩니다(설정되지 않은 경우 기본값이 됩니다).
때때로 이 위치에서 작업이 표시되지 않을 수 있습니다. 이때는 일반적으로 이미 실행 중인 다른 Gradle 작업이 있기 때문입니다. 이 경우 인터페이스 상단에 작업 목록이 표시되지 않는 이유를 설명하는 메시지가 표시됩니다. 표시됩니다. 이때 들어가세요. "실행 중 다른 작업을 실행하지 않음" 옵션을 선택 해제하면 됩니다.
작업을 실행한 후 우리가 생성할 aar는 이 경로 아래에 생성되고 나머지는 Unity에서 프로세스가 진행됩니다.
Unity 사용 aar
Unity 프로젝트를 빌드하고 aar 파일을 Plugins/Android 디렉터리에 넣으면 됩니다.단,
이전에 aar에서 class.jar 패키지를 참조했지만 Unity도 참조하기 때문에 이때 패키징할 때 실제로 오류가 보고됩니다. apk 패키징할 때 해당 내용은 반복 참조이므로 aar에 있는classes.jar 패키지를 삭제하고 압축된 패키지(본질적으로는 압축된 패키지) 형태의 aar 파일을 직접 열어야 합니다. delete는 여기서의 class.jar이 아니라 libs에 있는 것입니다
. 여기서는 우리가 직접 작성한 코드에 의해 생성된 jar입니다.
그 후에 우리가 해야 할 일은 C# 코드에서 Java 코드를 뺀 것뿐입니다.
using System;
using UnityEngine;
using UnityEngine.UI;
public class JavaConnector : MonoBehaviour
{
private readonly string className = "com.jodebug.myapplication.TutorialTest";
public Text javaCallUi;
public Text javaCallbackUi;
private int _callCount = 0;
public void CallJava()
{
try
{
var pluginObj =
new AndroidJavaClass(className).CallStatic<AndroidJavaObject>("GetInstance", gameObject.name);
pluginObj.Call("UnityCall");
_callCount++;
javaCallUi.text = "call:" + _callCount.ToString();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
public void JavaPluginCallback(string text)
{
javaCallbackUi.text = "back:" + text;
}
}
여기서는 버튼 클릭 이벤트를 바인딩하는 과정을 숨깁니다. Unity 기반이라면 어렵지 않을 것입니다. 코드에 대한 간략한 설명은 클릭할 때마다 Unity에서 호출 횟수 + 1을 표시한다는 것입니다. Java 레이어에 있습니다. 이때 Java 레이어에 Unity 레이어를 차례로 호출하도록 요청했습니다. 상호 운용성이 있으면 javacallback도 디스플레이를 업데이트합니다. 이 스크립트는 장면의 모든 개체(이름 이름은 동적으로 Java 레이어에 전달되었기 때문에 중요하지 않습니다.) 이 시점에서 코드가 작성되고 Unity는 테스트를 패키징합니다.
최종 효과
처음에는 무작위로 쓴 숫자 11을 두 개 넣었는데, 클릭할 때마다 클릭 횟수와 콜백 실행 횟수가 표시됩니다.