Unreal Engine 4 fournit suffisamment de fonctionnalitĂ©s pour dĂ©velopper pleinement des jeux pour les plates-formes mobiles. Malheureusement, le sujet n'est pas bien couvert et le processus de crĂ©ation d'application lui-mĂȘme est plein de bogues. J'ai dĂ©cidĂ© de rĂ©sumer les informations qui sont pertinentes pour le moment et de partager ma propre expĂ©rience de surmonter ce chemin difficile. Ce didacticiel couvre en dĂ©tail les processus suivants:
Mise en place d'un projet de développement d'une application mobile
Création d'une version finale de l'application
Création de DLC et sa connexion au projet
Téléchargement du DLC depuis le serveur
Nous aurons besoin:
Unreal Engine 4.25.1
Python 3
Node.js (facultatif)
Appareil Android avec un port USB fonctionnel
Création de projet et préparation de contenu
Si vous avez déjà un projet terminé, vous pouvez ignorer cette étape.
Créer un projet C ++ vide
Créer une structure de dossiers dans le répertoire Content
Ajouter des cartes
Enregistrez le niveau de démarrage dans un dossier MapRelease appelé Release_Map
Créer un nouveau niveau via Fichier-> Nouveau Niveau-> Par défaut et l' enregistrer dans le MapDLC dossier appelé DLC_Map
Créer du contenu de test
Créer un acteur pour tester le travail de contenu
Ouvrez Release_Map
Créer Blueprint Actor dans le dossier MapRelease et nommer ReleaseCube
Dans le mĂȘme dossier, crĂ©ez un matĂ©riau, nommez-le m_cube et dĂ©finissez-lui une couleur
ReleaseCube Static Mesh Component
Details Static Mesh None
View Options, Show Engine Content
None Cube
Material (m_cube)
ReleaseCube Release_Map
Level Blueprint
DLC_Map. Blueprint Actor DLCSphere m_sphere MapDLC. DLCSphere DLC_Map .
Edit->Plugins. . , .
Android Runtime Permission
Online Subsystem
Online Subsystem Null
Online Subsystem Utils
TCP Messaging
UDP Messaging
Mobile Patching Utilities
GooglePAD
Online Subsystem Google Play
Actor Layer Utilities
Actor Sequence
Alembic Importer
Apple Image Utils
Apple Movie Player
Audio Capture
Cable Component
Camera Shake Previewer
Chaos Cloth
Chaos Cloth Editor
Cahos Niagara
Cahos Solver
CahosEditro
CharacterAI
Custom Mesh Component
Editable Mesh
Facial Animation Bulk Importer
Level Sequencer Editor
LigthPropogationVolume
Magic Leap
Magic Leap Light Estimation
Magic Leap Media Player
Magic Leap Passable World
Mesh Painting
Niagara
Oculus VR
Online Subsystem iOS
Paper2D
PhysX Vehicles
Procedural Mesh Component
Steam VR
Edit-> Project Settings.
Target Hardware Mobile/Tablet
Game Default Map
Packaging .
Packaging
Share Material Shader Code. DLC .
Packaging
:
Create compressed cooked packages â
List of maps to include in a packaged build â ( ), .
Project
Full Rebuild
, For Distribution . (gradle)
Rendering
Rendering , â Bloom. .
. . , . Support Atmospheric Fog, Atmospheric Fog World Outliner. Sky Sphere . .
SDKConfig
(com.YourCompany.[PROJECT]). . aBigCompany YourCompany MyProject (AndroidDLC). . My Project with DLC.
APK Packaging
Windows. :
keytool -genkey -v -keystore MyProjectKey.keystore -alias MyProjKey -keyalg RSA -keysize 2048 -validity 10000
. .
C:\User\(Current user) MyProjectKey.keystore.
Build Folder (âŠ\AndroidDLC\Build\Android) .
().
Project Launcher
Window->Project Launcher.
, . - .
Any Project :
Google Play APK DLC Shipping . Development .
Android APK
Android APK.
. :
, :
:
APK
:
Done Project Launcher.
, . , ...\AndroidDLC\Saved\Cooked\Android_ETC2.
EngineMaterials
, DefaultBloomKernel.uexp. Bloom , *.pak , , .
DLC
DLC Unreal Engine 4 . *.pak , .
, . . , , ( ).
DLC
Edit -> Plugins.
New Plugin
â Content Only
(DLC1)
Create Plugin
.
Android DLC
Android DLC.
, DLC, , Android APK. :
:
âŠ/Android_Release/HTTPchunks DLC1.0 DLC.
Browse DLC:
:
, DLC:
DLC
DLC:
:
- *.mainfest:
, . âŠ\Android_Release\HTTPchunks\DLC1\Android_ETC2. :
DLC1\AndroidDLC\ *.pak . AndroidDLC\Plugins\DLC1\Saved\Cooked\Android_ETC2
CloudDir .
Android_Release\App\1.0\Android_ETC2.
Install_AndroidDLC-arm64.bat . , .
My Project with DLC . Release_Map. 10 DLC_Map, .
DLC Mobile Patching Utilities
Android, .
Level Blueprint Release_Map.
Request Content DLC :
:
Remote Manifest URL â yourserver.com/manifest_name.manifest
Cloud URL â yourserver.com/[folder_with_ChunksV3_folder]
Install Directory â ( â DLC)
ChunksV3 CloudDir:
ChunksV3 *.pak DLC, .
Install Directory , , :
*.pak Mount:
Pak Order â
Mount Point â .
, . Node.js.
:
http-server "F:\Unreal Projects\AndroidDLC\Android_Release\HTTPchunks\DLC1\Android_ETC2\CloudDir"
Level Blueprint
Remote Manifest â http://127.0.0.1:8080/AndroidDLC_AndroidDLCDLC1.manifest
Cloud URL â http://127.0.0.1:8080
Play, Release_Map. ...\AndroidDLC\PersistentDownloadDir\DLC *pak , .
DLC
DLC . , *.pak .
Level Blueprint
Android APP . AndroidDLC-Android_ETC2.pak AndroidDLC_AndroidDLCDLC1.manifest APK.
APK
Install_AndroidDLC-arm64.bat . :
%ADB% %DEVICE% shell rm -r %STORAGE%/Android/data/com.aBigCompany.MyProject/files/DLC %ADB% %DEVICE% push AndroidDLC_AndroidDLCDLC1.manifest %STORAGE%/Android/data/com.aBigCompany.MyProject/files/DLC/AndroidDLC_AndroidDLCDLC1.manifest %ADB% %DEVICE% push AndroidDLC-Android_ETC2.pak %STORAGE%/Android/data/com.aBigCompany.MyProject/files/DLC/AndroidDLC-Android_ETC2.pak
. . , DLC .
DLC
DLC
.
FTP , FileZilla.
Site Manager
New Site
(FTP Port : 21)
Connect
DLC
app-content. DLC.
. :
func.php
<?php
function generateLink($link){
return '<a href="'.$link.'">'.$link.'</a>';
}
function genFileStructCurrentDir($root_dir){
if (is_dir($root_dir)){
$files = opendir($root_dir); {
if ($files){
while (($item = readdir($files)) !== FALSE){
if ($item != '.' && $item != '..' && $item != 'index.php'){
echo generateLink($item) . " <br>";
}
}
}
}
}
}
?>
index.php
<?php
include '/var/www/uXXXXX/data/www/[YOUR_DOMAIN]/func.php';
?>
<html>
<head></head>
<body>
<?
$full_dir = __DIR__;
genFileStructCurrentDir($full_dir);
?>
</body>
</html>
include:
include '/var/www/uXXXXX/data/www/[YOUR_DOMAIN]/func.php';
:
web-file-gen.py - Python index.php DCL1.
web-file-gen.py
import os
import shutil
path_to_index = 'index.php'
def copy_file_to_directory(destination:str, path_to_file:str):
if os.path.isdir(destination):
shutil.copy(path_to_file,destination)
def get_subdirectories(root_dir:str):
out_list = []
if os.path.isdir(root_dir):
for item in os.listdir(root_dir):
rel_pth = f'{root_dir}/{item}'
if os.path.isdir(rel_pth):
out_list.append(rel_pth)
out_list += get_subdirectories(rel_pth)
return out_list
def copy_file_to_dirs(dir_list:list, path_to_file:str):
for folder in dir_list:
if os.path.isdir(folder):
copy_file_to_directory(folder, path_to_file)
dir_list = get_subdirectories(os.getcwd())
copy_file_to_dirs(dir_list,path_to_index)
input("Done")
.../www/your_domain func.php.
.../app-content index.php DLC1.
http://your_domain/app-content/DLC1/ChunksV3/
Modifier le plan de niveau
Modifiez l'URL de téléchargement des fichiers, reconstruisez et réinstallez le projet sur votre appareil mobile.
Le DLC est maintenant en cours de téléchargement et d'installation.
Conclusion
Je vous recommande de réfléchir au préalable à l'organisation des fichiers dans votre application. Essayez de conserver tout le code et les ressources utilisés dans différents DLC dans l'assemblage principal. Cette approche éliminera les fichiers en double et réduira le poids global de l'application.
J'espÚre que ce matériel aidera quelqu'un à gagner du temps.