找回密码
 立即注册

Unity3D之与Android相互传递消息

已有 889 次阅读2012-11-29 20:47 | Android, 研究院, JAVA

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

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

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

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发送消息。

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脚本

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

源码下载地址:http://115.com/file/e7idavxk#android.unitypackage

原文链接:http://www.xuanyusong.com/archives/676


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-6 20:58 , Processed in 0.045718 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

返回顶部