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

[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.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脚本中接收。

屏幕快照-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中StartActivity 0 方法,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。

屏幕快照-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。



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


下载附件

 保存到相册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值