Unreal Engine 4 proporciona suficiente funcionalidad para el desarrollo de juegos completo para plataformas móviles. Desafortunadamente, el tema no está bien cubierto y el proceso de construcción de la aplicación en sí está lleno de errores. Decidí resumir la información que es relevante en este momento y compartir mi propia experiencia de superar este difícil camino. Este tutorial cubre los siguientes procesos en detalle:
Configurar un proyecto para desarrollar una aplicación móvil
Crear una versión de lanzamiento de la aplicación
Creación de DLC y su conexión con el proyecto
Descarga de DLC del servidor
Necesitaremos:
Unreal Engine 4.25.1
Python 3
Node.js (opcional)
Dispositivo Android con un puerto USB que funcione
Creación de proyectos y preparación de contenidos
Si ya tiene un proyecto terminado, puede omitir esta etapa.
Crea un proyecto de C ++ vacío
Cree una estructura de carpetas en el directorio de contenido
Agregar tarjetas
Guardar el nivel de arranque a un MapRelease carpeta llamada Release_Map
Crear un nuevo nivel a través de Archivo-> Nueva Nivel-> defecto y la guarda en el MapDLC carpeta llamada DLC_Map
Crear contenido de prueba
Crear un actor para probar el trabajo del contenido
Abrir Release_Map
Cree Blueprint Actor en la carpeta MapRelease y nombre ReleaseCube
En la misma carpeta, cree Material, asígnele el nombre m_cube y establezca cualquier color para él
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/
Editar el plano de nivel
Cambie la URL para descargar archivos, reconstruya y reinstale el proyecto en su dispositivo móvil.
El DLC ahora se está descargando e instalando.
Conclusión
Le recomiendo que piense en la organización de los archivos en su aplicación con anticipación. Intente mantener todo el código y los activos utilizados en diferentes DLC en el ensamblado principal. Este enfoque eliminará los archivos duplicados y reducirá el peso total de la aplicación.
Espero que este material ayude a ahorrar tiempo a alguien.