美文网首页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