【Unity3D】與Android相互傳遞消息

http://xys289187120.blog.51cto.com/3361352/907703/

原創文章如需轉載請註明:轉載自雨鬆MOMO獨立域名博客,歡迎你們來訪!!雨鬆MOMO程序研究院本文連接地址:Unity3D研究院之與Android相互傳遞消息(十九)

          上一篇文章咱們學習了Unity向Android發送消息,若是Android又能給Unity回饋消息那麼這就玩美了。剛好Unity for Andoid 和 IOS同樣都是能夠相互與Unity發送與接收消息,這篇文章MOMO就和你們好好聊聊Android向Unity發送消息的方法。在讀本片博文以前,建議你們讀一下我上一篇文章Unity3D研究院之打開Activity與調用JAVA代碼傳遞參數(十八)有關數據打包方面在上一篇中已經說的很清楚,這裏就再也不贅述。java

咱們在項目中建立兩個Activity一個是主Activity一個是新打開的Activity和內容方面與上一篇文章相似。android

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



 
 
  1. package com.xys;   ide

  2.    

  3. import android.content.Context;   佈局

  4. import android.content.Intent;   學習

  5. import android.os.Bundle;   ui

  6.    

  7. import com.unity3d.player.UnityPlayerActivity;   this

  8.    

  9. public class UnityTestActivity extends UnityPlayerActivity {   spa

  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腳本



 
 
  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://115.com/file/e7idavxk#android.unitypackage

 

本文出自 「雨鬆MOMO的程序世界」 博客,請務必保留此出處http://xys289187120.blog.51cto.com/3361352/907703

相關文章
相關標籤/搜索