Unity for Android 比較特殊,Unity for IOS 打包是將XCODE工程直接交給開發(fā)者,開發(fā)者可以在工程的基礎上繼續(xù)添加新的視圖,最后由開發(fā)者自行打包生成IPA包,發(fā)布程序
Unity for Android 比較特殊,Unity for IOS 打包是將XCODE工程直接交給開發(fā)者,開發(fā)者可以在工程的基礎上繼續(xù)添加新的視圖,***由開發(fā)者自行打包生成IPA包,發(fā)布程序。而Unity for Android打包直接生成APK包,等于說源代碼開發(fā)者是看不到的,但是Unity的自身確實有些局限,針對Android平臺我們需要學習如何在 Unity中調用Android的JAVA代碼。本章我們的目標是使用Unity的腳本打開Activity。首先我們創(chuàng)建一個普通的Android工程,目錄結構如下圖所示。

因為項目需要使用Unity提供的接口,所以需要將接口classes.jar引入至當前工程但中。接口包的所在地,打開Finder->應用程序->Unity->點擊Unity圖標,鼠標右鍵選擇“顯示包內容”->Contents->PlaybackEngines->AndroidPlayer->bin->classes.jar 。接口包引入工程后,開始編寫JAVA代碼。
UnityTestActivity.java
[代碼]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); |
19 |
public void StartActivity0(String name) |
21 |
Intent intent = new Intent(mContext,TestActivity0.class); |
22 |
intent.putExtra("name", name); |
23 |
this.startActivity(intent); |
26 |
public void StartActivity1(String name) |
28 |
Intent intent = new Intent(mContext,TestActivity1.class); |
29 |
intent.putExtra("name", name); |
30 |
this.startActivity(intent); |
UnityTestActivity是主Activity,Unity程序一起動就會調用這個Activity,它是在 AndroidManifest.xml中配置的。它需要繼承UnityPlayerActivity,然而它就是剛剛我們引入的classes.jar 包中提供的接口類。UnityTestActivity對外提供了兩個方法接口,StartActivity0(String name) 方法與StartActivity1(String name)方法,這兩個方法是在Unity中使用C#腳本調用的,意思是調用后程序將打開一個新的Activity,參數name也是由C#腳本傳遞過來的,接著將傳遞的String參數繼續(xù)傳遞給新打開的Activity。
TestActivity0.java
[代碼]java代碼:
03 |
import android.app.Activity; |
04 |
import android.os.Bundle; |
05 |
import android.view.View; |
06 |
import android.view.View.OnClickListener; |
07 |
import android.widget.Button; |
08 |
import android.widget.TextView; |
10 |
public class TestActivity0 extends Activity { |
11 |
/** Called when the activity is first created. */ |
13 |
public void onCreate(Bundle savedInstanceState) { |
14 |
super.onCreate(savedInstanceState); |
15 |
setContentView(R.layout.main); |
17 |
TextView text = (TextView)this.findViewById(R.id.textView1); |
18 |
text.setText(this.getIntent().getStringExtra("name")); |
20 |
Button close = (Button)this.findViewById(R.id.button0); |
21 |
close.setOnClickListener(new OnClickListener() { |
24 |
public void onClick(View v) { |
26 |
TestActivity0.this.finish(); |
TestActivity1.java
[代碼]java代碼:
03 |
import android.app.Activity; |
04 |
import android.os.Bundle; |
05 |
import android.view.View; |
06 |
import android.view.View.OnClickListener; |
07 |
import android.widget.Button; |
08 |
import android.widget.TextView; |
10 |
public class TestActivity1 extends Activity { |
11 |
/** Called when the activity is first created. */ |
13 |
public void onCreate(Bundle savedInstanceState) { |
14 |
super.onCreate(savedInstanceState); |
15 |
setContentView(R.layout.main); |
17 |
TextView text = (TextView)this.findViewById(R.id.textView1); |
18 |
text.setText(this.getIntent().getStringExtra("name")); |
20 |
Button close = (Button)this.findViewById(R.id.button0); |
21 |
close.setOnClickListener(new OnClickListener() { |
24 |
public void onClick(View v) { |
26 |
TestActivity1.this.finish(); |
使用this.getIntent().getStringExtra(“name”)方法,得到上個界面?zhèn)鬟f過來的字符串,并且顯示在屏幕中,用于區(qū)分新打開的Activity。TestActivity0 與TestActivity1是兩個新打開的Activity,它們屬于Unity程序的子Activity所以它不需要繼承 UnityPlayerActivity,直接繼承Activity即可,在代碼中監(jiān)聽了一個按鈕,意思是點擊按鈕后關閉當前的Activity。
接著是代碼中打開的一個布局文件,這個應該沒什問題,學過Android開發(fā)的朋友應該都能看懂,我就不詳細解釋了。
main.xml
[代碼]xml代碼:
01 |
<?xml version="1.0" encoding="utf-8"?> |
02 |
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen" |
03 |
android:layout_width="fill_parent" android:layout_height="fill_parent" |
04 |
android:orientation="vertical"> |
06 |
android:layout_width="fill_parent" android:layout_height="fill_parent" |
07 |
android:orientation="vertical"> |
09 |
android:src="@drawable/jay" |
10 |
android:layout_width="fill_parent" |
11 |
android:layout_height="fill_parent" |
13 |
<TextView android:id="@+id/textView0" |
14 |
android:layout_width="fill_parent" |
15 |
android:layout_height="wrap_content" |
16 |
android:textColor="#000000" |
17 |
android:textSize="18dip" |
18 |
android:background="#00FF00" |
19 |
android:text="雨松MOMO 帶你走進Unity for Android的世界" |
20 |
android:gravity="center_vertical|center_horizontal" |
22 |
<TextView android:id="@+id/textView1" |
23 |
android:layout_width="fill_parent" |
24 |
android:layout_height="wrap_content" |
25 |
android:textColor="#FFFFFF" |
26 |
android:textSize="18dip" |
27 |
android:background="#0000FF" |
28 |
android:text="Unity與Android之間的交互" |
29 |
android:gravity="center_vertical|center_horizontal" |
31 |
<Button android:id="@+id/button0" |
32 |
android:layout_width="fill_parent" android:layout_height="wrap_content" |
33 |
android:text="關閉這個Activity"/> |
***是本程序的AndroidManisest.xml,這個很重要,一定要配置。
[代碼]xml代碼:
01 |
<?xml version="1.0" encoding="utf-8"?> |
02 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
04 |
android:versionCode="1" |
05 |
android:versionName="1.0" > |
07 |
<uses-sdk android:minSdkVersion="7" /> |
09 |
android:icon="@drawable/ic_launcher" |
10 |
android:label="@string/app_name" > |
12 |
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" |
13 |
android:name=".UnityTestActivity" |
14 |
android:label="@string/app_name" > |
16 |
<action android:name="android.intent.action.MAIN" /> |
17 |
<category android:name="android.intent.category.LAUNCHER" /> |
22 |
android:name=".TestActivity0" |
23 |
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" |
28 |
android:name=".TestActivity1" |
29 |
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" |
大家請看清楚,這里一共配置了代碼中的三個Activity,并且標志UnityTestActivity為主Activity。另外繼承了 UnityPlayerActivity后在Eclipse是運行不了的,除非拿到Unity中在真機下才行,請大家繼續(xù)認真閱讀本篇博文。
OK,到這里Android的代碼已經寫完,下面我們學習如何在Unity中去調用它。首先Build一下當前的Eclipse工程,代碼所有的.class文件都生成在了Android工程的bin文件夾中,當前工程的路徑是 UnityTestActivity->bin->classes->com->xys->你的.class文件。下面需要對這些.class文件進行打包,蘋果系統的話打開電腦的終端,cd到classes文件夾的目錄下,接著執(zhí)行代碼
這行代碼的意思是把當前目錄下的所有.class文件打包成.jar文件,保存文件名稱為class.jar。接著class.jar文件就生成在 bin->classes->目錄中了。如下圖所示,請大家仔細看一下解開的包應該與你的Android對應的包名保持一致,我的包名是 com.xys,所以文件夾就是class->com->xys->.class代碼。

確保無誤后,請大家開始創(chuàng)建Unity工程。如下圖所示,Unity工程中文件夾的結構如下,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。
[[106613]]
Test.cs
[代碼]c#/cpp/oc代碼:
02 |
using System.Collections; |
04 |
public class Test : MonoBehaviour |
07 |
// Update is called once per frame |
10 |
//當用戶按下手機的返回鍵或home鍵退出游戲 |
11 |
if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) ) |
19 |
if(GUILayout.Button("OPEN Activity01",GUILayout.Height(100))) |
22 |
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); |
23 |
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); |
24 |
jo.Call("StartActivity0","***個Activity"); |
26 |
if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100))) |
28 |
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); |
29 |
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); |
30 |
jo.Call("StartActivity1","第二個Activit"); |
注釋1:先得到AndroidJavaClass,然后得到AndroidjavaObject就是當前Activity的對象,也就是我們在上面創(chuàng)建的主UnityTestActivity.JAVA。拿到它的對象后調用jo.Call()參數1表示調用UnityTestActivity.JAVA類中的方法名稱,參數2表示該方法傳遞過去的參數。如下圖所示:“***個Activity”與“第二個Activit”就是我在C#中傳遞過去的字符串。


在打開的Activity中點擊“關閉這個Activity按鈕”,程序將繼續(xù)回到原來的界面。
[[106615]]
***大家一定要注意Unity中的包名,要和Android工程保持一致,否則無法調用。如下圖所示,Bundle Identifier* 當前項目為com.xys 。另外其它的選項也在其中,請大家仔細閱讀。

另外請大家繼續(xù)關注的程序界面專欄
這篇文章的源碼我找不到了,但是我找到下一篇文章的源碼, 不過內容都是差不多了,下一篇增加了anroid 向Unity發(fā)送消息。