您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 程序开发 > 代码编程 >
    Unity3D与Android相互传递消息
    时间:2015-02-15 09:09 来源:互联网 作者:网络 浏览:收藏 挑错 推荐 打印

        Unity for Andoid 和 IOS一样都是可以相互与Unity发送与接收消息,这篇文章就和大家好好聊聊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对象中,此时由于UnityPlayer.UnitySendMessage()方法发送消息给MainCamera对象,所以需要在Main Camera对象绑定的脚本中去接收这个消息,也就是说要在Test.cs脚本中接收。

     

    Unity3D与Android相互传递消息


        下面我们看看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。

     

    Unity3D与Android相互传递消息

     

              打开程序后将启动Unity画面,如上图在这里我们写了输入框接收用户的键盘输入,最后用户点击commit按钮程序将打开Android的Activity,并且将字符串“Please enter a string”做为参数传递给了新Activity。

     

    Unity3D与Android相互传递消息

     

             如上图所示,在新打开的Activity中已经看到Please enter a string字符串已经显示在界面当中,在布局文件中同样写了Android的高级控件 输入框与按钮,在输入框中输入字符串“xuanyusong”(任意输入),点击保存按钮将把”xuanyusong”刚刚输入的字符串传递给Unity。

     

    Unity3D与Android相互传递消息

     

        如上图所示,此时在Unity中字符串“xuanyusong”已经显示在输入框中,那么这样就比较完美了实现发送与接收消息。


    (责任编辑:向阳)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
    标签:Unity之家