將Unity3D游戲移植到Android平台上


將Unity3D游戲移植到Android平台是一件很容易的事情,只需要在File->Build Settings中選擇Android平台,然后點擊Switch Platform並Build出apk即可。通常,我們的工作不僅限於此,一般還需要給手機游戲加入計費、廣告等功能。這些功能一般沒有提供Unity3D插件,我們需要將游戲導出為Android工程,然后添加這些功能;或者,我們根據這些計費sdk來做自己想要的Unity3D插件,然后直接在Unity3D中使用。

1.從Unity3D到Android工程

 為了實現交互,我們采用的是簡單的函數相互調用。如果我們在Unity3D中想調用Android代碼,那么可以在腳本文件C#中這樣寫:

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"都是默認的參數。

如果要在Android工程中調用Unity3D中的方法,我們需要新建一個Android工程。可以這樣寫java代碼:

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

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

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

(1)在Unity3D中創建腳本,如上面第一段代碼所示,加入調用Android函數的代碼;如果Android要調用C#代碼,也要寫下被Android代碼回調的C#函數。然后,把Unity項目導出為Android工程即可。這里需要注意下圖紅色部分,其中Bundle Identifier就是導出的Android工程的包名。

(2)打開Eclipse,導入工程,選擇import->Existing Android Code Into Workspace,最好把Copy Into WorkSpace選項也選上,這個工程通常叫做“UnityPlayerProxyActivity”。導入工程后,我們可以直接運行這個工程了。但這里是為了與Android代碼交互,所以還不能這樣做。通常的方法是,我們新建一個Android Application Project,包名必須與導入的工程包名相同;然后把導入的工程作為新工程的Library Project,在工程的Properties里設置,如下圖所示。

(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“文件即可看到相關設置代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM