上一篇文章我們學(xué)習(xí)了Unity向Android發(fā)送消息,如果Android又能給Unity回饋消息那么這就玩美了。恰好Unity for Andoid 和iOS一樣都是可以相互與Unity發(fā)送與接收消息
上一篇文章我們學(xué)習(xí)了Unity向Android發(fā)送消息,如果Android又能給Unity回饋消息那么這就玩美了。恰好Unity for Andoid 和 IOS一樣都是可以相互與Unity發(fā)送與接收消息,這篇文章MOMO就和大家好好聊聊Android向Unity發(fā)送消息的方法。在讀本片博文之前,建議大家讀一下我上一篇文章Unity3D研究院之打開(kāi)Activity與調(diào)用JAVA代碼傳遞參數(shù)(十八),有關(guān)數(shù)據(jù)打包方面在上一篇中已經(jīng)說(shuō)的很清楚,這里就不再贅述。
我們?cè)陧?xiàng)目中創(chuàng)建兩個(gè)Activity一個(gè)是主Activity一個(gè)是新打開(kāi)的Activity和內(nèi)容方面與上一篇文章類似。
UnityTestActivity.java 主Activity ,提供一個(gè)接口方法StartActivity(),它是由Unity中調(diào)用
[代碼]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 打開(kāi)這個(gè)界面后,程序?qū)⒃谶@里向Unity發(fā)送消息。
[代碼]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; 因?yàn)橄騏nity發(fā)送消息的靜態(tài)方法寫在這里。
注釋1:意思是點(diǎn)擊發(fā)送按鈕后,程序?qū)⑾騏nity發(fā)送消息。UnityPlayer.UnitySendMessage() 參數(shù)1表示發(fā)送游戲?qū)ο蟮拿Q,參數(shù)2表示對(duì)象綁定的腳本接收該消息的方法,參數(shù)3表示本條消息發(fā)送的字符串信息,這個(gè)方法與IOS發(fā)送消息的方式非常相像。
接著,我們打開(kāi)Unity工程將Android插件打包好復(fù)制在Unity工程當(dāng)中,詳細(xì)打包過(guò)程請(qǐng)看上一章,將腳本Test.cs綁定在Main Camera對(duì)象中,此時(shí)由于UnityPlayer.UnitySendMessage()方法發(fā)送消息給MainCamera對(duì)象,所以需要在Main Camera對(duì)象綁定的腳本中去接收這個(gè)消息,也就是說(shuō)要在Test.cs腳本中接收。

(圖片比較大,點(diǎn)擊后瀏覽大圖)
下面我們看看Test.cs腳本
[代碼]c#/cpp/oc代碼:
02 |
using System.Collections; |
04 |
public class Test : MonoBehaviour |
08 |
private string stringToEdit = "Please enter a string"; |
12 |
//點(diǎn)擊手機(jī)返回鍵關(guān)閉應(yīng)用程序 |
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 |
//調(diào)用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的參數(shù) |
33 |
jo.Call("StartActivity0",stringToEdit); |
42 |
void messgae(string str) |
注解1:讓代碼放置在using中是為了告訴垃圾回收站及時(shí)的回收垃圾,建議這樣來(lái)寫代碼。AndroidJavaClass表示一個(gè)java 類,AndroidJavaObject表示一個(gè)java對(duì)象,在上一章已經(jīng)明確說(shuō)明。另外還有一些其它的方法,比如調(diào)用靜態(tài)方法等,都在API中寫的很清楚,大家可以查閱學(xué)習(xí)。
注解2:剛剛調(diào)用的方法UnityPlayer.UnitySendMessage()參數(shù)2為”message”,所以程序?qū)⒄{(diào)用 Main Camera對(duì)象的Test.cs腳本的message方法,參數(shù)為Android傳遞過(guò)來(lái)的。***在這里修改了stringToEdit變量刷新了屏幕的UI。

打開(kāi)程序后將啟動(dòng)Unity畫面,如上圖在這里我們寫了輸入框接收用戶的鍵盤輸入,***用戶點(diǎn)擊commit按鈕程序?qū)⒋蜷_(kāi)Android的 Activity,并且將字符串“Please enter a string”做為參數(shù)傳遞給了新Activity。

如上圖所示,在新打開(kāi)的Activity中已經(jīng)看到Please enter a string字符串已經(jīng)顯示在界面當(dāng)中,在布局文件中同樣寫了Android的高級(jí)控件 輸入框與按鈕,在輸入框中輸入字符串“xuanyusong”(任意輸入),點(diǎn)擊保存按鈕將把”xuanyusong”剛剛輸入的字符串傳遞給 Unity。

如上圖所示,此時(shí)在Unity中字符串“xuanyusong”已經(jīng)顯示在輸入框中,那么這樣就比較***了實(shí)現(xiàn)發(fā)送與接收消息。