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中調用
[java] view plaincopy
- 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發送訊息。
[java] view plaincopy
- 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指令碼中接收。
下面我們看看Test.cs指令碼
[csharp] view plaincopy
- 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程式研究院。
源碼:http://www.xuanyusong.com/archives/676