首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之与Android相互传递消息(十九)
2012
05-03

Unity3D研究院之与Android相互传递消息(十九)

          上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了。恰好Unity for Andoid 和 IOS一样都是可以相互与Unity发送与接收消息,这篇文章MOMO就和大家好好聊聊Android向Unity发送消息的方法。在读本片博文之前,建议大家读一下我上一篇文章Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)有关数据打包方面在上一篇中已经说的很清楚,这里就不再赘述。

我们在项目中创建两个Activity一个是主Activity一个是新打开的Activity和内容方面与上一篇文章类似。

UnityTestActivity.java 主Activity ,提供一个接口方法StartActivity(),它是由Unity中调用

接着是TestActivity.java 打开这个界面后,程序将在这里向Unity发送消息。 

 需要在程序头引入包import com.unity3d.player.UnityPlayer; 因为向Unity发送消息的静态方法写在这里。

注释1:意思是点击发送按钮后,程序将向Unity发送消息。UnityPlayer.UnitySendMessage() 参数1表示发送游戏对象的名称,参数2表示对象绑定的脚本接收该消息的方法,参数3表示本条消息发送的字符串信息,这个方法与IOS发送消息的方式非常相像。

接着,我们打开Unity工程将Android插件打包好复制在Unity工程当中,详细打包过程请看上一章,将脚本Test.cs绑定在Main Camera对象中,此时由于UnityPlayer.UnitySendMessage()方法发送消息给MainCamera对象,所以需要在Main Camera对象绑定的脚本中去接收这个消息,也就是说要在Test.cs脚本中接收。

 

Unity3D研究院之与Android相互传递消息(十九) - 雨松MOMO程序研究院 - 1

(图片比较大,点击后浏览大图)

 

下面我们看看Test.cs脚本

 注解1:让代码放置在using中是为了告诉垃圾回收站及时的回收垃圾,建议这样来写代码。AndroidJavaClass表示一个java类,AndroidJavaObject表示一个java对象,在上一章已经明确说明。另外还有一些其它的方法,比如调用静态方法等,都在API中写的很清楚,大家可以查阅学习。

注解2:刚刚调用的方法UnityPlayer.UnitySendMessage()参数2为”message”,所以程序将调用 Main Camera对象的Test.cs脚本的message方法,参数为Android传递过来的。最后在这里修改了stringToEdit变量刷新了屏幕的UI。

 

Unity3D研究院之与Android相互传递消息(十九) - 雨松MOMO程序研究院 - 2

 

          打开程序后将启动Unity画面,如上图在这里我们写了输入框接收用户的键盘输入,最后用户点击commit按钮程序将打开Android的Activity,并且将字符串“Please enter a string”做为参数传递给了新Activity。

 

Unity3D研究院之与Android相互传递消息(十九) - 雨松MOMO程序研究院 - 3

 

         如上图所示,在新打开的Activity中已经看到Please enter a string字符串已经显示在界面当中,在布局文件中同样写了Android的高级控件 输入框与按钮,在输入框中输入字符串“xuanyusong”(任意输入),点击保存按钮将把”xuanyusong”刚刚输入的字符串传递给Unity。

 

Unity3D研究院之与Android相互传递消息(十九) - 雨松MOMO程序研究院 - 4

 

如上图所示,此时在Unity中字符串“xuanyusong”已经显示在输入框中,那么这样就比较完美了实现发送与接收消息。希望大家继续支持雨松MOMO程序研究院。

 

