筆者最近開發Unity,U3D調用android的開發,在其中遇到了許許多多的坑,接下來我會把坑都寫出來,以及解決坑的一些辦法,這裏先起個頭,如果你也在開發遇到了了坑可以留言一起交流。待我抽出時間整理出一個DEMO。
U3D調用android調用android還需要一個重要角色那就是classes.jar包,這個是unity與Android開發的一箇中間橋樑:
需要導入到Lib中並引用,網上有說要類繼承UnityPlayerActivity這個,筆者沒有繼承,可成功。
如果你有安裝Unity,可按照這個路徑去找:(Windos) C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar
(Mac ) Unity.app(show packages)Applications\Unity(rightclick ShowPackageContent)PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
如果是把Android打包未arr或者jar,已打好的放入unity前需要做很重要的一步:
通過壓縮工具打開我們的jar或者AAR就是上圖這樣,這裏 的classesb不用管。
打開左側lib裏面還是會有一個classes,這裏的classes需要刪除,否則導入unity,unity在打包時就會出現衝突。
壓縮工具隨後一起上傳到CSDN,不會設置積分,放心下載。
Unity調用代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class aarTest : MonoBehaviour
{
// Start is called before the first frame update
AndroidJavaObject m_java;
public Text text;
private void Awake()
{
m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");//com.u3d.com.unityAndroid.Views.Unity1Android 包名加類名,不能錯哦
}
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void ArrTest1()
{
m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");
text.text = "開始調用方法";
text.text += "\n + " + m_java;
m_java.Call("showView");//showView方法名
text.text += "\n 調用結束";
}
}
Android部分代碼:
package com.u3d.com.unityAndroid.Views;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.u3d.com.lib.R;
import com.u3d.com.unityAndroid.AdListener.OnListener;
import com.u3d.com.unityAndroid.bean.ResultData;
import com.u3d.com.unityAndroid.bean.ResultVedioDataBean;
import com.u3d.com.unityAndroid.config.Api;
import com.u3d.com.unityAndroid.utils.AdOnClick;
import com.u3d.com.unityAndroid.utils.GetImgUtil;
import com.u3d.com.unityAndroid.utils.HttpUtils;
import com.u3d.com.unityAndroid.utils.Json;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by Admin on 2020/4/9.
*/
public class Unity1Android {
public static Activity activity = null;
private static final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_PHONE_STATE"};
protected static String UA = "";
private Activity _unityActivity;
HttpUtils httpUtils = new HttpUtils();
Activity getDiActivity() {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
return activity;
} catch (ClassNotFoundException classNotFoundException) {
} catch (IllegalAccessException illegalAccessException) {
} catch (NoSuchFieldException noSuchFieldException) {
}
return null;
}
/**
* 測試
*/
public void showView() {
final Activity curActivity = getDiActivity();
(new Handler(curActivity.getMainLooper())).post(new Runnable() {
@SuppressLint("ResourceType")
public void run() {
TextView textView = new TextView((Context) curActivity);
textView.setText("123");
textView.setWidth(-1);
textView.setHeight(-1);
textView.setBackgroundColor(curActivity.getResources().getColor(17170459));
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(400, 600);
layoutParams.gravity = 17;
ViewGroup totalView = (ViewGroup) curActivity.getWindow().getDecorView();
totalView.addView((View) textView, (ViewGroup.LayoutParams) layoutParams);
}
});
}
}
其中這個特別重要:
Activity getDiActivity() {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
return activity;
} catch (ClassNotFoundException classNotFoundException) {
} catch (IllegalAccessException illegalAccessException) {
} catch (NoSuchFieldException noSuchFieldException) {
}
return null;
}