您的位置:首页 > 移动开发 > Unity3D

Unity3D研究院之与Android相互传递消息(十九)

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

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

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

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

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对象中,此时由于[b]UnityPlayer.UnitySendMessage()方法发送消息给MainCamera对象,所以需要在Main Camera对象绑定的脚本中去接收这个消息,也就是说要在Test.cs脚本中接收。[/b]





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

下面我们看看Test.cs脚本

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程序研究院。

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

本文固定链接: http://www.xuanyusong.com/archives/676

转载请注明: 雨松MOMO 2012年05月03日 于 雨松MOMO程序研究院 发表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: