先做它個天貓網站百度搜索關鍵詞
虛幻引擎?支持將項目發(fā)布到?安卓(Android)?移動設備上,并且提供了若干功能幫你將項目發(fā)布到?谷歌游戲商店。本節(jié)包含了如何設置Android開發(fā)環(huán)境、如何使用Android功能和服務、以及如何為發(fā)布游戲做準備相關的指南。
當前SDK要求
- 當前UE版本:5.3
- Android Studio Version: Flamingo 2022.2.1 Patch 2 May 24, 2023
- Android SDK:
- 推薦版本:SDK 33
- 通過編譯要求的最低版本:SDK 30
- 能在設備上發(fā)布所需的最低目標SDK版本:26
不同商城對于目標SDK最低版本的要求是不同的,可能與上文有所不同。
- NDK版本:r25b
- 編譯工具:33.0.1
- Java運行時:OpenJDK 17.0.6 2023-01-17
- 要進AGD調試,需要AGDE v23.1.82+。
當前設備兼容性
The current version of Unreal Engine supports Android devices meeting the following specifications:
- Android 8或更高版本
- 64位Arm CPU
- 兼容的GPU
- Mali T8xx、G71、G72、G76、G77、G78和G71x系列
- Adreno 5xx、6xx或7xx系列
- PowerVR GM9xxx系列
- Xclipse 920
- 兼容的圖形API
- OpenGL ES 3.2
- Vulkan 1.1(需要Android 10或更高版本的設備,以及兼容的驅動程序)
開始入門
設置Android SDK和NDK
如何為虛幻引擎設置你的Android開發(fā)環(huán)境
Android快速入門
Android平臺的開發(fā)設置。
設置Android設備
了解如何設置Android設備以便開發(fā)虛幻引擎項目。
開發(fā)指南
使用 Google Play 成就
利用 Google Play 成就提升玩家粘著度。
在安卓上使用 Ad Mob 游戲內置廣告
在安卓上使用 AdMob 游戲內置廣告系統(tǒng)。
Android Manifest控制
設置及使用Android Mainfest文件。
使用安卓內購
利用內購為安卓游戲增加更多付費內容。
使用 Google Play Services 排行榜
在游戲中使用排行榜。
Android虛擬鍵盤
了解如何設置Android虛擬鍵盤以在UE5中使用。
Android開發(fā)參考
如何安裝不同的Android SDK,設置環(huán)境變量,以及使用紋理格式。
Android Vulkan移動渲染器
介紹Vulkan兼容性以及如何在Android項目中使用移動渲染
設置安卓運行畫面
安卓項目自定義可選運行畫面設置的總覽。
打包和發(fā)布
項目發(fā)布簽名
為項目上架 Google Play 商店做好準備。
Google Play資產交付參考
有關Google PAD API的參考和實現指南
打包Android項目
介紹如何打包最終Android項目。
安卓配置規(guī)則系統(tǒng)
介紹如何在虛幻引擎項目中設置安卓配置規(guī)則系統(tǒng)。
關于Android項目的自定義設備描述和可擴展性
設備描述規(guī)則和可擴展性設置的參考。
調試
調試Android項目
了解如何使用Android Studio調試Android項目。
在Visual Studio中使用AGDE調試
使用AGDE在Visual Studio中調試Android項目
Android文件服務器
使用Android文件服務器代替ADB來推送和編輯虛幻引擎項目的文件。
優(yōu)化
為Android創(chuàng)建捆綁的PSO緩存
為Android設備創(chuàng)建捆綁的PSO緩存的分步驟操作說明。
降低安卓二進制文件大小
了解如何縮小安卓平臺項目的二進制文件。
?
class BpEncryptor : public ndk::BpCInterface<IEncryptor>
{
public:
? ? virtual binder_status_t encrypt(char * src, int length, char* out, int &error) {
? ? ? ? LOGI( "BpEncryptor: encrypt ");
? ? ? ? binder_status_t stat = STATUS_OK;
?
? ? ? ? AParcel* parcelIn;
? ? ? ? stat = AIBinder_prepareTransaction(asBinder().get(), &parcelIn);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? stat = AParcel_writeInt32(parcelIn, length);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? stat = AParcel_writeCharArray(parcelIn, reinterpret_cast<const char16_t *>(src), length);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? stat = AParcel_writeInt32(parcelIn, length);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? ndk::ScopedAParcel parcelOut;
? ? ? ? stat = AIBinder_transact(asBinder().get(), TRANSACTION_ENCRYPT, &parcelIn, parcelOut.getR(), 0 /*flags*/);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? int32_t size = 0;
?
? ? ? ? stat = AParcel_readInt32(parcelOut.get(), &size);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? return stat;
? ? }
?
? ? virtual int decrypt(char * src, int length, char* out, int &error) override{
? ? ? ? LOGI( "BpEncryptor: decrypt ");
? ? ? ? ndk::ScopedAParcel parcelOut;
? ? ? ? binder_status_t stat = STATUS_OK;
? ? ? ? AParcel* parcelIn;
? ? ? ? stat = AIBinder_prepareTransaction(asBinder().get(), &parcelIn);
? ? ? ? if (stat != STATUS_OK) return stat;
?
? ? ? ? stat = AIBinder_transact(asBinder().get(), TRANSACTION_DECRYPT, &parcelIn, parcelOut.getR(), 0 /*flags*/);
?
? ? ? ? return stat;
? ? }
};