Unity發(fā)消息給安卓的方式已經(jīng)有了炼绘,詳見Unity調用安卓系列
今天的目標是安卓發(fā)送消息給unity嗅战,實際上接口很簡單。
Android向unity發(fā)送消息俺亮,有兩種方法實現(xiàn)驮捍,一、通過unity自帶的消息機制脚曾,二东且、通過注冊回調的方式。
這里先用第一種方式實現(xiàn)本讥。
為了測試方便珊泳。
總體思路:
(1)做一個jar包。
(2)Unity調用jar包的某個方法拷沸。
(3)jar包自己調用自己的方法發(fā)送消息給untiy色查。
從頭到尾做一遍
-
1、安卓工程引入unity專門為安卓開發(fā)使用的jar包:classes.jar
前面的步驟也可以參照Unity與Android交互-引入Unity的內置的jar包
新建一個empty activity撞芍,然后在這個工程基礎上新建一個Libray Module秧了,這里取名SendJar。
然后給這個SendJar添加一個Java類勤庐,取名SendMsgActivity示惊。
- 2好港、將Unity提供安卓調用的classes.jar復制到SendJar的libs里。
Unity的jar包路徑:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
右鍵classes.jar選擇Take as Libray米罚。
打開SendJar模塊的build.gradle查看是否成功钧汹,已成功添加了依賴。
- 3录择、SendMsgActivity主體代碼拔莱。SendMsgActivity繼承自UnityPlayerActivity。
CallAndrodiActivity:Unity調用安卓的接口隘竭。
SendMsg塘秦,安卓發(fā)送消息給Unity的接口,第一個參數(shù)Main Camera是Unity里接收消息對象的名字动看,第二個參數(shù)是該物體身上腳本具體接收消息的方法名尊剔,第三個參數(shù)是發(fā)送字符串消息。
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","這是安卓主動發(fā)來的消息");
}
}
- 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京痢。
注意:這里生成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/ 目錄下臣淤。沒有的話就手動創(chuàng)建目錄。同時在這個新加一個 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>
注意:根據(jù)自己的實際情況替換這里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就被轉到后臺了穗慕,現(xiàn)象就是你玩著玩著游戲,突然游戲轉到后臺了妻导,跳到了插件的這個Activity上逛绵,顯然不是想要的結果。
2倔韭、unity 的 android 插件開發(fā)术浪,只有一個入口,也就是繼承 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收到了安卓發(fā)過來的消息:“這是安卓主動發(fā)來的消息”
安卓發(fā)消息給Unity琉兜,到此結束凯正。