【unity】与Android Activity交互并调用JAVA代码传递参数
http://www.xuanyusong.com/archives/667
?????????Unity for Android 比較特殊,Unity for IOS 打包是將XCODE工程直接交給開發(fā)者,開發(fā)者可以在工程的基礎(chǔ)上繼續(xù)添加新的視圖,最后由開發(fā)者自行打包生成IPA包,發(fā)布程序。而Unity for Android打包直接生成APK包,等于說源代碼開發(fā)者是看不到的,但是Unity的自身確實有些局限,針對Android平臺我們需要學(xué)習(xí)如何在Unity中調(diào)用Android的JAVA代碼。本章我們的目標(biāo)是使用Unity的腳本打開Activity。首先我們創(chuàng)建一個普通的Android工程,目錄結(jié)構(gòu)如下圖所示。
?
?
? ? ? ? ?因為項目需要使用Unity提供的接口,所以需要將接口classes.jar引入至當(dāng)前工程但中。接口包的所在地,打開Finder->應(yīng)用程序->Unity->點擊Unity圖標(biāo),鼠標(biāo)右鍵選擇“顯示包內(nèi)容”->Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar 。接口包引入工程后,開始編寫JAVA代碼。
?
UnityTestActivity.java
C#
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 | 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); ????} ? ????public void StartActivity1(String name) ????{ ???? Intent intent = new Intent(mContext,TestActivity1.class); ???? intent.putExtra("name", name); ???? this.startActivity(intent); ????} } |
?
? ? ? ? ?UnityTestActivity是主Activity,Unity程序一起動就會調(diào)用這個Activity,它是在AndroidManifest.xml中配置的。它需要繼承UnityPlayerActivity,然而它就是剛剛我們引入的classes.jar包中提供的接口類。UnityTestActivity對外提供了兩個方法接口,StartActivity0(String name) 方法與StartActivity1(String name)方法,這兩個方法是在Unity中使用C#腳本調(diào)用的,意思是調(diào)用后程序?qū)⒋蜷_一個新的Activity,參數(shù)name也是由C#腳本傳遞過來的,接著將傳遞的String參數(shù)繼續(xù)傳遞給新打開的Activity。
?
TestActivity0.java
C#
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 | package com.xys; ? import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; ? public class TestActivity0 extends Activity { ????/** Called when the activity is first created. */ ????@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")); ? ????????Button close = (Button)this.findViewById(R.id.button0); ????????close.setOnClickListener(new OnClickListener() { ? @Override public void onClick(View v) { ? TestActivity0.this.finish(); } }); ????} ? } |
?
TestActivity1.java
C#
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 | package com.xys; ? import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; ? public class TestActivity1 extends Activity { ????/** Called when the activity is first created. */ ????@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")); ? ????????Button close = (Button)this.findViewById(R.id.button0); ????????close.setOnClickListener(new OnClickListener() { ? @Override public void onClick(View v) { ? TestActivity1.this.finish(); } }); ????} ? ????public void Start() ????{ ? ????} ? } |
?
? ? ? ?
? ? ? ?使用this.getIntent().getStringExtra(“name”)方法,得到上個界面?zhèn)鬟f過來的字符串,并且顯示在屏幕中,用于區(qū)分新打開的Activity。TestActivity0與TestActivity1是兩個新打開的Activity,它們屬于Unity程序的子Activity所以它不需要繼承UnityPlayerActivity,直接繼承Activity即可,在代碼中監(jiān)聽了一個按鈕,意思是點擊按鈕后關(guān)閉當(dāng)前的Activity。
?
接著是代碼中打開的一個布局文件,這個應(yīng)該沒什問題,學(xué)過Android開發(fā)的朋友應(yīng)該都能看懂,我就不詳細解釋了。
main.xml
C#
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 | <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen" ????android:layout_width="fill_parent" android:layout_height="fill_parent" ????android:orientation="vertical"> ????<LinearLayout ????????android:layout_width="fill_parent" android:layout_height="fill_parent" ????????android:orientation="vertical"> ????????<ImageView ???????? android:src="@drawable/jay" ???????? android:layout_width="fill_parent" ???????? android:layout_height="fill_parent" ????????/> ?????? <TextView android:id="@+id/textView0" ??????????android:layout_width="fill_parent" ??android:layout_height="wrap_content" ??android:textColor="#000000" ??android:textSize="18dip" ??android:background="#00FF00" ??????android:text="雨松MOMO 帶你走進Unity for Android的世界" ??????android:gravity="center_verticalcenter_horizontal" /> <TextView android:id="@+id/textView1" ??????????android:layout_width="fill_parent" ??android:layout_height="wrap_content" ??android:textColor="#FFFFFF" ??android:textSize="18dip" ??android:background="#0000FF" ??????android:text="Unity與Android之間的交互" ??????android:gravity="center_verticalcenter_horizontal" ??????/> ????????<Button android:id="@+id/button0" ????????????android:layout_width="fill_parent" android:layout_height="wrap_content" ????????????android:text="關(guān)閉這個Activity"/> ????</LinearLayout> </ScrollView> |
?最后是本程序的AndroidManisest.xml,這個很重要,一定要配置。
C#
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 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ????package="com.xys" ????android:versionCode="1" ????android:versionName="1.0" > ? ????<uses-sdk android:minSdkVersion="7" /> ????<application ????????android:icon="@drawable/ic_launcher" ????????android:label="@string/app_name" > ????????<activity ????????????android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ????????????android:name=".UnityTestActivity" ????????????android:label="@string/app_name" > ????????????<intent-filter> ????????????????<action android:name="android.intent.action.MAIN" /> ????????????????<category android:name="android.intent.category.LAUNCHER" /> ????????????</intent-filter> ????????</activity> ? ????????<activity ????????????android:name=".TestActivity0" ????????????android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ????????????> ????????</activity> ? ????????<activity ????????????android:name=".TestActivity1" ????????????android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ????????????> ????????</activity> ????</application> ? </manifest> |
? ? ? ? 大家請看清楚,這里一共配置了代碼中的三個Activity,并且標(biāo)志UnityTestActivity為主Activity。另外繼承了UnityPlayerActivity后在Eclipse是運行不了的,除非拿到Unity中在真機下才行,請大家繼續(xù)認(rèn)真閱讀本篇博文。
? ? ? ? OK,到這里Android的代碼已經(jīng)寫完,下面我們學(xué)習(xí)如何在Unity中去調(diào)用它。首先Build一下當(dāng)前的Eclipse工程,代碼所有的.class文件都生成在了Android工程的bin文件夾中,當(dāng)前工程的路徑是UnityTestActivity->bin->classes->com->xys->你的.class文件。下面需要對這些.class文件進行打包,蘋果系統(tǒng)的話打開電腦的終端,cd到classes文件夾的目錄下,接著執(zhí)行代碼
1 | jar -cvf class.jar * |
?這行代碼的意思是把當(dāng)前目錄下的所有.class文件打包成.jar文件,保存文件名稱為class.jar。接著class.jar文件就生成在bin->classes->目錄中了。如下圖所示,請大家仔細看一下解開的包應(yīng)該與你的Android對應(yīng)的包名保持一致,我的包名是com.xys,所以文件夾就是class->com->xys->.class代碼。
?
?
? ? ? 確保無誤后,請大家開始創(chuàng)建Unity工程。如下圖所示,Unity工程中文件夾的結(jié)構(gòu)如下,Plugins->Android的名稱不能修改,必需保持一致。接著把Eclipse中Android的工程文件拷貝至這里,除了Android工程中的src文件夾,將其它文件夾全部拷貝至Plugins->Android文件夾中。最后在Plugins->Android文件夾中創(chuàng)建bin文件夾,然后將剛剛生成的.jar文件拷貝進來,jar的名稱可以隨便修改,但是jar包里面必須是com->xys->你的class文件,否則運行程序后提示找不到類文件。
?
?
? ? ? 最后在Unity工程中創(chuàng)建一個C#腳本,就是上圖中的Test.cs,直接將它綁定在攝像機中,它用來通知界面打開Activity。如下圖所示,利用GUI在屏幕中創(chuàng)建兩個按鈕,點擊按鈕打開不同的Activity。
?
Test.cs
C#
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 | using UnityEngine; using System.Collections; ? public class Test : MonoBehaviour { ? // Update is called once per frame void Update () { //當(dāng)用戶按下手機的返回鍵或home鍵退出游戲 if (Input.GetKeyDown(KeyCode.Escape) Input.GetKeyDown(KeyCode.Home) ) ?? { ?? Application.Quit(); ?? } } ? void OnGUI() { if(GUILayout.Button("OPEN Activity01",GUILayout.Height(100))) { //注釋1 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); ?????? AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); ???????? jo.Call("StartActivity0","第一個Activity"); } if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100))) { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); ?????? AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); ???????? jo.Call("StartActivity1","第二個Activit"); } } ? } |
?
注釋1:先得到AndroidJavaClass,然后得到AndroidjavaObject就是當(dāng)前Activity的對象,也就是我們在上面創(chuàng)建的主UnityTestActivity.JAVA。拿到它的對象后調(diào)用jo.Call()參數(shù)1表示調(diào)用UnityTestActivity.JAVA類中的方法名稱,參數(shù)2表示該方法傳遞過去的參數(shù)。如下圖所示:“第一個Activity”與“第二個Activit”就是我在C#中傳遞過去的字符串。
?
?
?
?
在打開的Activity中點擊“關(guān)閉這個Activity按鈕”,程序?qū)⒗^續(xù)回到原來的界面。
?
最后大家一定要注意Unity中的包名,要和Android工程保持一致,否則無法調(diào)用。如下圖所示,Bundle Identifier* 當(dāng)前項目為com.xys 。另外其它的選項也在其中,請大家仔細閱讀。
?
?
另外請大家繼續(xù)關(guān)注雨松MOMO的程序界面專欄
?
這篇文章的源碼我找不到了,但是我找到下一篇文章的源碼, ?不過內(nèi)容都是差不多了,下一篇增加了anroid 向Unity發(fā)送消息。
下載地址:http://vdisk.weibo.com/s/abEoV
本文固定鏈接: http://www.xuanyusong.com/archives/667
轉(zhuǎn)載請注明: 雨松MOMO
2012年05月02日于 雨松MOMO程序研究院 發(fā)表
轉(zhuǎn)載于:https://blog.51cto.com/kenkao/1582633
總結(jié)
以上是生活随笔為你收集整理的【unity】与Android Activity交互并调用JAVA代码传递参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-js处理textarea自动生
- 下一篇: META http-equiv=X-UA