Unreal Engine 4 Mobile. Créer un projet Android + DLC





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
  1. Ouvrez Release_Map





  2. Créer Blueprint Actor dans le dossier MapRelease et nommer ReleaseCube





  3. Dans le mĂȘme dossier, crĂ©ez un matĂ©riau, nommez-le m_cube et dĂ©finissez-lui une couleur





  4. ReleaseCube Static Mesh Component





  5. Details Static Mesh None





  6. View Options, Show Engine Content





  7. None Cube





  8.  Material (m_cube)





  9. 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
Cliquez pour développer la zone des paramÚtres avancés
,

:





  • 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 . .





Android SDK —  . SDKConfig.





SDKConfig





(com.YourCompany.[PROJECT]). . aBigCompany YourCompany MyProject (AndroidDLC). . My Project with DLC.





APK Packaging








  • Target SDK Version: 29  Google Play





  • Store Version. , Google Play. 1





:





  • Package game data inside .apk —  APK . , Google Play APK (100 mb). APK Android App Bundle,





  • Use ExternalFilesDir for UE4Game files —  . SaveGame Object , . , ,





  • Orientation —  . . — 









arm64 fonctionnera dans la plupart des cas
arm64





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.





Créer un APK + DLC Android minimal
Minimal Android APK + DLC
Créer un dossier pour stocker les fichiers reçus et créer des profils
Profils créés
Dossiers générés









, . - .





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.





  1. New Plugin





  2. —  Content Only





  3. (DLC1)





  4. 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.





blueprint .





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"
      
      



Serveur démarré





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

*.pak . . . -. 





.





FTP , FileZilla.





Site Manager





  1. New Site





  2. (FTP Port : 21)





  3. 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/





Si vous voyez la structure des dossiers, il est fort probable que tout soit fait correctement.
Si vous voyez la structure des dossiers, il est fort probable que tout soit fait correctement.









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.








All Articles