[JAVA] Wie erstelle ich Unity Native Plugin (Android-Version)

Überblick

Wenn Sie das für Android entwickelte SDK mit Unity-Apps kompatibel machen möchten, müssen Sie ein Plug-In erstellen, um die SDK- und Unity-Apps zu verbinden. Es gibt mehrere Möglichkeiten, native Plugins für Android zu implementieren. In diesem Artikel wird jedoch eine Methode vorgestellt, die UnityPlayerActivity erbt. Informationen zur Implementierung gemeinsamer Teile mit dem Plug-In für iOS finden Sie unter Common Edition.

Steckerseite

BaseNativeActivity BaseNativeActivity ist eine Klasse, die UnityPlayerActivity erbt. Es fungiert als Wrapper, indem es Methoden von Klassen aufruft, die im SDK definiert sind, wie z. B. Sample und SampleLifecycle.

BaseNativeActivity


public class BaseNativeActivity extends UnityPlayerActivity {
    public static final void setCallbackGameObjectName(String name) {
        SampleUnityListener.getInstance().setCallbackGameObjectName(name);
    }

    @Override
    protected void onStart() {
        super.onStart();
        SampleLifecycle.onStart(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        SampleLifecycle.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        SampleLifecycle.onPause(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SampleLifecycle.onDestroy();
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        return super.onPrepareOptionsMenu(menu);
    }

    public void start(String sampleCode) {
        Sample.getInstance().start(this);
    }

    public void doSomething() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Sample.getInstance().doSomething()
            }
        });
    }

    public int getScore() {
        return Sample.getInstance().getScore();
    }

    public String getSomeText() {
        return Sample.getInstance().getSomeText();
    }

    public boolean isAvailable() {
        return Sample.getInstance().isAvailable();
    }
}

SampleUnityListener SampleUnityListener ist eine Klasse zum Übertragen des Rückrufs auf der SDK-Seite an die Unity-Seite. Es implementiert SampleListener, eine auf der SDK-Seite definierte Listener-Klasse.

SampleUnityListener


public class SampleUnityListener implements SampleListener {
    private static final Sample sample = Sample.getInstance();
    private static SampleUnityListener instance;
    private String callbackGameObjectName;

    public synchronized static SampleUnityListener getInstance() {
        if (instance == null) {
            instance = new SampleUnityListener();
            sample.setListener(instance);
        }

        return instance;
    }

    public final void setCallbackGameObjectName(String name) {
        callbackGameObjectName = name;
    }

    @Override
    public void onStatusChanged(SampleStatus status) {
        if (callbackGameObjectName != null) {
            String statusIndex = String.valueOf(status.ordinal());
            UnityPlayer.UnitySendMessage(callbackGameObjectName, "_Sample_didStatusChange", statusIndex);
        }
    }
}

build.grade Dies ist ein Beispiel für build.gradle. Zusätzlich zum SDK selbst (SampleSDK- *. Jar) ist classes.jar im libs-Verzeichnis enthalten, um Klassen wie UnityPlayerActivity zu importieren. Es wird jedoch ausgeschlossen, da es zum Zeitpunkt der Erstellung nicht erforderlich ist. Da der Name von der Unity-Seite aufgelöst werden muss, wird minify ebenfalls auf false gesetzt.

build.gradle


apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "25.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:26.+'
}

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/classes.jar')
        output.packageLibrary.exclude('libs/SampleSDK-*.jar')
    }
}

Über bauen

Für Android Studio können Sie aar über Build-> Make Module erstellen. Das erstellte AAR sollte im Unity-Projekt unter Assets / Plugins / Android platziert werden. Informationen zur Erfassungsmethode von classes.jar, die zum Zeitpunkt der Kompilierung verwendet wurde, finden Sie unter hier.

Einheitsseite

