本章節(jié)我們講解如何打包發(fā)布到安卓手機(jī)平臺。要為 Android 構(gòu)建和運(yùn)行應(yīng)用程序,必須安裝 Unity Android Build Support 平臺模塊。還需要安裝 Android 軟件開發(fā)工具包(SDK)和原生開發(fā)工具包(NDK)才能在 Android 設(shè)備上構(gòu)建和運(yùn)行代碼。默認(rèn)情況下,Unity 會安裝基于 OpenJDK 的 Java 開發(fā)工具包。
在我們使用Unity Hub 安裝Unity Editor的時候,就會提示我們是否安裝平臺編譯庫。
上面的截圖中我們發(fā)現(xiàn)了“Android Build Support”勾選項,如果我們的項目需要發(fā)布到安卓手機(jī)平臺的話,就需要勾選此項。那么,Unity就會自動幫我們下載安裝SDK,NDK以及OpenJDK了。當(dāng)然,如果安裝的時候沒有選擇也沒有關(guān)系,我們可以通過Unity Hub補(bǔ)充安裝他們。具體的操作,我們也不再詳細(xì)介紹了。
Unity的平臺編譯庫目錄在“Unity Editor\2020.3.35f1c2\Editor\Data\PlaybackEngines”下
這里我們安裝了三個平臺:Android,WebGL,Windows
我們進(jìn)入到“AndoridPlayer”目錄中查看
我們可以看到NDK,OpenJDK,SDK三個目錄。他們的版本與我們的Unity版本有一些關(guān)系。由于我們安裝的是Unity2020版本,我們的NDK是r19版本,我們的OpenJDK是1.8版本,SDK里面有29和30兩個版本。
如果多個 Unity 版本共享 Android SDK & NDK Tools 和 OpenJDK,則可以在 Unity Preferences 窗口中指定一個共享位置。為此,請在菜單欄選擇Edit -> Preferences -> External Tools,并在JDK, SDK 和 NDK 字段中輸入對應(yīng)的安裝目錄即可。
介紹完編譯安卓應(yīng)用程序的環(huán)境配置后,我們來說一下編譯安卓應(yīng)用的一些配置信息。AndroidManifest.xml 是每個android程序中必須的文件,里面包含了應(yīng)用程序的配置信息。該文件是一個XML格式的配置文件,其根標(biāo)簽是manifest,其下很多的子標(biāo)簽用于配置各種信息,比如application用于整個應(yīng)用的配置,activity用于配置活動等等。
AndroidManifest.xml的作用是什么?
1.??? 描述應(yīng)用的包名:Android設(shè)備根據(jù)包名來區(qū)分不同的APP。
2.??? 描述應(yīng)用中的組件:例如Activity,Service,Provider,BroadcastReceiver等組件。
3.??? 描述應(yīng)用所需要訪問的權(quán)限。
另外,安卓應(yīng)用程序一般都是通過gradle工具來構(gòu)建的。谷歌官方推出的Android Studio開發(fā)工具就是使用gradle,我們的Unity也是使用它。該工具對于每一個應(yīng)用程序都會生成一個build.gradle文件。在這個文件中,我們會配置應(yīng)用的包名applicationId,相當(dāng)應(yīng)用程序的id。需要我們了解的是compileSdkVersion,minSdkVersion,targetSdkVersion三項的配置。這三項配置都對應(yīng)了安卓系統(tǒng)的版本。關(guān)于安卓系統(tǒng)的版本,大家可以看以下列表。
系統(tǒng)版本??? ?????? SDK版本??? 版本名稱
Android 11.0??? ? 30???? ???????? (Android 11)
Android 10.0??? ? 29?? ?????????? (Android Q)
Android 9.0??? ??? 28??? ?????????? Pie (Android P)
Android 8.1??? ??? 27??? ?????????? Oreo(Android O)
Android 8.0??? ??? 26??? ?????????? Oreo(Android O)(奧利奧)
Android 7.1??? ??? 25??? ?????????? Nougat(Android N)(牛軋?zhí)牵?/span>
Android 7.0??? ??? 24??? ?????????? Nougat(Android N)(牛軋?zhí)牵?/span>
Android 6.0??? ??? 23?? ??????????? Marshmallow(Android M)(棉花糖)
Android 5.1??? ??? 22??? ?????????? Lollipop(Android L)(棒棒糖)
Android 5.0??? ??? 21??? ?????????? Lollipop(Android L)(棒棒糖)
Android 4.4??? ??? 19??? ?????????? KITKAT(奇巧巧克力)
Android 11是Google于2020年9月9日正式發(fā)布的新的操作系統(tǒng)版本。那么,為什么開發(fā)一個安卓應(yīng)用程序需要配置三個版本呢?由于安卓系統(tǒng)發(fā)布比較頻繁,且對應(yīng)的API也隨之發(fā)生變化。例如:有的API可能會廢棄,有的新添加的API等等。那么,這就造成一個問題,我們的應(yīng)用程序如何在眾多版本中穩(wěn)定的運(yùn)行。也就是說,我們的應(yīng)用程序如何才能最大程度的兼容這些不同版本的安卓系統(tǒng)。
首先,compileSdkVersion指定了Grandle要采用哪個版本的Android SDK編譯自己的應(yīng)用程序,應(yīng)用程序中使用的API級別不得高于編譯用的SDK的版本。Google官方建議總是使用最新版的穩(wěn)定SDK編譯自己的應(yīng)用程序。
其次,minSdkVersion就是應(yīng)用程序可以運(yùn)行的最低系統(tǒng)版本要求。在低于minSdkVersion的Android系統(tǒng)上無法安裝此應(yīng)用程序的。在開發(fā)階段,如果你使用了低于minSdkVersion的API,開發(fā)工具就會發(fā)出警告。對于minSdkVersion的選擇,我們應(yīng)該看各個api的用戶使用占比。一般說來我們適配4.4以上,即minSdkVersion=19,不過還要根據(jù)自己的實際情況,去選擇相應(yīng)的版本號。
說白了,我們使用SDK API的時候,需要介于minSdkVersion和compileSdkVersion之間。但是,如果我們使用的手機(jī)系統(tǒng)高于compileSdkVersion的話,我們的APP就不能安裝運(yùn)行了嘛?肯定不是的,但是某些行為可能會不同。這就涉及到targetSdkVersion的設(shè)置。
最后,targetSdkVersion目標(biāo)SDK版本。targetSdkVersion理解起來要稍微比compileSdkVersion和minSdkVersion困難一些。當(dāng)你設(shè)置了targetSdkVersion的時候,表示你已經(jīng)充分測試過了你的應(yīng)用程序在該目標(biāo)版本的運(yùn)行情況。targetSdkVersion 是 Android 系統(tǒng)提供前向兼容的主要手段。這是什么意思呢?隨著 Android 版本的升級,它的某個的 API的行為可能會發(fā)生改變,但是為了保證我們應(yīng)用程序的行為還是和以前兼容。只要 targetSdkVersion設(shè)置不變,即使這個應(yīng)用程序安裝在新Android 系統(tǒng)上,其行為還是保持老的系統(tǒng)上的行為,這樣就保證了系統(tǒng)對老應(yīng)用的向前兼容性。當(dāng)然,新的系統(tǒng)(大于targetSdkVersion)就會表現(xiàn)新的API行為。因此,作為一名開發(fā)者,應(yīng)該特別注意安卓系統(tǒng)版本更新時的API變化。因此,我們開發(fā)安卓應(yīng)用程序的時候,盡量使用一些基礎(chǔ)穩(wěn)定的API來實現(xiàn)功能,這樣即使一個老版本的應(yīng)用程序放在幾年后的Android新設(shè)備上依然能順利運(yùn)行。
但是對于一些新增加的API,我們就必須在新的安卓版本中才能使用。比如我們當(dāng)前Andorid 9.0(SDK=28),Android 10(SDK=29) 新增了有關(guān)5G的API。我們的應(yīng)用程序想要使用5G相關(guān)的API,這時只需要將compileSdkVersion設(shè)置為29版本,就能在編譯階段編譯通過。此外,還需要注意的是,由于這個5G API是新增的,因此需要判斷當(dāng)前系統(tǒng)版本>=29才能使用新API,否者是不能夠使用的(低于29版本的安卓系統(tǒng)上)。
綜合來看,三者的關(guān)系是:minSdkVersion <= targetSdkVersion <= compileSdkVersion
并且建議 targetSdkVersion和compileSdkVersion一樣。
那么,在Unity中如何設(shè)置compileSdkVersion,minSdkVersion,targetSdkVersion三者呢?我們點(diǎn)擊菜單:Edit -> Project Settings -> Player,選擇 Android 平臺,然后在 Other Settings -> Identification 面板中就能找到了。
?
我們發(fā)現(xiàn)了minSdkVersion和targetSdkVersion兩個項目設(shè)置,沒有發(fā)現(xiàn)compileSdkVersion的設(shè)置。請大家注意的是,Unity的設(shè)置里默認(rèn)targetSdkVersion = compileSdkVersion的。我們根據(jù)上面的截圖顯示,最小版本為 Android4.4(SDK=19),而目標(biāo)編譯版本為“Automatic”。也就是我們安裝的SDK中的最高版本。我們之前提到過,Unity2020默認(rèn)安裝的是安卓版本是有29和30兩個版本。那么,這里就非常明顯了,目標(biāo)編譯版本就是30這個版本。也就是當(dāng)下谷歌發(fā)布的最新的安卓系統(tǒng)版本。以上內(nèi)容,我們了解就可以了。
接下來,我們就開始將我們的“TouchDemo”工程打包發(fā)布安卓應(yīng)用程序。
這個3D模式下的場景內(nèi)容
這是2D模式下的UI內(nèi)容。
在這個工程中,我們給主相機(jī)添加了MoveScript腳本。
接下來,我們雙擊打開這個MoveScript腳本,修改如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveScript : MonoBehaviour
{
// 立方體游戲?qū)ο? public Transform cube;
// 立方體移動速度
private float speed = 2.0f;
public void OnMoveTest(Vector2 v)
{
// 搖桿輸入
float horizontal = v.x;
float vertical = v.y;
// 物體位置變化
Vector3 position = cube.position;
position.x += speed * horizontal * Time.deltaTime;
position.z += speed * vertical * Time.deltaTime;
// 更新物體位置
cube.position = position;
}
}
修改完畢之后,我們在回到主相機(jī)的Inspector檢視面板中,
我們將Hierarchy層次面板中的Cube拖拽到上圖檢視面板MoveScript腳本下的Cube處。說白了,我們就是想使用模擬搖桿來控制Cube移動。我們可以Play查看效果。
接下來,我們就將該工程打包到Android平臺下。首先,我們點(diǎn)擊菜單欄File -> Build Settings,然后彈出的窗口左側(cè)選擇“Android”平臺。如果我們之前選擇了其他平臺,我們就需要再點(diǎn)擊右下角的“Switch Platform”切換平臺。
?
平臺切換完畢后,我們點(diǎn)擊左下角的“Player Settings”按鈕
這里我們設(shè)置公司名稱,應(yīng)用名稱以及啟動圖標(biāo)。
Unity打包Android安裝包的時候,在Resolution and Presentation -> Default Orientation選項中可以設(shè)置游戲的橫豎屏顯示以及是否允許旋轉(zhuǎn)方向。默認(rèn)方向:Auto Rotation(自動旋轉(zhuǎn))。
它的所有選項如下所示:
1. Portrait:豎屏
2. Portrait Upside Down:豎屏,手機(jī)倒過來
3. Landscape Right:橫屏,屏幕在home鍵右邊
4. Landscape Left:橫屏,屏幕在home鍵左邊(比較常用)
5. Auto Rotation:自動旋轉(zhuǎn)屏幕
這里,我們選擇一個Landscape Left吧。
然后我們繼續(xù)展開“Other Settings”
然后找到 Identification 項目
這里我們只修改安卓應(yīng)用程序的包名即可。Unity要求包名的格式為:包名稱必須遵循約定“com.YourCompanyName.YourProductName”,并且只能包含字母數(shù)字和下劃線字符。其中,YourCompanyName和YourProductName基本上已經(jīng)鎖定了。所以,這里基本不用改動。最后我們關(guān)閉當(dāng)前窗口,回到Build Settings窗口,點(diǎn)擊右下角的“Build”按鈕打包發(fā)布了。
選擇一個存儲目錄(E:\workspace\TouchDemo),起名為“TouchDemo.apk”,然后點(diǎn)擊保存。
?
開始打包發(fā)布中,等待一段時間后就打包完成了,我們?nèi)ァ癊:\workspace\TouchDemo”查看
我們將這個APP的安裝包發(fā)給手機(jī)(也可以使用模擬器測試)上面安裝就可以了。
?
?
?
?
這是運(yùn)行后的效果,可以借助“搖桿”來控制Cube移動。文章來源:http://www.zghlxwxcb.cn/news/detail-629022.html
本課程涉及的內(nèi)容已經(jīng)共享到百度網(wǎng)盤:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id文章來源地址http://www.zghlxwxcb.cn/news/detail-629022.html
到了這里,關(guān)于第五十九章 Unity 發(fā)布Android平臺的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!