一、07、Android使用UnityPlayer.UnitySendMessage发消息给Unity

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

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

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

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

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

从头到尾做一遍

  • 1、安卓工程引入unity专门为安卓开发使用的jar包:classes.jar
    前面的步骤也可以参照Unity与Android交互-引入Unity的内置的jar包

新建一个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文件。


  
  
    
      
        
        
      
    
  

注意:根据自己的实际情况替换这里com.lgy.sendjar.SendMsgActivity。
其中



的意思是将这个继承自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中,就可以调用了。比如:

        
        
 
        
        

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

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

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

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

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

你可能感兴趣的:(一、07、Android使用UnityPlayer.UnitySendMessage发消息给Unity)