上一篇文章我們學習了Unity向Android發送消息,如果Android又能給Unity回饋消息那么這就玩美了。恰好Unity for Andoid 和iOS一樣都是可以相互與Unity發送與接收消息
上一篇文章我們學習了Unity向Android發送消息,如果Android又能給Unity回饋消息那么這就玩美了。恰好Unity for Andoid 和 IOS一樣都是可以相互與Unity發送與接收消息,這篇文章MOMO就和大家好好聊聊Android向Unity發送消息的方法。在讀本片博文之前,建議大家讀一下我上一篇文章Unity3D研究院之打開Activity與調用JAVA代碼傳遞參數(十八),有關數據打包方面在上一篇中已經說的很清楚,這里就不再贅述。
我們在項目中創建兩個Activity一個是主Activity一個是新打開的Activity和內容方面與上一篇文章類似。
UnityTestActivity.java 主Activity ,提供一個接口方法StartActivity(),它是由Unity中調用
[代碼]java代碼:
| 03 |
import android.content.Context; |
| 04 |
import android.content.Intent; |
| 05 |
import android.os.Bundle; |
| 07 |
import com.unity3d.player.UnityPlayerActivity; |
| 09 |
public class UnityTestActivity extends UnityPlayerActivity { |
| 10 |
/** Called when the activity is first created. */ |
| 12 |
Context mContext = null; |
| 14 |
public void onCreate(Bundle savedInstanceState) { |
| 15 |
super.onCreate(savedInstanceState); |
| 20 |
public void StartActivity0(String name) |
| 22 |
Intent intent = new Intent(mContext,TestActivity0.class); |
| 23 |
intent.putExtra("name", name); |
| 24 |
this.startActivity(intent); |
接著是TestActivity.java 打開這個界面后,程序將在這里向Unity發送消息。
[代碼]java代碼:
| 03 |
import com.unity3d.player.UnityPlayer; |
| 05 |
import android.app.Activity; |
| 06 |
import android.os.Bundle; |
| 07 |
import android.view.View; |
| 08 |
import android.view.View.OnClickListener; |
| 09 |
import android.widget.Button; |
| 10 |
import android.widget.EditText; |
| 11 |
import android.widget.TextView; |
| 13 |
public class TestActivity0 extends Activity { |
| 16 |
public void onCreate(Bundle savedInstanceState) { |
| 17 |
super.onCreate(savedInstanceState); |
| 18 |
setContentView(R.layout.main); |
| 20 |
TextView text = (TextView)this.findViewById(R.id.textView1); |
| 21 |
text.setText(this.getIntent().getStringExtra("name")); |
| 23 |
final EditText edit = (EditText)this.findViewById(R.id.edit); |
| 25 |
Button close = (Button)this.findViewById(R.id.button0); |
| 26 |
close.setOnClickListener(new OnClickListener() { |
| 29 |
public void onClick(View v) { |
| 31 |
UnityPlayer.UnitySendMessage("Main Camera","messgae",edit.getText().toString()); |
| 32 |
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腳本
[代碼]c#/cpp/oc代碼:
| 02 |
using System.Collections; |
| 04 |
public class Test : MonoBehaviour |
| 08 |
private string stringToEdit = "Please enter a string"; |
| 13 |
if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) ) |
| 22 |
stringToEdit = GUILayout.TextField (stringToEdit, GUILayout.Width(300),GUILayout.Height(100)); |
| 25 |
if(GUILayout.Button("commit",GUILayout.Height(50))) |
| 28 |
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) |
| 30 |
using( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) |
| 32 |
//調用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的參數 |
| 33 |
jo.Call("StartActivity0",stringToEdit); |
| 42 |
void messgae(string 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”已經顯示在輸入框中,那么這樣就比較***了實現發送與接收消息。