源码下载地址:http://vdisk.weibo.com/s/abEoV

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 你好momo我现在的项目一半是android,一半是u3d,二者要互相调用是做不到的吗?如果main_activity主入口是u3d自己的activity,那jc.GetStatic(“currentActivity”); 中得到的当前静态activity应该是u3d本身的activity,那怎样才能通过这个由u3d封装好的activity调出android包里的activity呢?

    • 又看了些博客文档,感觉稍微摸到了unity的想法事实上as里的UnityPlayerActivity与unity打包出来的activity是同一个activity所以在as里多做出来的方法可以通过 jc.GetStatic(“currentActivity”) .call调用到,我并没有新做一个activity出来,而是在unity做的那个activity里添加了一些方法这样一想就妥了

  2. 我也出现了这个错误”Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.unity3d.player.UnityPlayer.UnitySendMessage”,我的开发工具是android studio,但当我用eclipse时就不会出现这个错误,很奇怪,研究很久了不知道怎么解决,难道是gradle编译的问题?

  3. 请问一下,按照你的来制作安装的APK一直无法连接Android那一部分,但是下你的来加载APK安装又可以,实在想不通,不一样在哪。

  4. 雨松大哥您好。
    在安卓程序里调用Unity程序后,当unity程序调用application.quit()退出时,主程序也跟着被退出了,
    请问怎样才能在退出时返回到安卓程序界面,而不是连主程序也退出? 谢谢!

  5. 雨松大哥 为什么我的unity5打安卓包的时候会出现java.lang.IllegalArgumentException: already added: Lcom/lifengapp/diandian/R$attr;这样的错误提示啊 我网上查了很多 别人也有遇到这样的问题 但是却解决不了 这个是unity5的bug吗

        • 如果你没有用到res目录的文件,或者如果你只是因为启动图标用到了引用 ,你可以不要复制res(实际上官方文档上说res是不支持的)。将android:icon=”@drawable/ic_launcher” 改为android:icon=”@drawable/app_icon”
          我猜这是与u3d里的配置文件共用的。我刚刚也是为这个问题找了半天。 我的需求是调用显示广告。所以完全不用res。现在已经能跑,但广告还没出来。继续调试中。我用的5.2.最新版本。

          以下是官方配置示例。手册中有。

  6. 请问当某个activity继承于unity的activity时,在这个界面用了安卓原生的EditText,用软键盘输入时,只能输入不能退格删除或者清空,就是按下这些退格键和清空键时不会删除字符,请问怎么解决?

  7. momo好~求助… 我直接把你项目下载下来打包时出现错误…UNEXPECTED TOP-LEVEL EXCEPTION:java.lang.IllegalArgumentException: already added: Lcom/xys/R$attr;………….我用的是unity5..这个和unity版本有关系吗?

  8. Android 像U3d 发消息,错误Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.unity3d.player.UnityPlayer.UnitySendMessage:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)这个怎么解决啊。我是将unity 导出的Android project 然后进行的2次开发。

  9. 雨凇你好,我看了 好几遍了 ,官网蛮牛也查过类似。能成功 打包,导出的 eclipse 项目不能运行 好像是包名冲突了,这个不能调试吗[2015-05-29 16:39:43 – Dex Loader] Unable to execute dex: Multiple dex files define Lcom/xys/R$attr;[2015-05-29 16:39:43 – UnityTestActivity] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/xys/R$attr;

  10. 求助啊,主Activity中的StartActivity方法找不到。logcat报错说在UnityPlayerNativeActivity中找不到StartActivity,导致点击按钮之后没办法切换到安卓部分

  11. MOMO大神,我将一个第三方SDK工程以依赖库的形式导入我写的工程。打包的res复制SDK工程目录下的,AndroidManisest.xml也按要求写好的。但是我通过接口打开sdk工程的界面的时候却完全没有反应,正常至少有一个“加载中”的提示。求解啊?(我用eclipse导出的SPK没有问题)

  12. 雨松,现在我将Untiy导入到Android中,界面上有按钮,在Untiy的内容未加载完之前按钮可以点击,但当画面加载完毕之后按钮就失效了。这大概是什么原因呢?

  13. 雨松MOMO 求助啊…点按钮后程序崩溃了应该是在 setContentView( R.layout.main ) 这里出错了错误信息是 android.content.res.Resources$NotFoundException: Resource ID #0x7f030017搞了好久还是不懂为什么`

  14. 请教一个问题,我在u3d中用startActivity打开一个Android的activity A,然后在A中再打开u3d的一个window,然后再返回到A。除了UnityPlayer.UnitySendMessage然后再finish掉A,还有没有别的办法,因为从u3d中回来的时候A的状态没有了。

  15. 一定要把C#脚本放到游戏物体上么?只把第一个参数设置为目标游戏物体的名字,脚本放在别的游戏物体上有没有道理啊?求解答啊

  16. 请教,u3d做android都是直接打包成apk,但是如果导出成eclipse工程(因为很多代码需要在activity这层增加)再打包apk,用这篇文章的实例会出现包名重复的问题,不知道如何解决。。

  17. 为什么会出现 “Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.unity3d.player.UnityPlayer.UnitySendMessage:…”这样的错误呢?应该怎么解决呢?查了好久都没有查到

  18. MOMO大想請問一下while(true){//is : an InputStream buf: an byte array//fos : an outputstream//progress total : int if (is == null) break; int numRead = is.read(buf); if (numRead <= 0) { break; } fos.write(buf, 0, numRead); this.progress += numRead; Log.d(“progress”, String.valueOf((float)this.progress * 100.0D / this.total) + “%”); call(String.valueOf((float)this.progress * 100.0D / (float)this.total));}上述是其中unity透過plugin傳送給android java code來指明下載東西的其中一個function的部份code 下面是call function 使用unitysendmessage 傳送給unity 告知現在讀取進度public void call(String message) { UnityPlayer.UnitySendMessage(“mGameObject”, “CallUnityFromJAVA”, message); }然而在adb logcat會發現執行完許多log.d 到100%之後才會顯示unity 的 CallUnityFromJAVA function ,並且跟之前log.d 一樣 也是多個。所以想請問一下是否有辦法呼叫到的時候就去在unity上show出 而不是執行完讀取後才一次SHOW出來呢

  19. 这篇文章,我学到了很多,帮我解决了一个难题,但是应用的时候遇到另外一个问题,我通过Unity与安卓通信,启动外部的pdf浏览器,但是如果连续启动30次,即使我不打开任何pdf文件,程序也会死机,using我也用了,但是内存还是逐渐的减少,请问这是为什么啊?

    • 补充一下,我本身项目的内存占用比较多,但是只要不启动外部的pdf浏览器,肯定不会死机,调用的外部代码也只是用来启动一个pdf浏览器浏览我指定的文件,经过测试,即使我不打开任何一个文件,30次左右的连续操作也会死机,困惑了很久了,MOMO,帮帮忙

    • 这个问题就比较大了, 首先你需要排查 到底是untiy吃内存 还是 android插件吃内存。。然后在一点点把吃内存的地方释放掉。。 仔细检查代码吧。。。

  20. 其实偷偷在这里学了很多 一直在偷学哈。。今天出来感谢下。。我的ios 还有androi开发都是从这里学会的

  21. 雨凇哥,我unity调用android的时候,首先出现一个白页面,然后才出现unity3d的logo,然后才加载的第一个场景的,请问我不想出现那个白页面有办法么?麻烦MOMO了~~~

    • 你说的空白页 是不是 android 的那个?就是 带应用名称 小logo的那个? 那个东西去不掉的。 你可以自己创建一个不带插件的Android 工程。也会带那个。 官方的demo也带那个的。。。

  22. 出现错误JNI: Unable to find method id for ‘StartActivity0’UnityEngine.AndroidJavaObject:Call(String, Object[])Test:OnGUI() (at Assets/Test.cs:33),请问momo怎么解决?

  23. 雨松大哥,为什么我用你给的U3D源代码发布的apk文件都不能装在android机上,我照着你做的工程,发布出来的apk能装,但是一打开就崩溃了。(发布的时候,注意了包名的对应,版本是2.1的)。求指导!我的邮箱:334974857@qq.com

  24. cs脚本:void OnGUI(){ //绘制一个输入框接收用户输入 stringToEdit = GUILayout.TextField(stringToEdit, GUILayout.Width(300), GUILayout.Height(100)); //提交按钮 if(GUILayout.Button(“commit”, GUILayout.Height(50))){ AndroidJavaClass ajc = new AndroidJavaClass(“com.main.unitytoandroid.MainActivity”); test = “2”; ajc.Call(“receiveMessage”, stringToEdit); } GUILayout.Label(test); } public void GetMessage(string str){ stringToEdit = str;}activity代码:public class MainActivity extends UnityPlayerActivity { Context mContext = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; } //接受来自unity的参数 public void receiveMessage(String name){ //再将值返回给unity UnityPlayer.UnitySendMessage(“Main Camera”, “GetMessage”, “从android返回的:” + name); }}雨松大大你看我这样对不对啊,提交过去似乎android没有把值返回过来

  25. 松松大侠,看了你写的书,收获很多。不过有个问题一直困扰我,请教一下:Ray ray = new Ray(); ray = Camera.main.ScreenPointToRay(transform.position);射线是从屏幕左下射出的,我想做成虚拟按键,每次按下后,射线从当前第一视角屏幕正中射出,可以做到吗?(screen.width/2,screen.height/2)怎么转换成3D世界的坐标,然后传给上面括号里,当然传个触摸的坐标进去可以,不过我想模拟FPS那种固定瞄准镜在屏幕中间的效果。不知道表达清楚了没有?:(

    • 正常的逻辑应该是 把2D坐标转换成3D坐标 然后在用射线像这个3D坐标上射线。。API中写的很清楚的。public class example : MonoBehaviour { void OnDrawGizmosSelected() { Vector3 p = camera.ScreenToWorldPoint(new Vector3(100, 100, camera.nearClipPlane)); Gizmos.color = Color.yellow; Gizmos.DrawSphere(p, 0.1F); }}

  26. 您好,有个问题想请教一下,我想在android端为我的unity界面,添加一个webView ,只添加一个View,不是切换Activity,这个方法可行吗

  27. 雨松大的文章總是讓我受用不盡
    這邊想請教個問題:
    從Android打包成jar給Unity做Plugin(假設是webwiew或是撥放影片),有可能讓整個畫面的控制權主要還是給Unity而不是jar的功能嗎?