Unity3D版本:2019.4.5
AndroidStudio版本:4.0
1,随意在工程中建立一个Android Library,名字按照自己规则来就行
2,新加折射类
package com.yadong.mylibrary;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Process;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//与unity对接的类
public class CallMethod {
private static Context unityContext;
private static Activity unityActivity;
//private static Aler
//利用反射调用unity方法 不用导入unity的class.jar包
private static boolean CallUnity(String gameObjectName, String functionName, String args)
{
try
{
Class<?> classType = Class.forName("com.unity3d.player.UnityPlayer");
Method method = classType.getMethod("UnitySendMessage",String.class,String.class,String.class);
method.invoke(classType,gameObjectName,functionName,args);
return true;
}
catch (ClassNotFoundException e)
{
//Test
Log.e("获取unity类", "Failed");
//Toast.makeText(unityActivity, "未获取到"+e, Toast.LENGTH_SHORT).show();
} catch (NoSuchMethodException e) {
//Test
Log.e("获取unity类的方法", "Failed");
//Toast.makeText(unityActivity, "未获取到"+e, Toast.LENGTH_SHORT).show();
} catch (IllegalAccessException e) {
//Test
Log.e("调用unity类的方法", "Failed");
//Toast.makeText(unityActivity, "未获取到"+e, Toast.LENGTH_SHORT).show();
} catch (InvocationTargetException e) {
//Test
Log.e("调用unity类的方法", "Failed");
//Toast.makeText(unityActivity, "未获取到"+e, Toast.LENGTH_SHORT).show();
}
return false;
}
//--------------接口方法---------------//
//初始化
public static void init(Context paramContext) {
unityContext = paramContext.getApplicationContext();
unityActivity = (Activity) paramContext;
}
//--------------接口方法---------------//
//--------------工具方法---------------//
//复制到剪切板
public static void CopyTextToClipboard(String content)
{
ClipboardManager clipboardManager = (ClipboardManager) unityActivity.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText(null,content);
clipboardManager.setPrimaryClip(clipData);
}
//获得版本号
public static String GetVersionName()
{
try {
PackageManager manager = unityActivity.getPackageManager();
PackageInfo info = manager.getPackageInfo(unityActivity.getPackageName(), 0);
return info.versionName;
}catch (Exception e) {
return "0";
}
}
//重启
public static void ReStart(int interval) {
try {
PackageManager manager = unityActivity.getPackageManager();
PendingIntent intent = PendingIntent.getActivity(unityActivity, 0,
manager.getLaunchIntentForPackage(unityActivity.getPackageName()), 0);
AlarmManager alarmManager = (AlarmManager) unityActivity.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + interval, intent);
unityActivity.finish();
Process.killProcess(Process.myPid());
} catch (Exception e) {
return;
}
}
//分享
public static void Share(String content,String title)
{
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,content);
sendIntent.setType("text/plain");
Intent shareIntent = Intent.createChooser(sendIntent,title);
unityActivity.startActivity(shareIntent);
}
//--------------工具方法---------------//
}
其中第一句是包名,这个unity3D调用中会用到。
3,选中自己的Library,点击build,打出aar
4,Unity中写测试代码,打包测试
using UnityEngine;
using UnityEngine.UI;
public class ceshi : MonoBehaviour
{
public Button btu;
AndroidJavaClass unityPlayer;
AndroidJavaObject currentActivity;
AndroidJavaClass andriodCall;//安卓定义的CallMethod类 需要Activity联系上下文 unity与安卓互相调用就是通过com.unity3d.player.UnityPlayer类下的currentActivity
void Start()
{
unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
//通过该API来实例化导入的arr中对应的类
andriodCall = new AndroidJavaClass("com.yadong.mylibrary.CallMethod");
andriodCall.CallStatic("init", currentActivity);
btu.onClick.AddListener(OnBtnClick);
}
void Update()
{
}
/// <summary>
/// 场景上按点击时触发该方法
/// </summary>
public void OnBtnClick()
{
andriodCall.CallStatic("ReStart",0);
}
}