將Unity3D遊戲移植到Android平臺上

將Unity3D遊戲移植到Android平臺是一件很容易的事情,只須要在File->Build Settings中選擇Android平臺,而後點擊Switch Platform並Build出apk便可。一般,咱們的工做不只限於此,通常還須要給手機遊戲加入計費、廣告等功能。這些功能通常沒有提供Unity3D插件,咱們須要將遊戲導出爲Android工程,而後添加這些功能;或者,咱們根據這些計費sdk來作本身想要的Unity3D插件,而後直接在Unity3D中使用。java

1.從Unity3D到Android工程android

 爲了實現交互,咱們採用的是簡單的函數相互調用。若是咱們在Unity3D中想調用Android代碼,那麼能夠在腳本文件C#中這樣寫:app

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity"); activity.Call("UnlockGame")

第一行代碼構造了"com.unity3d.player.UnityPlayer"類的一個對象,而後獲取了本類的靜態成員"currentActivity",取得了activity就能夠調用Android代碼了(若是你在Unity導出的Eclipse工程中查看unity-class.jar這個文件中的類,你會發現com.unity3d.player這個package下就有UnityPlayer.class這個類,這個類中有個currentActivity)。這個UnlockGame函數是簡單的成員方法,通常直接寫在MainActivity中,也就是說Android代碼中必需要有UnlockGame這個函數,而後才能調用;而"com.unity3d.player.UnityPlayer"和"currentActivity"都是默認的參數。eclipse

若是要在Android工程中調用Unity3D中的方法,咱們須要新建一個Android工程。能夠這樣寫java代碼:ide

UnityPlayer.UnitySendMessage("AndroidManager", "AndroidCallBackUnlockGame", "");

這裏調用了Unity3D中"AndroidCallBackUnlockGame"這個方法,最終激活了遊戲。第一個參數表示Unity3D中某個gameObject,第二個參數是這個gameObject上的腳本中的某個方法,第三個參數是這個方法的參數。函數

上面只是講述了交互的基本原理,下面是詳細步驟。ui

(1)在Unity3D中建立腳本,如上面第一段代碼所示,加入調用Android函數的代碼;若是Android要調用C#代碼,也要寫下被Android代碼回調的C#函數。而後,把Unity項目導出爲Android工程便可。這裏須要注意下圖紅色部分,其中Bundle Identifier就是導出的Android工程的包名。this

(2)打開Eclipse,導入工程,選擇import->Existing Android Code Into Workspace,最好把Copy Into WorkSpace選項也選上,這個工程一般叫作「UnityPlayerProxyActivity」。導入工程後,咱們能夠直接運行這個工程了。但這裏是爲了與Android代碼交互,因此還不能這樣作。一般的方法是,咱們新建一個Android Application Project,包名必須與導入的工程包名相同;而後把導入的工程做爲新工程的Library Project,在工程的Properties裏設置,以下圖所示。spa

(3)將導入的Unity工程assets目錄裏的bin和libs目錄(新版的沒有lib目錄)拖放到新工程的assets目錄裏,即移動資源位置而已。說明一點,新建的Android工程做爲了主工程,導入的Unity工程做爲了Library Project,它們的Assets和Res資源將會最終合併在一塊兒,但主工程必需要添加Library工程中全部須要的配置信息,也就是AndroidManifest.xml中的內容。這裏還可能遇到資源ID衝突的現象,優先級高的主工程將覆蓋優先級低的工程。插件

(4)好了,如今咱們有兩個工程,一個是新建的,一個是從Unity3D中導入的。這裏必須學點Android開發的基礎知識,onCreate函數是入口函數,其它的自學吧。想在Android裏調用Unity3D代碼,就用本文開頭的第二段代碼便可。一般,咱們在新工程裏建立一個Activity,在AndroidManifest.xml裏進行設置要啓動的Activity。假設要啓動的是MainActivity,那麼對於MainActivity這個類,咱們要讓它繼承UnityPlayerActivity這個類,而後在Oncreate裏調用super.onCreate便可。而後,運行新工程,咱們的Unity3D遊戲也跟着啓動了。咱們的主工程是新建的,沒有設置任何視圖,之因此啓動了遊戲,是由於繼承了UnityPlayerActivity這個類,而後調用super.onCreate經過父類啓動了遊戲。

public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } }

 

既然是基礎,我在說的詳細點。首先建立新的Android Application Project,注意包名與導入的工程一致,而且不要建立Activity, 咱們手動建立。而後新建一個類,類名暫且爲MainActivity,package name必須與前面說的一致。而後寫上上圖中的代碼。若是有錯誤提示,按下ctrl + shift + O能夠導入所需類庫。若是還有紅色錯誤,請檢查你是否引用了Unity工程。咱們要手動建立Activity,還要在AndroidManifest.xml這個文件裏作設置,以下所示。

    <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="orientation|keyboard" android:screenOrientation="landscape"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

其中的android:name=".MainActivity"表示這個Activity關聯的類是前面建立的MainActivity類,這裏省略了前面的包名。已經設置完了,如今能夠run了。有一點要記住,若是你在Unity的C#代碼裏調用了某個Android函數,MainActivity類中必定要添加這個函數。另外,若是你不添加android:screenOrientation可能會致使程序啓動崩潰。

 

2.從Android工程到Unity3D

(1)新建一個Android工程,不要建立Activity,在properties屬性裏把工程設置爲library.

(2)到安裝目錄C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下面複製classes.jar這個文件到Android工程的libs目錄下面。

(3)新建一個類,這裏是MainActivity,寫法以下,咱們會在Unity3D中調用TextToast這個函數。這裏一樣要注意包名,要與Unity3D中Bundle Identifier相同。注意這裏必須使用runOnUiThread處理UI線程。

public class MainActivity extends UnityPlayerActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } protected void TextToast(final String msg){ runOnUiThread(new Runnable(){ public void run(){ Text(msg); } }); } public void Text(String msg){ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }

 (4)在菜單裏選擇Project->Clean,而後在工程目錄的bin下面找到剛生成的jar文件,咱們能夠直接把這個jar文件導入Unity3D中做爲插件使用,即放到目錄Assets/Plugins/Android下面便可。在Unity3D的安裝目錄C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer下面找到AndroidManifest.xml這個文件,也複製到Assets/Plugins/Android這個目錄下。打開這個xml文件,修改Activity名稱與eclipse工程中的Activity一致,即把com.unity3d.player.UnityPlayerProxyActivity修改成包名.MainActivity,我這裏是com.activ8.ppt.MainActivity。設置完成,咱們如今能夠在Unity3D中使用該插件了,使用方法見本文開頭第一段代碼。Unity4.3之後,配置文件修改方法已經改變,還要修改package爲你的包名,建議查看Unity Manual文檔,查找」Building Plugins for Android",而後查找」AndroidManifest.xml「文件便可看到相關設置代碼。

相關文章
相關標籤/搜索