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

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

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

package com.xys;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class UnityTestActivity extends UnityPlayerActivity {
    /** Called when the activity is first created. */
Context mContext = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
    }
    public void StartActivity0(String name)
    {
     Intent intent = new Intent(mContext,TestActivity0.class);
     intent.putExtra("name", name);
     this.startActivity(intent);
    }
}

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

package com.xys;
import com.unity3d.player.UnityPlayer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class TestActivity0 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView)this.findViewById(R.id.textView1);
        text.setText(this.getIntent().getStringExtra("name"));
        final EditText edit = (EditText)this.findViewById(R.id.edit);
        Button close = (Button)this.findViewById(R.id.button0);
        close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//注释1
UnityPlayer.UnitySendMessage("Main Camera","messgae",edit.getText().toString());
TestActivity0.this.finish();
}
});
    }
}

 需要在程序头引入包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脚本中接收。

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

下面我们看看Test.cs脚本

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
//请输入一个字符串
private string stringToEdit = "Please enter a string";
void Update ()
{
//点击手机返回键关闭应用程序
if (Input.GetKeyDown(KeyCode.Escape) ¦¦ Input.GetKeyDown(KeyCode.Home) )
   {
   Application.Quit();
   }
}
void OnGUI()
{
    //绘制一个输入框接收用户输入
stringToEdit = GUILayout.TextField (stringToEdit, GUILayout.Width(300),GUILayout.Height(100));
//一个提交按钮
if(GUILayout.Button("commit",GUILayout.Height(50)))
{
//注解1
  using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
//调用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的参数
  jo.Call("StartActivity0",stringToEdit);
}
}
}
}
//注解2
void messgae(string str)
{
stringToEdit = str;
}
}

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

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

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

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

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

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

  • 本文固定链接: http://www.xuanyusong.com/archives/676
  • 转载请注明: 雨松MOMO 2012年05月03日 于 雨松MOMO程序研究院 发表

Unity3D研究院之与Android相互传递消息相关推荐

  1. 2019.9.18 Unity3D与Android相互传递消息 unity与ios相互传递消息

    unity与Android相互传递消息 参考1:http://www.xuanyusong.com/archives/667 参考2:http://www.xuanyusong.com/archive ...

  2. Android开发--Service和Activity通过广播传递消息

    Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法: 一.在服务里面发送广播 通过intent传送数据 ...

  3. Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)

    http://www.xuanyusong.com/archives/831 http://www.xuanyusong.com/archives/1454 如果大家对Unity中如何使用数据库还不是 ...

  4. MQTT 通讯测试 linux端 Android app相互发送消息

    MQTT 通讯测试服务器C代码: //编译gcc -o mqttclient mqttclient.c -lpaho-mqtt3c -I ./../paho.mqtt.c/src/ -L ../pah ...

  5. Android学习笔记(十二)——Fragment向Activity传递消息

    点击Fragment中"给Activity传递消息"按钮,使Activity中TextView中原本的text="hello"换成"你好" ...

  6. Unity3D研究院之Unity中连接本地或局域网MySQL数据库

    用户名 Email 游戏蛮牛 手机端 开启辅助访问 腾讯QQ 立即注册 登录 用户名 自动登录  找回密码 密码 登录  注册帐号 [Unity5.X版本开始预售啦!] 扫一扫,访问微社区 </ ...

  7. qt如何把父窗口的变量传给子窗口_父窗口和iframe子窗口之间相互传递参数和调用函数或方法...

    1.父窗口向子窗口传递参数: 可以在url中添加参数:2.html?a=1&b=2&c=3 然后在子页面上可用js解析,提供一个函数: function getQueryStr(sAr ...

  8. “不传递消息、不使用邻接矩阵、在边集上训练”: 从对比链接中蒸馏自知识:非消息传递的图节点分类...

    来源:深度学习与图网络本文约800字,建议阅读5分钟 本文从图网络的边中蒸馏知识,使 MLP 在图节点分类任务上达到了 GNN 的表现. 这篇文章从图网络的边中蒸馏知识,使 MLP 在图节点分类任务上 ...

  9. 转:Unity3D研究院之提取游戏资源的三个工具支持Unity5(八十四)

    这两天无意间又发现了两个提取Unity游戏资源的工具,这会儿刚好有时间我就码点字总结一下. 一.disunity 因为之前写过了所以这里就不介绍了 .Unity3D研究院之mac上从.ipa中提取un ...

最新文章

  1. MultipartResolver实现文件上传功能
  2. Vm-Tools 安装指南
  3. 用python 中的链表 实现 截取其中一部分_Python数据结构——链表的实现
  4. Windows XP \Windows 2003启动过程的学习及故障分析处理(四)
  5. [BUUCTF-pwn]——inndy_rop
  6. 读书笔记18:命令模式
  7. 2021-0413梦笔记
  8. html 车牌号输入代码,html中车牌号省份简称输入键盘的示例代码
  9. Excel对图片的组合以及选择
  10. @RequestParam使用
  11. 电脑正在更新计算机一直是,win10电脑一直不停更新怎么办啊
  12. VS2019创建和使用静态库(.lib文件)
  13. android内存泄漏检测,Android内存泄露检测之LeakCanary的使用
  14. Conditional Random Fields:ProbabilisticModels for Segmenting and Labeling Sequence Data
  15. 前端之refs焦点管理
  16. PR最常见的实用技巧分享
  17. 百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\Obstacle类代码详解
  18. python库排行榜_排名前6位的Python NLP库的比较
  19. 无人驾驶感知篇之融合(十四)
  20. 2020年最新App Store应用上架流程

热门文章

  1. (无奈之举)2011年01月26号日志
  2. [团队公告]博客园的敏捷软件开发团队成立了
  3. 查看linux中的TCP连接数
  4. System.exit(0)和System.exit(1)区别
  5. intellij idea 配置远程访问本地的tomcat项目
  6. mysql中count的用法
  7. 驳“永远不要对一个外行聊你的专业”【十全十美】
  8. Adobe Achemy入门指南(二)
  9. 资源2010-01-29
  10. fushioncharts破解