美文网首页unity3D技术分享
六、安卓开发与Unity——03、安卓发送消息给Unity(找不

六、安卓开发与Unity——03、安卓发送消息给Unity(找不

作者: GameObjectLgy | 来源:发表于2020-08-18 09:31 被阅读0次

Unity发消息给安卓的方式已经有了,详见Unity调用安卓系列

今天的目标是安卓发送消息给unity,实际上接口很简单。

Android向unity发送消息,有两种方法实现,一、通过unity再带的消息机制,二、通过注册回调的方式。

这里先用第一种方式实现。

为了测试方便。
总体思路:
(1)做一个jar包。
(2)Unity调用jar包的某个方法。
(3)jar包自己调用自己的方法发送消息给untiy。

从头到尾做一遍

新建一个empty activity,然后在这个工程基础上新建一个Libray Module,这里取名SendJar。
然后给这个SendJar添加一个Java类,取名SendMsgActivity。


image.png
  • 2、将Unity提供安卓调用的classes.jar复制到SendJar的libs里。
    Unity的jar包路径:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
image.png

右键classes.jar选择Take as Libray。
打开SendJar模块的build.gradle查看是否成功,已成功添加了依赖。

image.png
  • 3、SendMsgActivity主体代码。SendMsgActivity继承自UnityPlayerActivity。
    CallAndrodiActivity:Unity调用安卓的接口。
    SendMsg,安卓发送消息给Unity的接口,第一个参数Main Camera是Unity里接收消息对象的名字,第二个参数是该物体身上脚本具体接收消息的方法名,第三个参数是发送字符串消息。
package com.lgy.sendjar;

import android.os.Bundle;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class SendMsgActivity  extends  UnityPlayerActivity{

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
    }

    public void CallAndrodiActivity()
    {
        System.out.println("===>收到了Unity的调用");
        SendMsg();
    }

    public void SendMsg()
    {
        //注释1
        UnityPlayer.UnitySendMessage("Main Camera","messgae","这是安卓主动发来的消息");
    }

}
  • 4、修改SendMsg模块的build.gradle
    在 build.gradle 末尾添加以下代码,表示添加了一个 Task 任务
//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/arr_main_jar/release/')
    into('build/release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteOldJar, build)

右上角点击该模块的Other,展开找到exportJar,双击生成jar。


image.png

注意:这里生成jar包的路径,每个Android Studio的版本,会有所不同的。
我这里是4.0.1的是这个路径,直接去这个路径找就classes.jar就好了,并不会按照上面写的将jar包重命名并剪贴到release目录。这个是Android Studio本身的问题。

我的生成路径是:D:\MyProject\6_Test\SendMsgJar\SendJar\build\intermediates\aar_main_jar\release

  • 5、导入到Unity
    将拿到的 jar 放到 unity 工程的 Asset/Plugins/Android/ 目录下。没有的话就手动创建目录。同时在这个新加一个 AndroidManifest.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">
    <activity android:name="com.lgy.sendjar.SendMsgActivity"
          android:label="@string/app_name"
          android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

注意:根据自己的实际情况替换这里com.lgy.sendjar.SendMsgActivity。
其中
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
的意思是将这个继承自UnityPlayerActivity的SendMsgActivity,作为主Activity,SendMsgActivity里的功能是作为主Activity就有效。比如说是SendMsgActivity不是继承自UnityPlayerActivity,而是继承自XXActivity,那么就需要在切换到XXActivity后,SendMsgActivity里的功能才有效。
所以一般插件的做法:
1、unity插件通常不会将自己的Activity注册为主Activity,因为他们把自己注册为主Activity后,一使用他们的功能,那么Unity本身这个Activity就被转到后台了,现象就是你玩着玩着游戏,突然游戏转到后台了,跳到了插件的这个Activity上,显然不是想要的结果。
2、unity 的 android 插件开发,只有一个入口,也就是继承 UnityPlayerActivity 或者 UnityNativePlayerActivity 。
3、将他们的 Activity 标签复制粘贴到你的 AndroidManifest.xml中,就可以调用了。比如:

        <activity
            android:name=".TestActivity0"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            >
        </activity>
 
        <activity
            android:name=".TestActivity1"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            >
        </activity>

总之,所有的目的就是为了一直保留Unity本身这个Activity作为主Activity。

  • 6、unity工程调用代码
public class Test : MonoBehaviour
{
    void Start()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("CallAndrodiActivity");
    }

    public void messgae(string str)
    {
        Debug.Log(str);
    }

}
  • 7、打包apk到真机运行调试,查看结果。
    继承了UnityPlayerActivity后在安卓这个工程是运行不了的,除非拿到Unity中集成后在真机下才能看到效果。
    可以看到Unity收到了安卓发过来的消息:“这是安卓主动发来的消息”
image.png

安卓发消息给Unity,到此结束。

相关文章

网友评论

    本文标题:六、安卓开发与Unity——03、安卓发送消息给Unity(找不

    本文链接:https://www.haomeiwen.com/subject/lhfxjktx.html