Unity3D研究之与Android相互传递消息

移动开发 iOS 游戏开发
上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了。恰好Unity for Andoid 和iOS一样都是可以相互与Unity发送与接收消息

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

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

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

[代码]java代码:

01 package com.xys;
02  
03 import android.content.Context;
04 import android.content.Intent;
05 import android.os.Bundle;
06  
07 import com.unity3d.player.UnityPlayerActivity;
08  
09 public class UnityTestActivity extends UnityPlayerActivity {
10     /** Called when the activity is first created. */
11  
12     Context mContext = null;
13     @Override
14     public void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         mContext = this;
17  
18     }
19  
20     public void StartActivity0(String name)
21     {
22         Intent intent = new Intent(mContext,TestActivity0.class);
23         intent.putExtra("name", name);
24         this.startActivity(intent);
25     }
26  
27 }

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

[代码]java代码:

01 package com.xys;
02  
03 import com.unity3d.player.UnityPlayer;
04  
05 import android.app.Activity;
06 import android.os.Bundle;
07 import android.view.View;
08 import android.view.View.OnClickListener;
09 import android.widget.Button;
10 import android.widget.EditText;
11 import android.widget.TextView;
12  
13 public class TestActivity0 extends Activity {
14  
15     @Override
16     public void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.main);
19  
20         TextView text = (TextView)this.findViewById(R.id.textView1);
21         text.setText(this.getIntent().getStringExtra("name"));
22  
23         final EditText edit = (EditText)this.findViewById(R.id.edit);
24  
25         Button close = (Button)this.findViewById(R.id.button0);
26         close.setOnClickListener(new OnClickListener() {
27  
28             @Override
29             public void onClick(View v) {
30                 //注释1
31                 UnityPlayer.UnitySendMessage("Main Camera","messgae",edit.getText().toString());
32                 TestActivity0.this.finish();
33             }
34         });
35     }
36  
37 }

需要在程序头引入包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#/cpp/oc代码:

01 using UnityEngine;
02 using System.Collections;
03  
04 public class Test : MonoBehaviour
05 {
06  
07     //请输入一个字符串
08     private string stringToEdit = "Please enter a string";
09  
10     void Update ()
11     {
12         //点击手机返回键关闭应用程序
13         if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) )
14         {
15             Application.Quit();
16         }
17     }
18  
19     void OnGUI()
20     {
21         //绘制一个输入框接收用户输入
22         stringToEdit = GUILayout.TextField (stringToEdit, GUILayout.Width(300),GUILayout.Height(100));
23  
24         //一个提交按钮
25         if(GUILayout.Button("commit",GUILayout.Height(50)))
26         {
27             //注解1
28               using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
29             {
30                  using( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
31                 {
32                     //调用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的参数
33                       jo.Call("StartActivity0",stringToEdit);
34                 }
35  
36             }
37  
38         }
39  
40     }
41     //注解2
42     void messgae(string str)
43     {
44         stringToEdit = str;
45     }
46  
47 }

 注解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”已经显示在输入框中,那么这样就比较***了实现发送与接收消息。

 

责任编辑:冰凝儿
相关推荐

2012-12-24 09:08:14

iOSUnity3D

2012-12-24 09:20:48

AndoidUnity3D

2012-12-24 09:13:23

iOSUnity3D

2012-12-24 09:15:57

iOSUnity3D

2012-12-24 09:11:58

iOSUnity3D

2012-12-24 09:19:31

iOSUnity3D

2012-12-24 08:57:35

iOSUnity3D

2013-04-25 09:56:24

unity3D手机游戏引擎

2012-12-24 09:17:12

iOSUnity3D

2013-04-25 10:03:07

unity3D手机游戏引擎

2012-12-24 08:56:15

iOSUnity3D

2012-12-24 09:18:22

iOSUnity3D

2012-12-24 09:55:15

iOSUnity3D

2012-12-24 08:52:44

iOSUnity3D

2013-04-25 13:27:11

unity3D手机游戏引擎

2012-12-24 09:14:31

ios

2012-12-24 08:51:23

iOSUnity3D

2012-12-24 08:40:12

2013-06-14 09:54:04

Unity3D

2013-04-25 09:08:39

unity3D手机游戏引擎
点赞
收藏

51CTO技术栈公众号