zoukankan      html  css  js  c++  java
  • Unity3D研究院之与Android相互传递消息(十九)【转】

    http://blog.csdn.net/xys289187120/article/details/7687319   

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

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

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

     

    1. package com.xys;  
    2.   
    3. import android.content.Context;  
    4. import android.content.Intent;  
    5. import android.os.Bundle;  
    6.   
    7. import com.unity3d.player.UnityPlayerActivity;  
    8.   
    9. 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发送消息。 

     

    1. package com.xys;  
    2.   
    3. import com.unity3d.player.UnityPlayer;  
    4.   
    5. import android.app.Activity;  
    6. import android.os.Bundle;  
    7. import android.view.View;  
    8. import android.view.View.OnClickListener;  
    9. 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脚本

     

    [csharp] view plaincopy
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class Test : MonoBehaviour  
    5. {  
    6.   
    7.     //请输入一个字符串  
    8.     private string stringToEdit = "Please enter a string";  
    9.   
    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”已经显示在输入框中,那么这样就比较完美了实现发送与接收消息。希望大家继续支持雨松MOMO程序研究院。

    源码下载地址:http://www.xuanyusong.com/archives/676

  • 相关阅读:
    重拾node第一天
    layui采坑记录 (上卷)QUQ
    解决IOS固定定位 fixed的不兼容
    layui 启用禁用切换详解
    jq form表单渲染单选框内容渲染
    vue 工具函数的封装 时间格式化函数
    CSS常见的继承属性
    git简单使用指南
    常用git命令大全
    react项目使用antd
  • 原文地址:https://www.cnblogs.com/songtzu/p/3009520.html
Copyright © 2011-2022 走看看