Unreal Engine 4 bietet genügend Funktionen für die vollständige Spieleentwicklung für mobile Plattformen. Leider ist das Thema nicht gut behandelt und der Prozess der Erstellung der Anwendung selbst ist voller Fehler. Ich beschloss, die momentan relevanten Informationen zusammenzufassen und meine eigenen Erfahrungen mit der Überwindung dieses schwierigen Weges zu teilen. Dieses Tutorial behandelt die folgenden Prozesse im Detail:
Einrichten eines Projekts zur Entwicklung einer mobilen Anwendung
Erstellen einer Release-Version der Anwendung
DLC-Erstellung und deren Verbindung zum Projekt
DLC vom Server herunterladen
Wir brauchen:
Unreal Engine 4.25.1
Python 3
Node.js (optional)
Android-Gerät mit funktionierendem USB-Anschluss
Projekterstellung und Inhaltsvorbereitung
Wenn Sie bereits ein abgeschlossenes Projekt haben, können Sie diese Phase überspringen.
Erstellen Sie ein leeres C ++ - Projekt
Erstellen Sie eine Ordnerstruktur im Inhaltsverzeichnis
Karten hinzufügen
Speichern Sie die Starter-Ebene in einem MapRelease- Ordner namens Release_Map
Erstellen Sie eine neue Ebene über File-> New Level-> Standard und speichern Sie sie im MapDLC Ordner namens DLC_Map
Erstellen Sie Testinhalte
Erstellen eines Akteurs zum Testen der Inhaltsarbeit
Öffnen Sie Release_Map
Erstellen Sie einen Blueprint Actor im MapRelease- Ordner und nennen Sie ReleaseCube
Erstellen Sie im selben Ordner Material, nennen Sie es m_cube und legen Sie eine beliebige Farbe fest
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/
Bearbeiten Sie den Level Blueprint
Ändern Sie die URL zum Herunterladen von Dateien, erstellen Sie das Projekt neu und installieren Sie es erneut auf Ihrem mobilen Gerät.
Der DLC wird jetzt heruntergeladen und installiert.
Fazit
Ich empfehle Ihnen, im Voraus über die Organisation der Dateien in Ihrer Anwendung nachzudenken. Versuchen Sie, den gesamten Code und die Assets, die in verschiedenen DLCs verwendet werden, in der Hauptbaugruppe zu behalten. Dieser Ansatz eliminiert doppelte Dateien und reduziert das Gesamtgewicht der Anwendung.
Ich hoffe, dass dieses Material jemandem hilft, Zeit zu sparen.