运行环境
unity 2019.2.11f1
Androidstudio 3.5.2
Android SDK Tools:26.1.1
Android Platfom Version : API 29
- 新建一个安卓工程
- 工程新建之后右键创建一个模块,取名叫unityactivity,注意这里的包名和新建工程的包名要一致(尽量避免不必要的错误)
- 建完应该是这样,wait是随便起的新建工程的名字,然后在unity的安装路径找到你要用的jar包,我的路径如下:
D:\Unity2019.2.11f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
,
找到后复制放入unityactivity模块的libs文件夹下,然后右键->Add as Library,这一步做完应该是这个样子 - src/main/java/包名/文件夹下新建一个Activity,我取名叫UnityMainAcivity
- 编写交互内容
package com.sound.anzhouceshi;
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 () {
Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();
AndroidCallUnity();
}
//android调用unity
public void AndroidCallUnity () {
//第1个参数为Unity场景中用于接收android消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
UnityPlayer.UnitySendMessage("Text", "fromeAndroid", "安卓给你发消息了.");
}
}
- main文件夹下的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sound.anzhouceshi">
<!-- 这个android:label设置后,unity中ProductName就不生效了,记得改这个-->
<application >
<!-- 这个android:name的值必须为包名+类名-->
<activity android:name="com.sound.anzhouceshi.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>
- 生成jar包或者aar包(这里建议使用jar包,我一般使用aar包,结果在这不管用,不知道为什么)
先Build-Clean Project一下,然后Build-Make Module ‘模块名字’,等待生成完毕之后应该是这样
找到build/intermediates/packaged-classes/debug/classes.jar(有些人是release/classes.jar)能找到就行 - 在unity新建文件夹 Plugins/Android/bin,将上一步找到的classes.jar放进去,同时将第六步修改的AndroidManifest.xml复制到Plugins/Android和bin同一层级,放完应该是这样
- unity视图放一个Text和一个Button,创建一个C#脚本放在Text下(懒得起名字直接默认名字了)
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);
}
}
注意C#脚本中的方法和Java中写的要一致
- 最后一步,我在这被坑了很久,也不知道是什么原因.
打包-填写包名
不要和安卓工程的UnityMainAcivity 模块的包名一致!!!
不要和安卓工程的UnityMainAcivity 模块的包名一致!!!
不要和安卓工程的UnityMainAcivity 模块的包名一致!!!
我被这一个坑了一个下午,包名一致的话会报很多错,最后直接打包看效果就好了