上一篇文章咱們學習了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
package com.xys; ide
import android.content.Context; 佈局
import android.content.Intent; 學習
import android.os.Bundle; ui
import com.unity3d.player.UnityPlayerActivity; this
public class UnityTestActivity extends UnityPlayerActivity { spa
/** 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發送消息。
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腳本
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://115.com/file/e7idavxk#android.unitypackage
本文出自 「雨鬆MOMO的程序世界」 博客,請務必保留此出處http://xys289187120.blog.51cto.com/3361352/907703