上一篇文章我們學習了Unity向Android發送消息,如果Android又能給Unity回饋消息那麼這就玩美了。恰好Unity for Andoid 和 IOS一樣都是可以相互與Unity發送與接收消息,這篇文章MOMO就和大家好好聊聊Android向Unity發送消息的方法。在讀本片博文之前,建議大家讀一下我上一篇文章Unity3D研究院之打開Activity與調用JAVA代碼傳遞參數(十八),有關數據打包方面在上一篇中已經說的很清楚,這裏就不再贅述。
我們在項目中創建兩個Activity一個是主Activity一個是新打開的Activity和內容方面與上一篇文章類似。
UnityTestActivity.java 主Activity ,提供一個接口方法StartActivity(),它是由Unity中調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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發送消息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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://vdisk.weibo.com/s/abEoV