使用版本:
Unity:2018.2.10f
AS:3.5
最近由于需要接公司原生的java SDK,所以打算用U3D调用sdk、然后监听sdk回调的方法,麻烦的地方在于sdk部分需要在AS中去做。
1,
根据博客中的方法,首先新建一个安卓工程:
2,工程新建之后右键创建一个模块,取名叫unityactivity,注意这里的包名和新建工程的包名要一致(尽量避免不必要的错误,当然具体原因我还不太清楚)
3,然后打开U3D安装目录,找到Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下的classes.jar,找到后复制放入unityactivity模块的libs文件夹下,然后右键->Add as Library
这里选默认的就行了,也就是导入到unityactivity文件夹下,导入之后截图如下(classes.jar前面有效小三角,代表导入成功):
4,在AS中编写交互脚本,一个是U3D调用AS,然后AS给U3D回调。如果是接SDK的话,即U3D调用SDK的消息,然后等SDK收到回调方法后,再把消息通知给U3D。代码如下:
package com.yadong.unityactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class UnityMainAcivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//unity调用Android
public void UnityCallAndroid () {
AndroidCallUnity();
}
//android调用unity
public void AndroidCallUnity () {
//第1个参数为Unity场景中用于接收android消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
UnityPlayer.UnitySendMessage("Text", "fromeAndroid", "安卓给你发消息了.");
Toast.makeText(this,"android给U3D返回消息", Toast.LENGTH_LONG).show();
}
}
5,修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yadong.unityactivity">
<!-- 这个android:label设置后,unity中ProductName就不生效了,记得改这个-->
<application >
<!-- 这个android:name的值必须为包名+类名-->
<activity android:name="com.yadong.unityactivity.UnityMainAcivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 这一行不能少,否则会闪退-->
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
6,先Build-Clean Project一下,然后Build-Make Module ‘模块名字’,生成jar包,结果如下:
7,在unity新建文件夹 Plugins/Android/bin,将上一步找到的classes.jar放进去,同时将第六步修改的AndroidManifest.xml复制到Plugins/Android和bin同一层级,放完后:
8,接下来我们处理U3D的部分,新建一个测试的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
public Text text;
public Button btn;
AndroidJavaObject jo;
private void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
btn.onClick.AddListener(CallAndroid);
}
public void CallAndroid()
{
jo.Call("UnityCallAndroid");
Debug.Log("点击按钮");
System.Console.WriteLine("点击按钮");
}
void methodName111(string str)
{
text.text = str;
Debug.Log(str);
System.Console.WriteLine(str);
}
void fromeAndroid(string str)
{
text.text = str;
Debug.Log("安卓传来信息 : " + str);
System.Console.WriteLine("安卓传来信息 : " + str);
}
}
9,然后建个Text,将脚本拖上去;再建个button,监听点击回调
10,打包成apk,这里要注意apk的包名不能与安卓的包名一致
最终测试结果:
~~~~~~~~~~~~~~~~2022.11.30更新~~~~~~~~~~~~~
unity2020以后的classes.jar所在位置:
Unity Hub\Hub\Editor\2020.3.33f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
另外unity 2019.3后的版本classes.jar不包含UnityPlayerActivity类了,我们需要复制UnityPlayerActivity.java到模块src路径下。
UnityPlayerActivity.java位置:
Unity Hub\Hub\Editor\2020.3.33f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
其实对于AS工程来说来说,正常开发即可。如果想继承UnityPlayerActivity,打包的时候需要在build.gradle中添加如下字段:
compileOnly fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar')
并在打包后解压缩aar,删除 classes.jar和UnityPlayerActivity.java,否则unity中打包时候会报类重复的错误。