安卓調用unity的3D界面

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,整個過程就是這樣的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章