Sample_Android.cs Sample_Android.cs ist eine Klasse, die [ISample] implementiert (https://qiita.com/maebaru/items/ff6c414427b4512a10c5#isamplecs). Wir werden überbrücken.

Sample_Android.cs


using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class Sample_Android : ISample {
    private Sample sampleGameObject;
    private SampleEventListener listener;
    private static AndroidJavaObject androidInstance;

    public Sample_Android(Sample sampleParent) {
        sampleGameObject = sampleParent;

        InitAndroidInstance();
        CreateListenerObject();

        if (sampleParent.androidSampleCode != null) {
            Start(null);
        }
    }

    private void CreateListenerObject() {
        listener = sampleGameObject.gameObject.AddComponent<SampleEventListener>();

        using (AndroidJavaObject activityObject = GetCurrentActivity()) {
            activityObject.CallStatic("setCallbackGameObjectName", sampleGameObject.gameObject.name);
        }

        listener.SetNativeParent(this);
    }

    public void Start(string sampleCode) {
        using (AndroidJavaObject activityObject = GetCurrentActivity()) {
            if (sampleGameObject.androidSampleCode != null) {
                activityObject.Call("start", sampleGameObject.androidSampleCode);
            } else if (sampleCode != null) {
                activityObject.Call("start", sampleCode);
            }
        }
    }

    public void DoSomething() {
        using (AndroidJavaObject activityObject = GetCurrentActivity()) {
            activityObject.Call("doSomething");
        }
    }

    public int GetScore() {
        using (AndroidJavaObject activityObject = GetCurrentActivity()) {
            return activityObject.Call<int>("getScore");
        }
    }

    public SampleStatus GetStatus() {
        SampleStatus status = SampleStatus.Unavailable;

        using (AndroidJavaObject statusObject = androidInstance.Call<AndroidJavaObject>("getStatus")) {
            string statusName = statusObject.Call<string>("name");

            if (statusName.Equals("Unavailable")) {
                status = SampleStatus.Unavailable;
            } else if(statusName.Equals("Available")) {
                status = SampleStatus.Available;
            }
        }

        return status;
    }

    public string GetSomeText() {
        return androidInstance.Call<string>("getSomeText");
    }

    public bool IsAvailable() {
        using (AndroidJavaObject activityObject = GetCurrentActivity()) {
            return activityObject.Call<bool>("isAvailable");
        }
    }

    public AndroidJavaObject GetCurrentActivity() {
        using (AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
            return playerClass.GetStatic<AndroidJavaObject>("currentActivity");
        }
    }

    protected static void InitAndroidInstance() {
        using (AndroidJavaClass sampleClass = new AndroidJavaClass("com.sdk.Sample")) {
            androidInstance = sampleClass.CallStatic<AndroidJavaObject>("getInstance"); 
        }
    }
}

AndroidManifest.xml Dies ist ein Beispiel für ein Android-Manifest, das unter Assets / Plugins / Android of Unity-Projekt platziert ist. Die oben erwähnte Base Native-Aktivität wird beschrieben.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player"
	  android:installLocation="preferExternal"
	  android:theme="@android:style/Theme.NoTitleBar"
	  android:versionCode="1" android:versionName="1.0">
  <supports-screens android:smallScreens="true"
		    android:normalScreens="true"
		    android:largeScreens="true"
		    android:xlargeScreens="true"
		    android:anyDensity="true" />
  <application android:label="@string/app_name" android:debuggable="false">
    <activity android:name="com.sample.plugin.BaseNativeActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
  </application>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

Proguard Wenn Sie Einstellungen vornehmen möchten, z. B. das Vermeiden von Minify für einige Klassen, erstellen Sie proguard-user.txt und platzieren Sie es unter Assets / Plugins / Android of Unity-Projekt. Es wird automatisch als Android-Projekt exportiert. Es wird reflektiert.

proguard-user.txt (Beispiel)


-keepattributes *Annotation*
-keepattributes Signature
-keep class com.sample.sdk.** {
  public <fields>;
  public <methods>;
}

-keep class com.sample.plugin.** {
    public <fields>;
    public <methods>;
}

-dontwarn com.sample.sdk.**

Verzeichnisaufbau

Platzieren Sie Folgendes nach Bedarf unter Assets / Plugins / Android des Unity-Projekts.

Referenz

https://docs.unity3d.com/ja/540/Manual/PluginsForAndroid.html

Recommended Posts

Wie erstelle ich Unity Native Plugin (Android-Version)
Wie schreibe ich React Native Bridge ~ Android-Version ~
So erstellen Sie ein Jenkins-Plug-In
[Android] So erstellen Sie ein Dialogfragment
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Wie man ein schattiertes Glas macht
Wie man einen imposanten Android-Musikplayer macht
Verwendung von Struts2 * Spring Framework (Spring Plugin) Version Juni 2017
So senken Sie die Java-Version
Java - So erstellen Sie JTable
So überprüfen Sie die JSF-Version
[Schienen] Wie man Samen macht
[Version 2020] So senden Sie eine E-Mail mit Android Studio Javamail
So erstellen Sie eine App mit Tensorflow mit Android Studio
Wie man eine Ansicht auf Android "aushöhlt"
So erstellen Sie einen JDBC-Treiber
So erstellen Sie einen Begrüßungsbildschirm
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
Android: Umgang mit "Java-Version von '10 .0.1 'konnte nicht ermittelt werden"
So erstellen Sie eine Java-Kalenderzusammenfassung
[Android] Wie man mit dunklen Themen umgeht
So erkennen Sie Mikrofonkonflikte unter Android
Wie erstelle ich einen Discord Bot (Java)
Hinzufügen von Informationen zur Anwendungsversion zu Sentry-Informationen
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
Verwendung von ExpandableListView in Android Studio
[Android] So konvertieren Sie eine Zeichenfolge in resourceId
[Android] So erkennen Sie Lautstärkeänderungen (= Drücken der Lautstärketaste)
So verkleinern Sie das Spring Boot Docker-Image
Verwenden der Native UI-Komponente mit React Native (Android-Version)
Erstellen Sie eine Software, die den Android-Bildschirm auf einen PC 1 spiegelt
So machen Sie doppelte Prüflogik lesbarer
So erstellen Sie eine leichte JRE für den Vertrieb
Verwendung des NFS-Protokolls Version 2 mit Ubuntu 18.04
So führen Sie NullpoMino 7.5.0 unter Ubuntu 20.04.1 64-Bit-Version aus
[Java] Wie man mehrere for-Schleifen einzeln macht
Wie erstelle ich ein Vagrant Plugin, das Sie gelernt haben, als Sie Vagrant-Mutagen gegabelt und veröffentlicht haben?
So machen Sie ein Bild mit Processing teilweise transparent
[Android Studio] So ändern Sie TextView in eine beliebige Schriftart [Java]
So führen Sie einen Java-Komponententest durch (JUnit & Mockito & PowerMock)
So organisieren Sie Informationen, um das Programmierlernen zu optimieren
[Ruby] Verwendung von rbenv (Version `x.x.x' ist nicht installiert)
So funktioniert JavaScript auf einer bestimmten Seite
[Android Studio] [Java] So fixieren Sie den Bildschirm vertikal
Verwendung von Truth (Assertion Library für Java / Android)
[Android] So erhalten Sie die Einstellungssprache des Terminals
Anfänger in der App-Entwicklung haben versucht, eine Android-Rechner-App zu erstellen
So verhindern Sie, dass editTextPreference von android PreferenceFragmentCompat beschädigt wird
Installieren Sie MySQL 5.6 unter CentOS6 [So geben Sie die Version an]
So übergeben Sie Bildpixelinformationen nativ aus Unity
So laden Sie eine ältere Version von Apache Tomcat herunter