標籤:
用Unity3D開發需要把動畫效果移植到現有的APP上面。Unity for Android 比較特殊,Unity for IOS 打包是將XCODE工程直接交給開發人員,開發人員可以在工程的基礎上繼續添加新的視圖,最後由開發人員自行打包產生IPA包,發布程式。而Unity for Android打包直接產生APK包,等於說原始碼開發人員是看不到的。試想下,人家既然能打包成APK安裝包肯定是走了android-sdk的打包流程,有這流程我們自然能拿到源碼(即便是反編譯)。研究了一會兒,發現其實很簡單,寫了一個小DEMO放上來。所有操作如下
首先建立一個android工程,這個很簡單就不詳細說明了。然後開啟Unity的安裝目錄,找到需要用的class.jar檔案,就是封裝調用unity引擎的java源碼,位置在Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar(安裝目錄),然後複製這個檔案到android工程的libs目錄,系統會自動引用,adt22以下不記得會不會,如果不會的話需要自己設定一下,右鍵工程
添加這個檔案即可。
然後把MainAtivity稍微改一下,就是把繼承父類改成UnityPlayerActivity,這樣就對接上了unity介面,源碼如下:
package com.lee.unityandroid;import android.os.Bundle;import android.widget.RelativeLayout;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);RelativeLayout layout = (RelativeLayout) findViewById(R.id.parent_layout);layout.addView(mUnityPlayer.getView());}}
為了顯明觀察顯示,布局稍微改動了一下。把這個顯示在我們的視圖上。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <RelativeLayout android:id="@+id/parent_layout" android:layout_width="300dp" android:layout_height="500dp" android:layout_centerInParent="true" > </RelativeLayout></RelativeLayout>
配置資訊清單檔,這個裡面的包名要用到後面Unity的
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lee.unityandroid" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.lee.unityandroid.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
android基本上就完成了。現在建立一個Unity工程,名字啥的隨便取,然後在菜單File->Build Settings->Android->Player Settings
最後產生的APK檔案我們直接解壓,把裡面的assets目錄下面的data目錄複寫到我們工程的assets目錄下,然後把lib目錄下的armeabi-v7a或armeabi一起複製(如果都有的話,只有其中一個就複製一個即可),最後編譯我們的程式,運行效果如下:
白色是我們的版面配置容器,藍色就是unity視圖內容了。
下面繼續說下在Unity中調用Andriod的函數,在Unity工程中建立一個C#指令碼,直接將它綁定在攝像機中,它用來通知介面開啟Activity。如所示,利用GUI在螢幕中建立兩個按鈕,點擊按鈕開啟不同的Activity。
using UnityEngine;using System.Collections; public class Test : MonoBehaviour{ // Update is called once per framevoid Update (){//當使用者按下手機的返回鍵或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("Method01","第一個方法");}if(GUILayout.Button("OPEN Activity02",GUILayout.Height(100))){ AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); jo.Call("Method02","第二個方法");}} }
以上代碼就是Java裡面的反射機制。
- 本文固定連結: http://www.ithtw.com/2910.html
- 轉載請註明: leehom 2015年05月15日 於 IT十萬為什麼 發表
Unity3D移植到自己的Android程式