Unity3D研究院之與Android相互傳遞訊息(十九)

來源:互聯網
上載者:User

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

  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發送訊息。 

 

 

[java] view plaincopy

  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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.