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

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

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

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

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

[AppleScript] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<font face="Verdana,">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);
    }
  
}</font>

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

[AppleScript] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
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
<font face="Verdana,">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();
            }
        });
    }
  
}</font>

需要在程序头引入包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相互传递消息

屏幕快照-2012-05-03-上午10.43.19.png (133.68 KB, 下载次数: 1)

下载附件  保存到相册

2014-8-18 16:09 上传


下面我们看看Test.cs脚本

[AppleScript] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
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
using UnityEngine;[/align]
[font=Verdana,]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("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。

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

屏幕快照-2012-05-03-上午10.07.26.png (64.69 KB, 下载次数: 0)

下载附件  保存到相册

2014-8-18 16:09 上传

   


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


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


屏幕快照-2012-05-03-上午10.08.18.png (89.07 KB, 下载次数: 0)


下载附件

 保存到相册