Unity는 aar를 사용하여 Android와 통신합니다(기본 프로세스).

원리 개요 : Unity가 apk를 생성할 때 상대 경로가 Plugins/Android인 aar 파일을 apk에 입력합니다. Unity 자체 API를 통해 AndroidJavaClass는 aar의 코드를 호출하여 일부 Android 네이티브 레이어를 구현할 수 있습니다.

이 글의 내용 : AAR을 사용하여 Unity와 통신하는 기본적인 과정을 주로 작성하며, 특정 SDK 등에 대한 접근은 포함하지 않습니다. 아주 좋습니다. 따라서 저는 몇 가지 기본적인 방법만 제공할 수 있고 다른 방법은 모든 사람이 각자의 연구를 수행하는 것에 의존할 수 있습니다.

생성 aar

aar을 생성하기 위한 일반적인 단계는 다음과 같습니다.

  1. AndroiStudio 편집기에서 새 빈 프로젝트를 만듭니다(aar 패키지의 캐리어로만 사용됩니다. 나중에 이 프로젝트에 포함된 많은 항목이 필요하지 않음을 알 수 있습니다).
  2. 새 모듈 Android 라이브러리 추가
  3. Unity에서 제공하는 class.jar 패키지를 가져옵니다(주로 컴파일을 통과하기 위해, Unity 코드를 사용하지 않지만 Unity가 java를 호출하는 경우에는 그럴 필요가 없습니다).
  4. 필요한 함수 코드를 작성하고 함수에 따라 AndroiManifest.xml 및 build.gradle을 조정합니다. (주로 일부 참조 및 기타 콘텐츠를 구성하지만 반드시 조정할 필요는 없습니다.)
  5. 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을 두 개 넣었는데, 클릭할 때마다 클릭 횟수와 콜백 실행 횟수가 표시됩니다.

Supongo que te gusta

Origin blog.csdn.net/qq_37421018/article/details/125726386
Recomendado
Clasificación