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.
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')
}
}
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.
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.**
Platzieren Sie Folgendes nach Bedarf unter Assets / Plugins / Android des Unity-Projekts.
https://docs.unity3d.com/ja/540/Manual/PluginsForAndroid.html
Recommended Posts