unity和android來回調用的方法一般有2種,第一種,把安卓項目導出成jar放到unity的plugins的文件夾中,第二種,把unity項目導出android項目,再在eclipse中修改完成使用。
網上很多講解第一種的,比如雨鬆的等等, 沒什麼問題,講解得也很詳細,這裏就不多說了。主要描述下第二種方法。
創建一個unity項目,最簡單的中間顯示一個cube,轉成安卓平臺,BuildSetting 右側選中Google Android Project ,這裏如果想讀取安卓手機裏的IO文件,在Inspector窗口把WriteAccess改成External(SDCard)-當然在安卓工程中的AndroidManifest.xml修改也可以。好了這就是我們要在安卓中顯示的unity窗口的內容項目了,設置一個包名 com.xxxxx.xxxx,把它放到一邊。
創建或打開一個安卓 eclipse項目,這個項目就是我們想嵌入unity的工程。這個工程的包名也要和剛纔設置的一致。打開 AndroidManifest.xml,我們增加一個activity 就像這樣
<activity
android:name="com.xxxxxx.xxxxx.U3DActivity"
android:screenOrientation="landscape" >
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
第三行是爲了橫屏顯示,如果不寫可能會閃退,注意包名跟上面是一致的。然後創建這個activity的類,就像這樣
public class U3DActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_3d);
setContentView( mUnityPlayer.getView() );
}
}
R的layout的值在res的layout中添加設置好,這兩句哪個都行,然後我就不描述別activity是怎麼跳到這個unity的activity中來的了 關鍵字Intent。
在res的layerout中設置一下窗口的屬性,就像這樣
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/UnityView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
好了,現在我們在eclipse中導入剛纔我們用unity導出的項目,導進來後應該會是這樣 UnityPlayerNativeActivity 名的一個工程,右鍵工程->Properties->android 設置成跟主工程同一安卓版本,然後點選 Is Library Apply OK。拷貝項目下的assets下的bin目錄到主工程中的相同目錄下。右鍵主工程->Properties->android 設置Add 把剛纔設置的library添加進來。別忘了clean工程,或者乾脆重啓一下eclipse,清清緩存的東西。
OK這樣兩個工程就算掛接上了。
然後我再記錄一下雙方互相調用的方式。
安卓端還是調用UnityPlayer.UnitySendMessage來訪問場景中掛在腳本函數的對象來調用。
unity端可以
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startActivity", "do sth");
有時會因爲工程activity的複雜失敗 那麼可以用下面的方式
var jc = new AndroidJavaClass("com.xxxx.xxxx.U3DActivity");
AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("getInstance");
jo.Call("StartActivity", "param");
注意這裏是你的包名。後面這種方法需要在安卓的U3DActivity類下寫一個靜態的getInstance方法
public static Magic3DActivity getInstance(){
return _this;
}//這個this在這個activitiy創建時賦值就行了
如此,就可以在unity和android來回跳轉了。如果你不想在跳轉的時候關閉雙方,可以這麼處理:
在主工程的兩個跳轉activity中這樣寫
public static Intent _2dActicity = null;
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
public void StartActivity(String name)
{
_2dActicity = new Intent(mContext, MainActivity.class);
_2dActicity.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(_2dActicity);
}
這樣就只是提到前面來了
OK,整個過程就是這樣的