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中调用
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.unity 3 d.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 StartActivity 0 ( String name )
{
Intent intent = new Intent ( mContext , TestActivity 0. class ) ;
intent.putExtra ( "name" , name ) ;
this.startActivity ( intent ) ;
}
} < / font >
|
接着是TestActivity.java 打开这个界面后,程序将在这里向Unity发送消息。
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.unity 3 d.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 TestActivity 0 extends Activity {
@Override
public void onCreate ( Bundle savedInstanceState ) {
super.onCreate ( savedInstanceState ) ;
setContentView ( R.layout. main ) ;
TextView text = ( TextView ) this.findViewById ( R. id .textView 1 ) ;
text .setText ( this.getIntent ( ) .getStringExtra ( "name" ) ) ;
final EditText edit = ( EditText ) this.findViewById ( R. id .edit ) ;
Button close = ( Button ) this.findViewById ( R. id .button 0 ) ;
close .setOnClickListener ( new OnClickListener ( ) {
@Override
public void onClick ( View v ) {
/ / 注释 1
UnityPlayer.UnitySendMessage ( "Main Camera" , "messgae" , edit.getText ( ) .toString ( ) ) ;
TestActivity 0. 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脚本中接收。
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中StartActivity 0 方法,stringToEdit表示它的参数
jo.Call ( "StartActivity0" , stringToEdit ) ;
}
}
}
}
/ / 注解 2
void messgae ( string str )
{
stringToEdit = str;
}
} |