http://blog.csdn.net/xys289187120/article/details/7687319

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

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

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

[java] view plain copy
  1. packagecom.xys;
  2. importandroid.content.Context;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importcom.unity3d.player.UnityPlayerActivity;
  6. publicclassUnityTestActivityextendsUnityPlayerActivity{
  7. /**Calledwhentheactivityisfirstcreated.*/
  8. ContextmContext=null;
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. mContext=this;
  13. }
  14. publicvoidStartActivity0(Stringname)
  15. {
  16. Intentintent=newIntent(mContext,TestActivity0.class);
  17. intent.putExtra("name",name);
  18. this.startActivity(intent);
  19. }
  20. }



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

[java] view plain copy
  1. packagecom.xys;
  2. importcom.unity3d.player.UnityPlayer;
  3. importandroid.app.Activity;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. importandroid.widget.EditText;
  9. importandroid.widget.TextView;
  10. publicclassTestActivity0extendsActivity{
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. TextViewtext=(TextView)this.findViewById(R.id.textView1);
  16. text.setText(this.getIntent().getStringExtra("name"));
  17. finalEditTextedit=(EditText)this.findViewById(R.id.edit);
  18. Buttonclose=(Button)this.findViewById(R.id.button0);
  19. close.setOnClickListener(newOnClickListener(){
  20. @Override
  21. publicvoidonClick(Viewv){
  22. //注释1
  23. UnityPlayer.UnitySendMessage("MainCamera","messgae",edit.getText().toString());
  24. TestActivity0.this.finish();
  25. }
  26. });
  27. }
  28. }



需要在程序头引入包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相互传递消息(十九)_第1张图片

下面我们看看Test.cs脚本

[csharp] view plain copy
  1. usingUnityEngine;
  2. usingSystem.Collections;
  3. publicclassTest:MonoBehaviour
  4. {
  5. //请输入一个字符串
  6. privatestringstringToEdit="Pleaseenterastring";
  7. voidUpdate()
  8. {
  9. //点击手机返回键关闭应用程序
  10. if(Input.GetKeyDown(KeyCode.Escape)¦¦Input.GetKeyDown(KeyCode.Home))
  11. {
  12. Application.Quit();
  13. }
  14. }
  15. voidOnGUI()
  16. {
  17. //绘制一个输入框接收用户输入
  18. stringToEdit=GUILayout.TextField(stringToEdit,GUILayout.Width(300),GUILayout.Height(100));
  19. //一个提交按钮
  20. if(GUILayout.Button("commit",GUILayout.Height(50)))
  21. {
  22. //注解1
  23. using(AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer"))
  24. {
  25. using(AndroidJavaObjectjo=jc.GetStatic<AndroidJavaObject>("currentActivity"))
  26. {
  27. //调用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的参数
  28. jo.Call("StartActivity0",stringToEdit);
  29. }
  30. }
  31. }
  32. }
  33. //注解2
  34. voidmessgae(stringstr)
  35. {
  36. stringToEdit=str;
  37. }
  38. }



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

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

Unity3D研究院之与Android相互传递消息(十九)_第2张图片

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

Unity3D研究院之与Android相互传递消息(十九)_第3张图片

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

Unity3D研究院之与Android相互传递消息(十九)_第4张图片

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

源码下载地址:http://www.xuanyusong.com/archives/676

更多相关文章

  1. [Android]去除程序中广告的好方法:告诉广告没有网络连接
  2. Android消息处理机制——AsyncTask 源码解析
  3. Android 中自定义控件和属性(attr.xml,declare-styleable,TypedA
  4. Android - 常见错误的解决方法
  5. Android Binder入门指南之Binder服务的消息循环
  6. Android 老生常谈之消息机制
  7. Android入门教程 AsyncTask的使用及execute和executeOnExecutor
  8. Android异步消息处理机制Handler完全解析

随机推荐

  1. Android(安卓)菜单简析01(OptionsMenu)
  2. android Log图文详解(Log.v,Log.d,Log.i,
  3. 向eclipse中导入android中的sample样例+g
  4. Android(安卓)Camera 使用小结
  5. 理解Android(安卓)上的安全性
  6. 从Android界面开发谈起
  7. Android自定义进度条
  8. android的PowerManager和PowerManager.Wa
  9. android:shrinkColumns的用法 (2011-04-2
  10. Android(安卓)快速运行的秘诀