CityDriver

CityDriver

Not enough ratings
Fahrzeug-Modding
By ScoDev and 1 collaborators
Willkommen zur Fahrzeug-Modding-Dokumentation von ViewApp für CityDriver! In dieser Dokumentation werden wir dir zeigen, wie du dein eigenes Fahrzeug für CityDriver erstellen und in das Spiel einfügen kannst.
   
Award
Favorite
Favorited
Unfavorite
Einleitung
Willkommen zur Fahrzeug-Modding-Dokumentation von ViewApp für CityDriver! In dieser Dokumentation werden wir dir zeigen, wie du dein eigenes Fahrzeug für CityDriver erstellen und in das Spiel einfügen kannst.

Bevor wir jedoch loslegen können, müssen wir sicherstellen, dass wir die notwendigen Werkzeuge haben. Eines der wichtigsten Werkzeuge für das Modding von CityDriver ist die Unreal Engine. Diese wird benötigt um deine eigenen Assets wie z.B. Meshes, Sounds und Texturen in das Spiel zu laden.

Bitte stelle sicher, dass du zum Modding einer aktuellen Version von CityDriver die Unreal Engine 5.1 verwendest. Die Engine kannst hier herunterladen: https://www.unrealengine.com/de/download

Zum Programmieren von Logik werden Lua Scripts verwendet. Bitte beachte, dass wir in dieser Dokumentation keine Erklärungen zur Programmierung mit Lua oder zum Erstellen von 3D Modellen zur Verfügung stellen können, und daher diese Kenntnisse zur Erstellung eines Mods für CityDriver vorraussetzen.

Wenn du dich mit den Entwicklern und dem Rest der Community austauschen möchtest bezüglich des Fahrzeug-Moddings, kannst du uns gerne auf unserem Discord anschließen: https://discord.gg/viewapp-community
Neues Fahrzeug erstellen
Kopiere ein bestehendes Fahrzeug
Um ein neues Fahrzeug zu erstellen ist es am einfachsten, zunächst ein bestehendes Fahrzeug zu kopieren. Öffne das CityDriver-Installationsverzeichnis. Im Ordner "CityDriver/Content/Paks/Vehicles" befinden sich sowohl die Spieler- als auch die KI-Fahrzeuge. In diesem Ordner sollte allerdings nichts verändert werden, da eventuelle Änderungen durch Updates überschrieben werden konnten. Alle Mods, die du erstellst, können in DOKUMENTE/ViewApp/CityDriver/Vehicles/ platziert werden, z.B. DOKUMENTE/ViewApp/CityDriver/Vehicles/NewVehicleABC/

Such dir ein vorhandenes Spielerfahrzeug aus und erstelle eine Kopie des entsprechenden Ordners im oben genannten Pfad. Gib dem kopierten Ordner einen aussagekräftigen Namen (am besten der Name deines Fahrzeugs) und öffne ihn. Öffne die Datei "data.json" mit einem Texteditor (z.B. Windows-Editor, Notepad++, ...).

Der erste und wichtigste Schritt in der "data.json" besteht darin, dem Fahrzeug eine eindeutige ID zuzuweisen. Um eine ID zu erhalten, öffne folgende Seite: https://guidgenerator.com/online-guid-generator.aspx Entferne den Haken bei "Hyphens" und klicke auf "Generate some GUIDs!" Als Resultat erhälst du eine Buchstabenkombination, die du als ID verwenden kannst. Kopiere diese Buchstabenkombination in die Zwischenablage. In der "data.json" suche die Einträge "id" und "selectedProfileId" und ersetze für beide die bestehende Buchstabenkombination durch die neue ID aus der Zwischenablage.

Trage die Metadaten ein
Innerhalb des Eintrags "meta" kannst du diverse Metadaten eintragen:

Parameter
Datentyp
Beschreibung
manufacturer
String
Der Herstellername
playerDriveable
Boolean
"true" gibt an, dass es sich um ein Spielerfahrzeug handelt, "false" bedeutet, dass es sich um ein KI-Fahrzeug handelt.
model
String
Die Modellbezeichnung
author
String
Autor/Ersteller des Fahrzeugmods
version
String
Versionsnummer des Mods
description
String
Eine Kurzbeschreibung des Fahrzeugs
category
String
Fahrzeugart. Derzeit möglich: Sedan, Coupe, SportsCar, StationWagon, Hatchback, Convertible, Suv, MiniVan, Van, PickUp, Other

Besipiel
"meta": { "manufacturer": "Volta", "playerDriveable": true, "model": "Model E", "author": "ViewApp GmbH", "version": "0.1", "description": "The Volta Model E features a high-performance electric powertrain, rapid acceleration, long range and fast charging capability.", "category": "Sedan" },
Verwenden eigener Assets in der Unreal Engine
Um deine eigenen Assets im Spiel zu verwenden, musst du sie in ein Unreal-Engine-Projekt importieren und dann ein Paket (.pak) mit deinen Assets exportieren, um diese dann ins Spiel laden zu können. Wir haben ein Projekt für die Community erstellt, das ein Plugin mit einigen Tools enthält, um diese Vorarbeit zu vereinfachen. Du kannst es von hier herunterladen: https://dl.viewapp.com/CityDriverModdingProject.zip

Du kannst loslegen, indem du das Projekt mit der Unreal Engine 5.1 öffnest und deine ersten Assets importierst. Achte darauf, dass du nur Assets in den Plugin-Ordner "MyCar1 Content" importierst:

Vergewissere dich, dass sich alle von deinen verwendeten Elementen ("Assets") in diesem Ordner befinden, da sie sonst nicht exportiert und somit auch nicht im Spiel geladen werden können.

Wenn du mit den importierten Elementen zufrieden bist, klicke auf die Schaltfläche "Exportieren", die du in der Symbolleiste finden kannst:


Für den Exportvorgang muss ein Ordner ausgewählt werden. Alle modifizierten Fahrzeuge sollten in den Ordner DOCUMENTS/ViewApp/CityDriver/Vehicles abgespeichert werden. Du kannst also einen Ordner mit dem Namen "MyCar1" erstellen und diesen im Dialog auswählen. Die Assets werden dann in den Zielordner exportiert und stehen beim nächsten Start des Spiels zum Laden bereit.
Fahrzeugmeshes einbinden - Teil 1
Skeleton
Für Animationen muss zwingend ein Skeleton vorhanden sein. Das SkeletalMesh sollte dabei keine Meshes enthalten, sondern nur die entsprechenden Bones. Die folgenden Bones müssen unbedingt vorhanden sein und exakt so benannt sein:

Name des Bone/Joint
Beschreibung
jnt_Car_root
Der Root-Bone. An diesem Bone wird das Chassis angehängt.
jnt_Wheel_front_L
Die Radaufhängung des linken Vorderrads inkl. Bremse
jnt_Wheel_front_R
Die Radaufhängung des rechten Vorderrads inkl. Bremse
jnt_Wheel_rear_L
Die Radaufhängung des linken Hinterrads inkl. Bremse
jnt_Wheel_rear_R
Die Radaufhängung des rechten Hinterrads inkl. Bremse
jnt_Tire_front_L
Der linke Vorderreifen. Sollte ein Child von jnt_Wheel_front_L sein
jnt_Tire_front_R
Der rechte Vorderreifen. Sollte ein Child von jnt_Wheel_front_R sein
jnt_Tire_rear_L
Der linke Hinterreifen. Sollte ein Child von jnt_Wheel_front_L sein
jnt_Tire_rear_R
Der rechte Hinterreifen. Sollte ein Child von jnt_Wheel_front_R sein

Des weiteren muss für jeden Fahrzeugteil, der animiert werden soll (z.B. Türen, Lenkrad, Knöpfe, ...) ein eigener Bone an der entsprechenden Position vorhanden sein. Diese Bones können beliebig benannt werden.

Exportiere die Bones aus deiner 3D-Software als FBX-Datei und importiere sie im Unreal-Editor. Öffne das SkeletalMesh. Unter Asset Details->Physics->Physics Asset klicke auf Create New Asset->Physics Asset. Wähle einen Dateinamen und Speicherort und klicke auf "Save". Wähle im nächsten Schritt das importierte SkeletalMesh aus. Im nächsten Schritt trage für "Min Bone Size" 0.0 ein und klicke auf "Create Asset". Wenn du alles richtig gemacht hast, solltest du ein entsprechendes PhysicsAsset erhalten. Achte darauf, dass dieses PhysicsAsset im SkeletalMesh als PhysicsAsset eingetragen ist.

Um das SkeletalMesh mit dem Fahrzeug zu verknüpfen, klicke zunächst im Unreal-Editor mit der rechten Maustaste auf das SkeletalMesh und wähle "Copy Reference" aus. In der Datei "data.json" suche den Eintrag "skeletonReferencePath" und füge die kopierte Referenz dort ein.

Static Meshes
Das Chassis, die Räder sowie alle Fahrzeugteile, die unabhängig voneinander animiert werden sollen (z.B. Türen, Lenkrad, Knöpfe, ...) müssen als eigene Meshes vorliegen. Exportiere diese Teile einzeln als FBX-Dateien und importiere sie im Unreal-Editor.

Chassis
Static Meshes werden im Fahrzeugordner in der Datei "profiles/default.json" eingetragen. Zunächst sollte das Chassis eingetragen werden. Suche den Eintrag "chassis". Dort gibt es die folgenden Einträge:

Parameter
Datentyp
Beschreibung
meshReferencePath
Referenzpfad
Referenz auf das StaticMesh. (Rechtsklick auf das StaticMesh und "Copy Reference" auswählen)
width
Float
Fahrzeugbreite in cm
height
Float
Fahrzeughöhe in cm
mass
Float
Fahrzeuggewicht in kg
dragCoefficient
Float
downforceCoefficient
Float
Luftwiderstands-Anpresskraft. Wenn das Fahrzeug bei hohen Geschwindigkeiten zittert, sollte dieser Wert angepasst werden.
CenterOfMassOffset
Float
Damit kann der Schwerpunkt verschoben werden. Diese Werte haben einen großen Einfluss auf das Fahrverhalten. Mit dem X-Wert kann beeinflusst werden, ob das Fahrzeug eher zum Übersteuern oder zum Untersteuern neigt: Ein positiver Wert bewirkt ein Untersteuerndes Verhalten, ein negativer Wert ein Übersteuerndes Verhalten. Der Y-Wert sollte immer 0 sein. Der Z-Wert sollte immer negativ sein. Ein stärker negativer Wert führt zu einem strafferen Fahrwerk, während ein nur leicht negativer Wert ein weiches Fahrwerk zur Folge hat.

Beispiel
"chassis": { "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_Body.SM_MA_Pelota7TSi_Body'", "width": 180, "height": 145, "mass": 1300, "dragCoefficient": 0.05, "downforceCoefficient": 0.1, "CenterOfMassOffset": { "x": 30.0, "y": 0.0, "z": -56.0 } }
Fahrzeugmeshes einbinden - Teil 2
Räder
Als nächstes können die Räder eingetragen werden. Jedes Rad hat einen eigenen Eintrag, welcher die folgenden Parameter haben kann:

Parameter
Datentyp
Optional
Beschreibung
meshReferencePath
Referenzpfad
Referenz auf das StaticMesh. (Rechtsklick auf das StaticMesh und "Copy Reference" auswählen)
verticalPosition
String
"front" oder "rear", entsprechend der Position des Rades
horizontalPosition
String
"left" oder "right", entsprechend der Position des Rades
affectedBySteering
Boolean
Legt fest, ob dieses Rad gelenkt werden kann
affectedByEngine
Boolean
Legt fest, ob dieses Rad angetrieben ist
affectedByBrakes
Boolean
Legt fest, ob dieses Rad gebremst wird
affectedByHandbrake
Boolean
Legt fest, ob die Handbremse auf dieses Rad wirkt
rimRadius
Float
Der Radius der Felge in cm
radius
Float
Der Radius des Reifen in cm
width
Float
Die Reifenbreite in cm
frictionForceMultiplier
Float
X
Faktor, wie gut die Haftung dieses Rades ist
springRate
Float
X
Federrate
springPreload
Float
X
Federvorspannung
maxBrakeTorque
Float
X
Maximale Bremskraft an diesem Rad in Newtonmeter
maxHandBrakeTorque
Float
X
Maximale Handbremskraft an diesem Rad in Newtonmeter
maxBrakeSpeed
Float
X
corneringStiffness
Float
X
sideSlipModifier
Float
X
slipThreshold
Float
X
skidThreshold
Float
X
suspensionAxis
Vektor
X
suspensionForceOffset
Vektor
X
suspensionMaxRaise
Float
X
suspensionMaxDrop
Float
X
suspensionDampingRatio
Float
X
suspensionSmoothing
Float
X
wheelLoadRatio
Float
X
rollbarScaling
Float
X
maxSteerAngle
Float
X

Beispiel
"wheels": [ { "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_Tire_front_L.SM_MA_Pelota7TSi_Tire_front_L'", "verticalPosition": "front", "horizontalPosition": "left", "affectedBySteering": true, "affectedByEngine": true, "affectedByBrakes": true, "affectedByHandbrake": false, "radius": 32, "width": 23, "frictionForceMultiplier": 6.0, "springRate": 80.0, "springPreload": 50.0, "maxBrakeTorque": 1700.0, "suspensionDampingRatio": 0.1, "corneringStiffness": 500.0 }, { "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_Tire_front_L.SM_MA_Pelota7TSi_Tire_front_L'", "verticalPosition": "front", "horizontalPosition": "right", "affectedBySteering": true, "affectedByEngine": true, "affectedByBrakes": true, "affectedByHandbrake": false, "radius": 32, "width": 23, "frictionForceMultiplier": 6.0, "springRate": 80.0, "springPreload": 50.0, "maxBrakeTorque": 1700.0, "suspensionDampingRatio": 0.1, "corneringStiffness": 500.0 }, { "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_Tire_front_L.SM_MA_Pelota7TSi_Tire_front_L'", "verticalPosition": "rear", "horizontalPosition": "left", "affectedByEngine": false, "affectedByBrakes": true, "affectedByHandbrake": true, "radius": 32, "width": 23, "frictionForceMultiplier": 6.0, "springRate": 80.0, "springPreload": 50.0, "maxBrakeTorque": 1700.0, "maxHandBrakeTorque": 1700.0, "suspensionDampingRatio": 0.1, "corneringStiffness": 500.0 }, { "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_Tire_front_L.SM_MA_Pelota7TSi_Tire_front_L'", "verticalPosition": "rear", "horizontalPosition": "right", "affectedByEngine": false, "affectedByBrakes": true, "affectedByHandbrake": true, "radius": 32, "width": 23, "frictionForceMultiplier": 6.0, "springRate": 80.0, "springPreload": 50.0, "maxBrakeTorque": 1700.0, "maxHandBrakeTorque": 1700.0, "suspensionDampingRatio": 0.1, "corneringStiffness": 500.0 } ]
Fahrzeugmeshes einbinden - Teil 3
Attachments
Alle sonstigen Meshes müssen als Attachments eingetragen werden. Für ein Attachment sind zunächst die folgenden Parameter relevant:
Parameter
Datentyp
Optional
Beschreibung
name
String
Der Name des Attachments, kann beliebig gewählt werden
role
String
X
Die Rolle des Attachments. Nähere Details siehe unten.
meshReferencePath
Referenzpfad
Referenz auf das StaticMesh. (Rechtsklick auf das StaticMesh und "Copy Reference" auswählen)
target
String
Name des Bones an den das Attachment angehängt werden soll.
positionOffset
Vektor
X
Hiermit kann die Position des Attachments relativ zum Bone verschoben werden
rotationOffset
Vektor
X
Hiermit kann die Rotation des Attachments relativ zum Bone verändert werden

Für Attachments gibt es noch weitere Parameter, die an passender Stelle erklärt werden.

Rolle
Bestimmten Attachments muss eine Rolle zugewiesen werden, damit sie korrekt funktionieren. Derzeit gibt es die folgenden Rollen:

Name der Rolle
Beschreibung
SteeringWheel
Lenkrad
FrontLeftDoor
Linke Vordertür
FrontRightDoor
Rechte Vordertür
RearLeftDoor
Linke Hintertür
RearRightDoor
Rechte Hintertür
EngineHood
Motorhaube oder Frunk
Trunk
Kofferraumklappe
Driver
Fahrerfigur
Passenger
Beifahrerfigur

Falls keine Rolle zutreffend ist, kann der Parameter "role" weggelassen werden.

Beispiel
{ "name": "SteeringWheel", "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/VW_Golf7_TSi_2019/Meshes/SM_MA_Pelota7TSi_SteeringWheel.SM_MA_Pelota7TSi_SteeringWheel'", "target": "jnt_SteeringWheel", "role": "SteeringWheel" }, { "name": "Driver", "role": "Driver", "meshReferencePath": "StaticMesh'/Game/Crowd/Character/DrivingPoseMeshes/Tesla_Model3/Clemens/Clemens_DP_Tesla_Model3.Clemens_DP_Tesla_Model3'", "target": "jnt_Car_root", "positionOffset": { "x": 0, "y": 0, "z": 0 }, "rotationOffset": { "yaw": 0, "pitch": 0, "roll": 0 } }
Kameraansichten
In der "data.json" können unter "cameras" mehrere Kameraansichten definiert werden. Jede Kameraansicht kann die folgenden Parameter haben:

Parameter
Datentyp
Beschreibung
location
Vektor
Gibt die Koordinaten der Kamera an
rotation
Rotation
Gibt die Standardrotation der Kamera an
accelerationMovementFactors
Vektor
Mit diesem Parameter lässt sich festlegen, wie stark sich Fliehkräfte auf die Kamera auswirken, während das Fahrzeug beschleunigt. Funktioniert nur in Kombination mit "applyMovementEffects"
brakingMovementFactors
Vektor
Mit diesem Parameter lässt sich festlegen, wie stark sich Fliehkräfte auf die Kamera auswirken, während das Fahrzeug bremst. Funktioniert nur in Kombination mit "applyMovementEffects"
movementLimitationBox
Vektor
Begrenzt die maximale Kamerabewegung durch Fliehkräfte
type
String
Legt fest, um welche Kamera es sich handelt. Mit Ausnahme von Additional sollte es nur eine Kamera pro Typ geben. Mögliche Kameratypen: DefaultCockpit, DefaultChase, DefaultHood, DefaultTopDown, Additional
restrictedByCollision
Boolean
Wenn dieser Wert auf true gesetzt wird, versucht die Kamera, Kollisionen mit anderen Objekten zu vermeiden. Funktioniert nur, wenn distanceFromRotationPoint auf einen Wert größer 0 gesetzt wird
applyMovementEffects
Boolean
Bestimmt, ob Fliehkräfte auf diese Kamera wirken
playerCanRotate
Boolean
Bestimmt, ob der Spieler diese Kamera mit der Maus rotieren kann
distanceFromRotationPoint
Float
Wenn die Kamera nicht um sich selbst, sondern um einen anderen Punkt rotieren soll (z.B. Außenkamera), dann muss als "location" nicht die Position der Kamera selbst eingetragen werden, sondern die Position des Punktes, um den die Kamera rotiert. Mit dem Parameter "distanceFromRotationPoint" kann dann angegeben werden, wie weit die Kamera vom Rotationspunkt entfernt sein soll
defaultFovDegrees
Float
Standardwert für das Sichtfeldt "Field of View"
rotationSpeed
Float
Rotationsgeschwindigkeit
slightTransitionOffset
Vektor
Offset für die Animation bei Kamerawechsel
cockpitShoulderLookLeftAngle
Float
Winkel, um den die Kamera bei einem Schulterblick nach links rotiert
cockpitShoulderLookLeftPositionOffset
Vektor
Positions-Offset bei einem Schulterblick nach links
cockpitShoulderLookRightAngle
Float
Winkel, um den die Kamera bei einem Schulterblick nach rechts rotiert
cockpitShoulderLookRightPositionOffset
Vektor
Positions-Offset bei einem Schulterblick nach rechts
cockpitLookLeftAngle
Float
Winkel, um den die Kamera bei einem Blick nach links rotiert
cockpitLookRightAngle
Float
Winkel, um den die Kamera bei einem Blick nach rechts rotiert
cockpitLookBehindPositionOffset
Vektor
Positions-Offset bei einem Blick nach hinten
cockpitLookBehindAngle
Float
Winkel, um den die Kamera bei einem Blick nach hinten rotiert
cockpitLookForwardUpPositionOffset
Vektor
Positions-Offset bei einem Blick nach oben
cockpitLookForwardAngle
Float
Winkel, um den die Kamera bei einem Blick nach oben rotiert
SteeringCameraRotationFactor
Float
Multiplikationsfaktor für den Winkel der Lenkradkamera
SteeringCameraCenterDeadZone
Float
Winkel, um den das Lenkrad gedreht werden kann, bevor die Lenkradkamera Wirkung zeigt.
MaxPan
Float
Maximaler Winkel, um den die Kamera horizontal gedreht werden kann. -1 für unbegrenzte Drehung
MaxTiltUp
Float
Maximaler Winkel, um den die Kamera vertikal nach oben gedreht werden kann
MaxTiltDown
Float
Maximaler Winkel, um den die Kamera vertikal nach unten gedreht werden kann
zoomAllowed
Boolean
Bestimmt, ob der Spieler zoomen darf

Wenn ein Parameter weggelassen wird, wird ein Standardwert verwendet.
Antrieb konfigurieren - Motor Teil 1
Der Antriebstrang wird in der "data.json" unter "powerTrain" konfiguriert und besteht immer aus einem Motor und einem Getriebe.

Motor
Der Motor wird im Antriebstrang unter "engine" konfiguriert und hat folgende Parameter. Dabei ist zu beachten, dass manche Parameter nur auf einen bestimmten Motortyp Auswirkungen haben.

Parameter
Datentyp
E*
V*
Beschreibung
identifier
String
X
X
Motortyp. Derzeit möglich: default_electric, default_combustion.
maxPower
Float
X
Maximalleistung in kW
maxRecuperationPower
Float
X
Maximale Rekuperationsleistung in kW
maxTorque
Float
X
Maximales Drehmoment in Nm
maxRecuperationTorque
Float
X
Maximales Rekuperations-Drehmoment in Nm
maxRecuperationAtRPM
Float
X
Motor-Drehzahl, ab der das maximale Rekuperations-Drehmoment wirksam sein soll
minRecuperationAtRPM
Float
X
Motor-Drehzahl, ab der (minimale) Rekuperation möglich ist
useCustomTorqueCurves
Boolean
X
Gibt an, ob für das Motordrehmoment eine eigene Kurve statt der Standardberechnung auf Basis der Motorleistung verwendet werden soll
useCustomRecuperationCurve
Boolean
X
Gibt an, ob für die Rekuperationskraft eine eigene Kurve statt der Standardberechnung auf Basis von maxRecuperationTorque, maxRecuperationAtRPM und minRecuperationAtRPM verwendet werden soll
minRecuperationTorqueForBrakeLight
Float
X
Ab diesem Rekuperations-Drehmoment werden die Bremslichter eingeschaltet
minRecuperationBelowBatteryLevel
Float
X
Unterhalb dieser Batterieladung (0 bis 1) steht (minimale) Rekuperation zur Verfügung. Wenn die Batterieladung höher ist, ist keine Rekuperation möglich
maxRecuperationBelowBatteryLevel
Float
X
Unterhalb dieser Batterieladung (0 bis 1) steht die maximale Rekuperation zur Verfügung
maxReversingSpeed
Float
X
X
Maximalgeschwindigkeit beim Rückwärtsfahren. Ab dieser Geschwindigkeit regelt der Motor ab
powerOutputChangeRate
Float
X
X
Bestimmt, wie schnell der Motor auf Änderungen der Gaspedalstellung reagiert
revUpSpeed
Float
X
Bestimmt, wie schnell der Motor im Leerlauf hochdreht
useOnePedalDrivingThrottleResponse
Boolean
X
Aktiviert den speziellen Gaspedalmodus für One Pedal Driving
onePedalDrivingRecuperationMaxThrottlePosition
Float
X
Wenn One Pedal Driving aktiv ist, hängt die Gaspedalstellung, bei der der Übergang zwischen Beschleunigen und Rekuperieren stattfindet, von der Geschwindigkeit ab. Im Stillstand liegt sie bei 0 (losgelassenes Pedal), sodass man zum Losfahren keinen Totweg überwinden muss. Mit zunehmender Geschwindigkeit verschiebt sich der Übergang bis zu dem hier angegebenen Punkt. Wenn der Übergang zwischen Beschleunigen und Rekuperieren also z.B. maximal bei 50% betätigtem Gaspedal erfolgen soll, muss hier als Wert 0.5 eingetragen werden
onePedalDrivingRecuperationMaxThrottlePositionAtSpeed
Float
X
Die Geschwindigkeit, bei der bei One Pedal Driving der maximale Wert für den Übergang zwischen Beschleunigen und Rekuperieren erreicht werden soll
idlePower
Float
X
Motorleistung im Leerlauf in kW. Wird für die Berechnung des Kraftstoffverbrauchs verwendet
idleRPM
Float
X
Leerlaufdrehzahl
idleRPMAfterColdStart
Float
X
Erhöhte Leerlaufdrehzahl nach Kaltstart
stallRPM
Float
X
Drehzahl unterhalb der der Motor abgewürgt wird
stallTime
Float
X
Zeit in Sekunden, bis der Motor abgewürgt wird
starterTorque
Float
X
Drehmoment des Startermotors
starterTime
Float
X
Zeit, die der Motor zum Starten braucht
coolingFactor
Float
X
Faktor für die Motorkühlung. Wenn der Motor zum Überhitzen neigt, sollte dieser Wert erhöht werden
maxTorqueCurve
Referenzpfad
X
X
Siehe unten
minTorqueCurve
Referenzpfad
X
X
Siehe unten
stallingTorqueCurve
Referenzpfad
X
X
Siehe unten
throttleResponseCurve
Referenzpfad
X
X
Siehe unten
throttleResponseAccelerationCurve
Referenzpfad
X
X
Siehe unten
throttleResponseRecuperationCurve
Referenzpfad
X
X
Siehe unten
maxRecuperationTorqueCurve
Referenzpfad
X
X
Siehe unten
brakeRecuperationCurve
Referenzpfad
X
X
Siehe unten
engineEfficiencyCurve
Referenzpfad
X
X
Siehe unten
throttleEfficiencyCurve
Referenzpfad
X
X
Siehe unten
*E = Elektro; V = Verbrenner
Antrieb konfigurieren - Motor Teil 2
Kurven
Einige Motorparameter müssen über Kurven eingestellt werden. Zu diesem Zweck müssen im Unreal-Editor entsprechende Assets vom Typ "Float Curve" erstellt werden. Diese Assets können mit dem Fahrzeug verknüpft werden, indem man das Asset mit der rechten Maustaste anklickt und "Copy Reference" auswählt. Diese Referenz kann dann in der data.json beim entsprechenden Parameter eingefügt werden.

Im folgenden sind alle Kurventypen mit einer Beispielkurve beschrieben:

MaxTorqueCurve

X-Achse: Drehzahl in U/Min

Y-Achse: Drehmoment in Nm

Diese Kurve gibt das maximale Drehmoment des Motors in Abhängigkeit von der Drehzahl an

MinTorqueCurve

X-Achse: Drehzahl in U/Min

Y-Achse: Drehmoment in Nm

Diese Kurve gibt das Drehmoment des Motors bei losgelassenem Gaspedal an. Unterhalb der Leerlaufdrehzahl sollten die Werte positiv sein, oberhalb der Leerlaufdrehzahl sollten sie negativ sein, um die Motorbremswirkung zu simulieren. Je weiter die Werte in den negativen Bereich hineinragen, desto größer ist die Motorbremswirkung. Der Übergang zwischen positiven und negativen Werten sollte sich idealerweise genau bei der Leerlaufdrehzahl befinden.

StallingTorqueCurve

X-Achse: Drehzahl in U/Min

Y-Achse: Drehmoment in Nm

Diese Kurve gibt das Drehmoment des Motors an, wenn kein Kraftstoff eingespritzt wird (z.B. Leerlaufabschaltung) oder der Motor abgewürgt wird. Dementsprechend sollte die Kurve über den gesamten Verlauf negativ sein.

ThrottleResponseCurve

X-Achse: Gaspedalstellung (0 bis 1)

Y-Achse: Kraftstoffeinspritzung (0 bis 1) beim Verbrenner, bzw. Motorleistung (-1 bis 1) beim Elektroauto

Über diese Kurve wird definiert, wie der Motor auf die Stellung des Gaspedals reagiert. Vor allem bei geringer Gaspedalstellung sollte darauf geachtet werden, dass ausreichend Leistung vorhanden ist, sodass das Fahrzeug gut anfahren kann, ohne einen längeren Pedalweg überwinden zu müssen. Beim Elektroauto bedeuten positive Werte Beschleunigung und negative Werte Rekuperation.

ThrottleResponseAccelerationCurve und ThrottleResponseRecuperationCurve
Wenn "useOnePedalDrivingThrottleResponse" verwendet wird, müssen zwei seperate ThrottleResponse-Kurven für Beschleunigung und Rekuperation definiert werden. Der Übergang zwischen den beiden Kurven wird hierbei automatisch anhand der in "onePedalDrivingRecuperationMaxThrottlePosition" und "onePedalDrivingRecuperationMaxThrottlePositionAtSpeed" festgelegten Werte berechnet.

MaxRecuperationTorqueCurve

X-Achse: Drehzahl in U/Min

Y-Achse: Drehmoment in Nm

Wenn "useCustomRecuperationCurve" true ist, kann mit dieser Kurve das Rekuperationsverhalten in Abhängigkeit zur Drehzahl festgelegt werden.

BrakeRecuperationCurve

X-Achse: Bremspedalstellung (0 bis 1)

Y-Achse: Rekuperationsstärke (0 bis 1)

Mit dieser Kurve kann festgelegt werden, wie stark das Auto in Abhängigkeit zur Bremspedalstellung rekuperiert.

EngineEfficiencyCurve

X-Achse: Drehzahl

Y-Achse: Effizienz (0 bis 1)

Mit dieser Kurve kann festgelegt werden, wie sich die Effizienz des Motors in Abhängigkeit zur Drehzahl verhält. Wird zur Berechnung des Kraftstoffverbrauchs verwendet.

ThrottleEfficiencyCurve

X-Achse: Gaspedalstellung (0 bis 1)

Y-Achse: Effizienz (0 bis 1)

Mit dieser Kurve kann festgelegt werden, wie sich die Effizienz des Motors in Abhängigkeit zur Gaspedalstellung verhält. Wird zur Berechnung des Kraftstoffverbrauchs verwendet.
Antrieb konfigurieren - Getriebe Teil 1
Getriebe
Das Getrieb wird im Antriebstrang unter "engine" konfiguriert und hat folgende Parameter. Dabei ist zu beachten, dass manche Parameter nur auf einen bestimmten Getriebetyp Auswirkungen haben. Außerdem sollte die "default_ev_transmission" nur mit dem "default_electric"-Motor kombiniert werden und die "default_dualclutch_transmission" sowie die "default_manual_transmission" nur mit dem "default_combustion" Motor.

Parameter
Data Type
E*
D*
M*
Description
identifier
String
X
X
X
Getriebetyp. Derzeit möglich: default_ev_transmission, default_dualclutch_transmission, default_manual_transmission
transmissionType
String
X
X
X
Getriebeart: "Automatic" oder "Manual". Sollte zum gewählten Getriebe passen
baseRatio
Float
X
X
X
Das Basis-Übersetzungsverhältnis des Getriebes. Das finale Übersetzungsverhältnis ergibt sich aus dem Basis-Übersetzungsverhältnis multipliziert mit dem Übersetzungsverhältnis des aktuellen Gangs. Beim Elektroauto wird nur das Basis-Übersetzungsverhältnis verwendet
changeTime
Float
X
Zeit in Sekunden, die das Getriebe benötigt, um einen neuen Gang vorzuwählen
efficiency
Float
X
X
X
Getriebe-Effizienz
maxClutchTorque
Float
X
X
Maximales Drehmoment, welches vom Getriebe übertragen werden kann. Sollte größer sein, als das maximale Drehmoment des Motors
maxClutchTorqueSlipping
Float
X
X
Maximales Drehmoment, welches vom Getriebe übertragen werden kann, während die Kupplung schleift. Sollte kleiner sein als "maxClutchTorque". Wenn das Auto sehr ruppig anfährt, kann es helfen, diesen Wert etwas zu reduzieren
clutchFullyDisengagedAtBrakePosition
Float
X
X
Wenn das Bremspedal stärker getreten wird als dieser Wert öffnet das Getriebe die Kupplung, um ein Abwürgen des Motors zu verhindern. Beim Schaltgetriebe wird dieser Wert nur verwendet, wenn die automatische Kupplung aktiv ist
clutchDisengagesAtSpeed
Float
X
X
Unterhalb dieser Geschwindigkeit öffnet das Getriebe die Kupplung, um ein Abwürgen des Motors zu verhindern. Beim Schaltgetriebe wird dieser Wert nur verwendet, wenn die automatische Kupplung aktiv ist
maxClutchSpeed
Float
X
X
Maximale Geschwindigkeit, mit der die Kupplung bewegt wird. Beim Schaltgetriebe wird dieser Wert nur verwendet, wenn die automatische Kupplung aktiv ist
maxClutchSpeedGearSwitching
Float
X
Maximale Geschwindigkeit, mit der das Doppelkupplungsgetriebe vom aktuellen Gang auf den vorgewählten Gang wechselt
maxClutchSpeedDifferenceForEngagingGear
Float
X
Wenn der Drehzahlunterschied zwischen Kupplung und Antriebstrang größer ist als dieser Wert, kann kein Gang eingelegt werden
minClutchPositionForEngagingGear
Float
X
Dieser Wert (0 bis 1) gibt an, wie stark das Kupplungspedal mindestens getreten werden muss, damit ein Gang eingelegt werden kann
drivingOffClutchFactor
Float
X
X
Beim Anfahren regelt das Getriebe die Kupplung so, dass nach Möglichkeit eine gewisse Mindestdrehzahl des Motors nicht unterschritten wird. Wenn dieser Parameter auf 0 gesetzt wird, entspricht der Wert jener Drehzahl, bei der der Motor gerade nicht abgewürgt wird, bei 1 entspricht er der Leerlaufdrehzahl. Es sind auch Werte dazwischen möglich. Durch diesen Parameter wird das Verhalten beim Anfahren maßgeblich beeinflusst. Beim Schaltgetriebe wird dieser Wert nur verwendet, wenn die automatische Kupplung aktiv ist
drivingOffMinClutchSpeed
Float
X
Die Minimalgeschwindigkeit, mit der die Kupplung beim Anfahren bewegt wird
drivingOffMaxClutchSpeed
Float
X
X
Die Maximalgeschwindigkeit, mit der die Kupplung beim Anfahren bewegt wird. Beim Schaltgetriebe wird dieser Wert nur verwendet, wenn die automatische Kupplung aktiv ist
drivingOffMinRPM
Float
X
X
If this parameter is set, the engine tries to maintain the minimum speed specified here by controlling the fuel injection when driving off.
minCreepingSpeedAtIdle
Float
X
Wenn dieser Parameter gesetzt wird, versucht der Motor beim Anfahren durch Regelung der Kraftstoffzufuhr die hier angegebene Mindestdrehzahl zu halten
maxCreepingSpeedAtIdle
Float
X
Die Mindestgeschwindigkeit, mit der das Auto bei eingelegtem Gang und losgelassenen Pedalen kriecht
maxAllowedRpm
Float
X
Maximal erlaubte Motordrehzahl. Wenn ein Hinunterschalten dazu führen würde, dass diese Drehzahl überschritten wird, blockiert das Getriebe den Schaltvorgang
kickdownThreshold
Float
X
Die Gaspedalstellung (0 bis 1) ab der Kickdown aktiviert wird. Funktioniert nur, wenn "dynamicShiftPoints" nicht verwendet wird
dynamicShiftPoints
Boolean
X
Wenn dieser Parameter auf true gesetzt wird, werden die Schaltpunkte dynamisch anhand der Gaspedalstellung verschoben. Erfordert eine entsprechende Kurve bei "dynamicShiftingThrottleResponseCurve"
Tabelle wird in der nächsten Sektion fortgesetzt
*E = default_ev_transmission, D = default_dualclutch_transmission, M = default_manual_transmission
Antrieb konfigurieren - Getriebe Teil 2
Fortsetzung der vorangegangenen Tabelle
Parameter
Data Type
E*
D*
M*
Description
dynamicShiftingThrottleResponseCurve
Reference Path
X
Siehe unten
clutchCurve
Reference Path
X
Siehe unten
useClassicGearSelectorPattern
Boolean
X
X
Wenn dieser Parameter true ist, wird ein klassischer Gangwahlhebel mit der Anordnung P-R-N-D simuliert. Bei false wird ein nicht einrastender Gangwahlhebel nach dem Vorbild moderner Autos simuliert
automaticallyShiftToParkWhenEngineIsOff
Boolean
X
Wenn dieser Parameter true ist, schaltet das Getriebe automatisch in P, wenn der Motor ausgeht
automaticallyShiftToFirstGearAtStandstill
Boolean
X
Wenn dieser Parameter true ist und sich das Automatikgetriebe im manuellen Modus befindet, wird bei Fahrzeugstillstand automatisch der erste Gang eingelegt
reverseGear
-
X
X
Enthält einen Float-Parameter "ratio", welcher das Übersetzungsverhältnis des Rückwärtsgangs angibt
forwardGears
Array
X
X
Siehe unten
*E = default_ev_transmission, D = default_dualclutch_transmission, M = default_manual_transmission

Gänge
ForwardGears
Der Parameter "forwardGears" ist ein Array, welches alle Vorwärtsgänge des Getriebes enthält. Ein Vorwärtsgang hat folgende Parameter:

Parameter
Datentyp
Beschreibung
ratio
Float
Übersetzungsverhältnis
shiftingModes
Array
Siehe unten

ShiftingModes
Ein ShiftingMode enthält die Schaltpunkte für einen Gang (also bei welcher Drehzahl in den nächsten bzw. vorherigen Gang geschaltet wird). Es können beliebig viele ShiftingModes definiert werden. Welcher ShiftingMode aktiv ist, wird über das Fahrzeugscript gesteuert. Wichtig ist allerdings, dass alle Gänge die gleiche Anzahl ShiftingModes haben sollten. Ein ShiftingMode besteht aus den folgenden Parametern:

Parameter
Datentyp
Beschreibung
shiftUpRpm
Float
Drehzahl, bei der in den nächsten Gang geschaltet wird
shiftDownRpm
Float
Drehzahl, bei der in den vorherigen Gang geschaltet wird
shiftUpRpmKickdown
Float
Drehzahl, bei der in den nächsten Gang geschaltet wird, wenn Kickdown aktiv ist
shiftDownRpmKickdown
Float
Drehzahl, bei der in den vorherigen Gang geschaltet wird, wenn Kickdown aktiv ist

Kurven
DynamicShiftingThrottleResponseCurve

X-Achse: Gaspedalstellung (0 bis 1)

Y-Achse: Schaltpunktverschiebung (0 = normaler Schaltpunkt, 1 = Kickdown-Schaltpunkt)

Wenn "dynamicShiftPoints" aktiv ist, kann mit dieser Kurve festgelegt werden, wie die Schaltpunkte in Abhängigkeit zur Gaspedalstellung verschoben werden sollen. 0 bedeutet, dass der normale Schaltpunkt verwendet wird, bei 1 wird der Kickdown-Schaltpunkt verwendet. Bei Werten dazwischen wird der Schaltpunkt entsprechend interpoliert.

ClutchCurve

X-Achse: Stellung des Kupplungspedals (0 bis 1)

Y-Achse: Kupplungsposition (0 = Kupplung komplett offen, 1 = Kupplung komplett geschlossen)

Mit dieser Kurve kann festgelegt werden, wie sich die tatsächliche Position des Kupplung in Verhältnis zum Kupplungspedal verhält. Dadurch kann z.B. ein gewisser Totweg im Pedal simuliert werden.

Differential
Parameter
Datentyp
Beschreibung
type
String
Antriebsart. Derzeit möglich: FrontWheelDrive, RearWheelDrive, AllWheelDrive
frontRearSplit
Float
Bei einem Allradantrieb kann hierüber definiert werden, in welchem Verhältnis die Antriebskräfte zwischen Vorder- und Hinterräderen aufgeteilt werden
Assistenzsysteme konfigurieren
In der "data.json" können unter "AssistanceSystems" diverse Assistenzsysteme konfiguriert werden.

ABS
Das Antiblockiersystem verhindert bei starken Bremsungen ein Blockieren der Räder, sodass die Lenkfähigkeit erhalten bleibt.

Parameter
Datentyp
Beschreibung
available
Boolean
Legt fest, ob das Auto ABS hat
minimumSpeed
Float
Minimalgeschwindigkeit, ab der ABS aktiv ist
minimumSpeedDifference
Float
Wenn die Geschwindigkeitsdifferenz zwischen Radgeschwindigkeit und tatsächlicher Geschwindigkeit größer wird als dieser Parameter, greift das ABS ein
regulationSpeed
Float
Legt fest, wie schnell das ABS die Bremskraft erhöht bzw. verringert

TCS
Die Traktionskontrolle vermindert ein Durchdrehen der Antriebsräder, indem die Motorleistung gedrosselt wird.

Parameter
Datentyp
Beschreibung
available
Boolean
Legt fest, ob das Auto Traktionskontrolle hat
minimumSpeedDifference
Float
Wenn die Geschwindigkeitsdifferenz zwischen Radgeschwindigkeit und tatsächlicher Geschwindigkeit größer wird als dieser Parameter, greift das System ein
reactionSpeed
Float
Legt fest, wie schnell das System die Motorleistung reduziert
returnSpeed
Float
Legt fest, wie schnell die Motorleistung wieder freigegeben wird, sobald die Reifen wieder Haftung haben

ESC
Die elektronische Stabilitätskontrolle versucht ein Unter- bzw. Übersteuern durch Abbremsen einzelner Räder zu vermindern.

Parameter
Datentyp
Beschreibung
available
Boolean
Legt fest, ob das Auto ESC hat
understeerDetectionTreshold
Float
Schwelle, ab der ESC bei Untersteuern eingreift
oversteerDetectionTreshold
Float
Schwelle, ab der ESC bei Übersteuern eingreift
understeerPowerReductionFactor
Float
Faktor, auf den die Motorleistung bei Untersteuern reduziert wird. 1 bedeutet keine Reduktion, 0 bedeutet, dass die Motorleistung auf 0 reduziert wird
oversteerPowerReductionFactor
Float
Faktor, auf den die Motorleistung bei Übersteuern reduziert wird. 1 bedeutet keine Reduktion, 0 bedeutet, dass die Motorleistung auf 0 reduziert wird
understeerMaxBrakeFactor
Float
maximale Bremskraft (0 bis 1), mit der Räder bei Untersteuern abgebremst werden können
oversteerMaxBrakeFactor
Float
maximale Bremskraft (0 bis 1), mit der Räder bei Übersteuern abgebremst werden können
understeerMaxBrakingAtSkidMagnitude
Float
Skid-Wert bei Untersteuern, bei dem die maximale Bremskraft wirksam wird. Je niedriger dieser Wert gewählt wird, desto stärker greift ESC bereits bei leichtem Untersteuern ein
oversteerMaxBrakingAtSkidMagnitude
Float
Skid-Wert bei Übersteuern, bei dem die maximale Bremskraft wirksam wird. Je niedriger dieser Wert gewählt wird, desto stärker greift ESC bereits bei leichtem Übersteuern ein
powerRegulationSpeed
Float
Legt fest, wie schnell ESC die Motorleistung reduzieren kann
brakeRegulationSpeed
Float
Legt fest, wie schnell ESC Bremskraft aufbauen kann

AutoHold
Autohold bewirkt, dass die Bremse im Stillstand aktiv bleibt, sodass das Bremspedal losgelassen werden kann, ohne dass das Auto wegrollt.

Parameter
Datentyp
Beschreibung
available
Boolean
Legt fest, ob das Auto Autohold hat
activateBelowSpeed
Float
Geschwindigkeit, unterhalb der sich Autohold frühestens aktiviert
activateAtBrakePosition
Float
Wert (0 bis 1), wie stark das Bremspedal mindestens getreten werden muss, damit sich Autohold aktiviert
deactivateAtThrottlePosition
Float
Wert (0 bis 1), wie stark das Gaspedal betätigt werden muss, damit sich die Bremse wieder löst
minimumBrakeForce
Float
Minimale Bremskraft (0 bis 1), mit der Autohold die Bremse betätigt

HillStartAssistant
Die Berganfahrhilfe unterstützt beim Anfahren in Steigungen, indem die Bremse erst gelöst wird, wenn genügend Motorleistung zum Anfahren zur Verfügung steht.

Parameter
Datentyp
Beschreibung
available
Boolean
Legt fest, ob das Auto eine Berganfahrhilfe hat
minimumGradient
Float
Minimale Steigung, ab der die Berganfahrhilfe aktiv ist
minimumBrakePosition
Float
Minimale Position des Bremspedal (0 bis 1), ab der sich die Berganfahrhilfe aktiviert
releaseFactor
Float
Über diesen Faktor kann beeinflusst werden, wie früh sich die Bremse wieder löst. Bei kleineren Werten löst die Bremse bereits, wenn die verfügbare Motorleistung nur minimal höher ist als benötigt, bei größeren erst später. Bei zu kleinen Werten kann es passieren, dass die Bremse zu früh löst
Fahrzeugbeleuchtung
Vorbereitungen am 3D-Modell
Jeder Lampe, die unabhängig von anderen Lampen leuchten soll, muss ein eigener MaterialSlot zugewiesen werden. Lampen, die gleichzeitig und in der selben Farbe leuchten sollen, kann der selbe MaterialSlot zugewiesen werden. Es ist also z.B. möglich, allen Blinkern auf der rechten Fahrzeugseite das selbe Material zuzuweisen, nicht aber den Blinkern auf beiden Seiten.

Des weiteren müssen sich alle Lampen in einem Mesh befinden, welches dem Fahrzeug als Attachment zugewiesen wird. Sie dürfen sich also nicht auf dem Chassis-Mesh befinden. Es ist aber durchaus möglich, Lampen mit anderen Attachments in einem Mesh zu kombinieren, z.B. können sich auf der Kofferraumklappe angebrachte Lampen auf dem selben Mesh befinden wie die Kofferraumklappe selbst.

Das Material, welches einer Lampe zugewiesen wird, muss einen MaterialParameter besitzen, über welchen die Helligkeit gesteuert werden kann.

Attachment-Parameter
Damit die Lampen angesteuert werden, ist es nötig, den entsprechenden MaterialSlots Namen zuzuweisen. Zu diesem Zweck gibt es den Attachment-Parameter "dynamicMaterialIndices". Dieser ist ein Array, welches entsprechende Zuweisungen nach folgendem Schema enthält:

"MaterialName": MaterialSlot

MaterialName steht für den Namen, der diesem MaterialSlot zugewiesen wird und MaterialSlot für den Index des Materialslots.

Beispiel
{ "name": "Lights", "meshReferencePath": "StaticMesh'/Game/Vehicles/Cars/Ferrari_488_GTB/Meshes/Ferrari_488_GTB_Lights.Ferrari_488_GTB_Lights'", "target": "jnt_Car_root", "dynamicMaterialIndices": { "LowBeamMaterial": 6, "FrontLeftIndicatorLightMaterial": 7, "DayDrivingLightMaterial": 4, "RearLightMaterial": 10, "BrakingLightMaterial": 1, "FrontRightIndicatorLightMaterial": 5, "ReversingLightMaterial": 9, "FogLightMaterial": 11 } }

Lichtquellen
Damit die Scheinwerfer auch die Umgebung beleuchten können, ist es nötig entsprechende Lichtquellen zu definieren. Dafür gibt es in der "default.json" den Eintrag "Lights", welcher beliebig viele Lichtquellen beinhalten kann. Eine Lichtquelle hat zunächst einen Namen und besteht anschließend aus folgenden Parametern:

Parameter
Datentyp
Beschreibung
type
String
Art der Lichtquelle. Derzeit möglich: Point, Spot
position
Vektor
Position der Lichtquelle
rotationOffset
Rotation
Rotation der Lichtquelle
intensity
Float
Helligkeit
attenuationRadius
Float
Reichweite
innerConeAngle
Float
Innerer Winkel des Lichtkegels
outerConeAngle
Float
Äußerer WInkel des Lichtkegels
castsShadows
Boolean
Legt fest, ob diese Lichtquelle Schatten erzeugt, wenn sie auf andere Objekte trifft (hat Einfluss auf die Performance)
affectsWorld
Boolean
Legt fest, ob diese Lichtquelle die Umgebung beleuchtet
color
RGB
Lichtfarbe

Bespiel
"Lights": [ { "HeadlightR": { "type": "Spot", "position": { "x": 185.8, "y": 70.4, "z": 59.74 }, "rotationOffset": { "yaw": 0, "pitch": -15, "roll": 0 }, "intensity": 200.0, "attenuationRadius": 5000.0, "innerConeAngle": 0.0, "outerConeAngle": 30.0, "castsShadows": false, "affectsWorld": true, "color": { "r": 234, "g": 231, "b": 226 } }, "HeadlightL": { "type": "Spot", "position": { "x": 185.8, "y": -70.4, "z": 59.74 }, "rotationOffset": { "yaw": 0, "pitch": -15, "roll": 0 }, "intensity": 200.0, "attenuationRadius": 5000.0, "innerConeAngle": 0.0, "outerConeAngle": 30.0, "castsShadows": false, "affectsWorld": true, "color": { "r": 234, "g": 231, "b": 226 } } } ]

Ansteuerung im Script
MaterialParameter
Scalar
Materials können im Fahrzeugscript angesteuert werden, in dem für skalare Parameter setMaterialParameterScalar(Attachment, Material, Parameter, Value) aufgerufen wird. Attachment ist der Name des Attachments, Material ist der im Attachment zugewiesene Materialname, Parameter ist der Name des MaterialParameter der angesteuert werden soll und Value der Wert, auf den der MaterialParameter gesetzt werden soll.

Beispiel
setMaterialParameterScalar("Lights", "BrakeLightMaterial", "Emissive", 1.0)

Vector
Vektor-Parameter können verändert werden, in dem setMaterialParameterVector(Attachment, Material, Parameter, ValueR, ValueG, ValueB, ValueA) aufgerufen wird. Die Funktionsweise ist im wesentliche gleich wie bei skalaren Parametern, mit dem einzigen Unterschied, dass Value in 4 Variablen aufgeteilt ist.

Beispiel
setMaterialParameterVector("Lights", "BrakeLightMaterial", "Emissive", 1.0, 0.5, 0.5, 1.0)

Lichtquellen
Die Helligkeit von Lichtquellen kann angesteuert werden, in dem im Script setLightIntensity(Name, Value) aufgerufen wird. Name ist der Name der Lichtquelle in "default.json" und Value ist der Wert, auf den die Helligkeit gesetzt werden soll.

Beispiel
setLightIntensity("HeadlightL", 150.0)
Spiegel
Material
Für Rückspiegel muss zunächst in Unreal ein Material entsprechend der folgenden Vorlage erstellt werden:

Je nachdem wie die Spiegel im 3D-Modell gemappt sind, kann es nötig sein, für UTiling entweder 1,0 oder -1,0 einzutragen, damit die Spiegel "richtig herum" dargestellt werden.

Render Target
Für jeden am Fahrzeug vorhandenen Spiegel muss in Unreal ein eigenes RenderTarget erstellt werden. Die Größe des RenderTargets sollte so eingestellt werden, dass das Seitenverhältnis mit dem Spiegel-Mapping zusammenpasst, sodass das Spiegelbild nicht verzerrt dargestellt wird.

Material Instances
Für jeden Spiegel muss eine eigene Material Instance mit dem vorher erstellten Spiegel-Material als Parent erstellt werden. Als MaterialParameter "RenderTarget" wird das jeweilige vorher erstellte RenderTarget eingetragen. Die so erstellten Material Instances müssen dann noch den jeweiligen Spiegel-Meshes als Material zugewiesen werden.

Attachment-Parameter
Zuletzt müssen die Spiegel noch in der "default.json" bei den jeweiligen Attachments eingetragen werden. Dafür gibt es den Parameter "sceneCapture", der seinerseits die folgenden Parameter aufweist:

Parameter
Datentyp
Beschreibung
enabled
Boolean
Legt fest, ob dieser Spiegel aktiv ist
targetTextureReferencePath
Referenzpfad
Referenz auf das entsprechende RenderTarget. Lässt sich erhalten, indem man mit der rechten Maustaste auf das RenderTarget klickt und "Copy Reference" auswählt
rotationOffset
Rotation
Rotations-Offset gegenüber der Rotation des Bones, an dem das Attachment hängt
positionOffset
Vektor
Positions-Offset gegenüber der Position des Bones, an dem das Attachment hängt
projectionFov
Float
Sichtfeld des Spiegels ("Field Of View")

Beispiel
{ "name": "RightSideMirrorGlass", "meshReferencePath": "StaticMesh'/Game/Vehicles/User/Cars/Tesla_Model_3/Meshes/SM_Tesla_Model_3_Door_SideMirrorSurface_R.SM_Tesla_Model_3_Door_SideMirrorSurface_R'", "target": "jnt_SideMirror_R", "sceneCapture": { "enabled": true, "targetTextureReferencePath": "TextureRenderTarget2D'/Game/Vehicles/User/Cars/Tesla_Model_3/Materials/Textures/T_Tesla_Model3_SideMirror_Right.T_Tesla_Model3_SideMirror_Right'", "rotationOffset": { "yaw": -195, "pitch": 0, "roll": 0 }, "positionOffset": { "x": -22, "y": 0, "z": 0 }, "projectionFov": 45 } }
Scripting - Funktionen Teil 1
Grundlagen
Viele Aspekte des Fahrzeugs (z.B. Beleuchtung, Animationen, ...) lassen sich über Scripts steuern. Als Scriptsprache wird Lua verwendet. Im Unterordner "scripts" des Fahrzeugordners können beliebig viele Scripts als .lua-Dateien erstellt werden.

Vom Spiel aufgerufene Funktionen
Die folgenden Funktionen können im Script angelegt werden und werden vom Spiel beim Auftreten bestimmer Ereignisse aufgerufen.

onLoad()
Wird beim Laden des Scripts aufgerufen^.

onSpawn()
Wird beim Spawnen aufgerufen.

onButtonChanged(String Name, ButtonChangeType Type)
Wird aufgerufen, wenn eine Taste auf Maus, Tastatur, Lenkrad oder Gamepad gedrückt oder losgelassen wird, für die ein Mapping vorhanden ist.

Name: Name des Mappings

Type: Gibt an, ob das Mapping gedrückt oder losgelassen wird. Mögliche Werte: BUTTON_PRESSED, BUTTON_RELEASED

onVehicleUpdate(VehicleTickData Data)
Wird jeden Frame aufgerufen.

Data: Zustand des Fahrzeugs

onAttachmentInteract(String InteractionName, bool Secondary, bool Pressed)
Wird aufgerufen, wenn mit einem Attachment interagiert wird.

InteractionName: Name der Interaktion

Secondary: Ist true, wenn es sich um die sekundäre Interaktion handelt

Pressed: Ist true, wenn die Interaktionstaste gedrückt wurde und false, wenn die Interaktionstaste losgelassen wurde

onDynamicDisplayInteract(String DisplayName, String AttachmentName, Bool Pressed, Float CoordinateX, Float CoordinateY)
Diese Funktion im Script wird immer aufgerufen, wenn mit einem Display interagiert wird.

DisplayName: Name des Displays, mit dem interagiert wird.

AttachmentName: Name des Attachments, dem das Display zugeordnet ist. Diese Unterscheidung ist wichtig, wenn es in mehreren Attachments Displays gibt, die den selben Namen haben.

Pressed: Ist true, wenn die Interaktionstaste gedrückt wurde und false, wenn die Interaktionstaste losgelassen wurde.

CoordinateX: X-Koordinate der Position in Pixeln, an der das Display angeklickt wurde.

CoordinateY: Y-Koordinate der Position in Pixeln, an der das Display angeklickt wurde.

onAnimationFinished(int AnimationId)
Wird aufgerufen, wenn eine Animation fertig abgespielt wurde.

AnimationId: Id der abgespielten Animation

onVehicleInitialize(VehicleDefinition Definition, VehicleProfile Profile, VehicleEngineDescription Engine, VehicleTransmissionDescription Transmission)
Wird aufgerufen, wenn das Fahrzeug initialisiert wird.

Definition: Fahrzeugdefinition

Profile: Fahrzeugprofildaten

Engine: Motordefinition

Transmission: Getriebedefinition

onVehicleOccupancyChanged(int NumOccupants)
Wird aufgerufen, wenn sich die Anzahl der Personen im Fahrzeug geändert hat.

NumOccupants: Anzahl der Personen

onReceive(LuaValue Topic, LuaValue Param)
Dient der Kommunikation verschiedener Scripts untereinander. Wird aufgerufen, wenn ein anderes Script publish(LuaValue Topic, LuaValue Argument) aufruft.

Topic: Thema

Argument: Mit dem Thema mitgesendete Daten.

onCrossMenuChanged(String Function, String State)
Wird aufgerufen, wenn eine Fahrzeugfunktion im Steuerkreuz aufgerufen wird.

Function: Name der Funktion

State: Neuer Status der Funktion

Vom Script aufrufbare Funktionen
Die folgenden Funktionen können in Scripts aufgerufen werden. Funktionen für das Zeichnen von Displays und für das Abspielen von Sounds befinden sich der Übersichtlichkeit halber in eigenen Kapiteln.

Da Variablen in Lua keinen expliziten Datentyp haben und jede Funktion mit jedem Datentyp aufgerufen werden kann, ist bei jeder Funktion vermerkt, welche Datentypen die Funktion für eine korrekte Funktionsweise erwartet. "LuaValue" bedeutet, dass die Funktion an dieser Stelle jeden beliebigen Datentyp akzeptiert.

playBoneRotationAnimation(String BoneName, FunctionType FunctionType, Vector From, Vector To, Float Duration, Float InitialDelay)
Mit dieser Funktion kann eine Rotations-Animation auf einen Bone angewendet werden.

BoneName: Name des Bones

FunktionType: Typ der Animationsfunktion. Mögliche Werte: AINM_LINEAR, ANIM_CUBIC, ANIM_EASE_IN, ANIM_EASE_OUT

From: Start-Rotation

To: Ziel-Rotation

Duration: Animationsdauer

InitialDelay: Verzögerung, bis die Animation abgespielt wird. Wenn dieser Wert 0 ist oder weggelassen wird, startet die Animation sofort.

playBoneLocationAnimation(String BoneName, FunctionType FunctionType, Vector From, Vector To, Float Duration, Float InitialDelay)
Mit dieser Funktion kann eine Positions-Animation auf einen Bone angewendet werden.

BoneName: Name des Bones

FunktionType: Typ der Animationsfunktion. Mögliche Werte: AINM_LINEAR, ANIM_CUBIC, ANIM_EASE_IN, ANIM_EASE_OUT

From: Start-Position

To: Ziel-Position

Duration: Animationsdauer

InitialDelay: Verzögerung, bis die Animation abgespielt wird. Wenn dieser Wert 0 ist oder weggelassen wird, startet die Animation sofort.

setBoneRotation(String BoneName, Number X, Number Y, Number Z)
Mit dieser Funktion kann die Rotation eines Bones direkt gesetzt werden.

BoneName: Name des Bones

X: X-Koordinate der neuen Rotation

Y: Y-Koordinate der neuen Rotation

Z: Z-Koordinate der neuen Rotation

setBoneLocation(String BoneName, Number X, Number Y, Number Z)
Mit dieser Funktion kann die Position eines Bones direkt gesetzt werden.

BoneName: Name des Bones

X: X-Koordinate der neuen Position

Y: Y-Koordinate der neuen Position

Z: Z-Koordinate der neuen Position

setBoneLocationAndRotation(String BoneName, Number LocationX, Number LocationY, Number LocationZ, Number RotationX, Number RotationY, Number RotationZ)
Mit dieser Funktion kann die Position und Rotation eines Bones direkt gesetzt werden.

BoneName: Name des Bones

LocationX: X-Koordinate der neuen Position

LocationY: Y-Koordinate der neuen Position

LocationZ: Z-Koordinate der neuen Position

RotationX: X-Koordinate der neuen Rotation

RotationY: Y-Koordinate der neuen Rotation

RotationZ: Z-Koordinate der neuen Rotation

setData(String Key, LuaValue Value)
Mit dieser Funktion kann ein Script Daten speichern, welche auch in einem SaveGame erhalten bleiben. Zuvor muss der entsprechende Key mit initializeData initialisiert werden.

Key: Bezeichnung, unter der die Daten abgespeichert werden

Value: Zu speichernde Daten. Mögliche Datentypen: Bool, Int, Number, String

initializeData(String Key, LuaValue Value)
Mit dieser Funktion können Felder zum Speichern von Daten intialisiert werden.

Key: Bezeichnung, unter der die Daten abgespeichert werden

Value: Initialer Wert. Wird nur gesetzt, wenn das Feld noch nicht vorhanden ist. Mögliche Datentypen: Bool, Int, Number, String

getData(String Key)
Mit dieser Funktion können gespeicherte Daten abgefragt werden.

Key: Bezeichnung, unter der die Daten abgespeichert wurden

toggleBoolData(LuaValue Key)
Mit dieser Funktion können gespeicherte Daten vom Typ Boolean umgekehrt werden.

Key: Bezeichnung, unter der die Daten abgespeichert wurden

dataExists(LuaValue Key)
Mit dieser Funktion kann abgefragt werden, ob unter einem Key Daten abgespeichert wurden.

Key: Bezeichnung, unter der die Daten abgespeichert wurden
Scripting - Funktionen Teil 2
setMaterialParameterScalar(String AttachmentName, String MaterialName, String ParameterName, Float NewValue)
Mit dieser Funktion kann ein Skalar-MaterialParameter gesetzt werden. Voraussetzung ist, dass das Material im Attachment mit dem Parameter dynamicMaterialIndices eingetragen wurde.

AttachmentName: Name des Attachments

MaterialName: Name des Materials, wie er unter dynamicMaterialIndices eingetragen wurde

ParameterName: Name des MaterialParameters

NewValue: Wert, auf den der Parameter gesetzt wird

setMaterialParameterVector(String AttachmentName, String MaterialName, String ParameterName, Float NewValueR, Float NewValueG, Float NewValueB, Float NewValueA)
Mit dieser Funktion kann ein Vector-MaterialParameter gesetzt werden. Voraussetzung ist, dass das Material im Attachment mit dem Parameter dynamicMaterialIndices eingetragen wurde.

AttachmentName: Name des Attachments

MaterialName: Name des Materials, wie er unter dynamicMaterialIndices eingetragen wurde

ParameterName: Name des MaterialParameters

NewValueR: R-Komponente des Parameters

NewValueG: G-Komponente des Parameters

NewValueB: B-Komponente des Parameters

NewValueA: A-Komponente des Parameters

publish(LuaValue Topic, LuaValue Argument)
Diese Funktion kann für die Kommunikation der Scripts untereinander verwendet werden. Wenn diese Funktion aufgerufen wird, wird in allen Scripts, die das entsprechende Thema abonniert haben, die Funktion onReceive aufgerufen.

Topic: Thema

Argument: Mit dem Thema mitgesendete Daten. Kann jeder beliebige Lua-Datentyp sein.

subscribe(LuaValue Topic)
Mit dieser Funktion kann das Script ein Thema abonnieren. Dadurch wird das Script über die Funktion on Receive benachrichtigt, wenn ein anderes Script die Funktion publish mit diesem Thema aufruft.

Topic: Thema

setBillboardTrigger(String Name, Bool Visible)
Mit dieser Funktion können Billboards ein- bzw. ausgeblendet werden.

Name: Name des Billboards

Visible: Legt fest, ob das Billboard sichtbar sein soll

disableAssistanceSystem(String System, Bool Disabled)
Mit dieser Funktion können einzelne Assistenzsysteme (de)aktiviert werden.

System: Name des Assistenzsystem, welches (de)aktiviert werden soll. Mögliche Werte: ABS, TCS, ESC, AutoHold, HillStartAssistant

Disabled: Legt fest, ob das System deaktiviert oder aktiviert werden soll. True deaktiviert das System, false aktiviert es wieder.

toggleEngineButton(Bool Value)
Mit dieser Funktion kann das Script dem Motor mitteilen, ob der Knopf für das Starten bzw. Stoppen des Motors gedrückt wird.

Value: Legt fest, ob der Knopf gedrückt wird.

setTransmissionManualShiftingMode(Bool Enabled)
Mit dieser Funktion kann festgelegt werden, ob das Automatikgetriebe im manuellen oder automatischen Schaltmodus sein soll , wobei bei Verwendung dieser Funktion immer nur einer von beiden aktiv ist. Wenn manuelles und automatisches Schalten gleichzeitig erlaubt werden sollen, können stattdessen die Funktionen setTransmissionManualShiftingAllowed und setTransmissionAutomaticShiftingAllowed verwendet werden.

Enabled: True bedeutet, dass nur manuelles Schalten erlaubt ist, bei false ist nur automatisches Schalten erlaubt

toggleTransmissionManualShiftingMode()
Mit dieser Funktion kann das Automatikgetriebe zwischen manuellem und automatischem Schaltmodus gewechselt werden, wobei bei Verwendung dieser Funktion immer nur einer von beiden aktiv ist. Wenn manuelles und automatisches Schalten gleichzeitig erlaubt werden sollen, können stattdessen die Funktionen setTransmissionManualShiftingAllowed und setTransmissionAutomaticShiftingAllowed verwendet werden.

setTransmissionManualShiftingAllowed(Bool Allowed)
Mit dieser Funktion kann gesetzt werden, ob das Automatikgetriebe das manuelle Schalten der Gänge erlaubt.

Allowed: Legt fest, ob das manuelle Schalten erlaubt ist

setTransmissionAutomaticShiftingAllowed(Bool Allowed)
Mit dieser Funktion kann gesetzt werden, ob das Automatikgetriebe Gänge automatisch schaltet.

Allowed: Legt fest, ob das automatische Schalten erlaubt ist

setTransmissionShiftingMode(Int Mode)
Mit dieser Funktion kann ausgewählt werden, welchen Schaltmodus das Getriebe verwenden soll.

Mode: Index des ShiftingMode

requestGearDown(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Gang hinunterzuschalten. Funktioniert nur beim Schaltgetriebe oder wenn der manuelle Schaltmodus aktiv ist.

Value: Gibt an, ob der Gangwechsel verlangt wird.

requestGearUp(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Gang hinaufzuschalten. Funktioniert nur beim Schaltgetriebe oder wenn der manuelle Schaltmodus aktiv ist.

Value: Gibt an, ob der Gangwechsel verlangt wird.

requestDriveModeDown(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Fahrmodus (P-R-N-D) hinunterzuschalten. Funktioniert nur beim Automatikgetriebe oder Elektroauto.

Value: Gibt an, ob der Wechsel verlangt wird.

requestDriveModeUp(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Fahrmodus (P-R-N-D) hinaufzuschalten. Funktioniert nur beim Automatikgetriebe oder Elektroauto.

Value: Gibt an, ob der Wechsel verlangt wird.

requestDriveModeOrGearDown(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Fahrmodus (P-R-N-D) oder Gang hinunterzuschalten.

Value: Gibt an, ob der Wechsel verlangt wird.

requestDriveModeOrGearUp(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, einen Fahrmodus (P-R-N-D) oder Gang hinaufzuschalten.

Value: Gibt an, ob der Wechsel verlangt wird.

requestGearPark(Bool Value)
Mit dieser Funktion kann das Getriebe aufgefordert werden, den Parkmodus zu aktivieren.

Value: Gibt an, ob der Parkmodus verlangt wird.

limitEngineTorque(Number Value)
Mit dieser Funktion kann das maximale Drehmoment des Motors beschränkt werden.

Value: maximales Drehmoment in Nm. 0 bedeutet keine Beschränkung.

setLightIntensity(String Name, Float Intensity)
Mit dieser Funktion kann die Helligkeit einer Lichtquelle gesetzt werden.

Name: Name der Lichtquelle

Intensity: Helligkeit

isPlayerInVehicle()
Mit dieser Funktion kann abgefragt werden, ob sich die Spielerkamera gerade in der Innenansicht oder in einer Außenansicht befindet. Als Rückgabewert liefert die Funktion einen Boolean, der true ist, wenn sich die Kamera in der Innenansicht befindet.

setAttachmentVisibility(String Name, Bool Visible)
updateCrossMenu(String Function, String State)
Mit dieser Funktion wird dem Steuerkreuz-Menü mitgeteilt, dass sich der Status einer Fahrzeugfunktion geändert hat.

Function: Name der Funktion

State: Neuer Status

setHandbrake(Float Value)
Mit dieser Funktion wird die Handbremse des Fahrzeugs gesetzt.

Value: Position der Handbremse: 0 = komplett gelöst, 1 = komplett angezogen

getLineTraceDistance(String BoneName, Vector StartOffset, Vector EndOffset)
Mit dieser Funktion kann ein LineTrace durchgeführt werden, z.B. für Parksensoren. Als Rückgabewert liefert die Funktion die Distanz vom Startpunkt bis zur ersten Kollision.

BoneName: Name des Bones, der als Referenz für die Koordinaten verwendet wird

StartOffset: Startposition des LineTrace relativ zur Position des Bones

EndOffset: Endposition des LineTrace relativ zur Position des Bones
Scripting - Funktionen Teil 3
setMinimumBrake(Float Value)
Mit dieser Funktion wird das Bremspedal mindestens auf den angegebenen Wert gesetzt.

Value: Wert, auf den die Bremse mindestens gesetzt wird (0 bis 1)

enableSceneCapture(String AttachmentName, Bool Enable)
Mit dieser Funktion kann ein SceneCapture (Rückspiegel, Kamera) (de)aktiviert werden. Z.B. kann die Rückfahrkamera deaktiviert werden, wenn der Rückwärtsgang nicht eingelegt ist, um Rechenleistung zu sparen.

AttachmentName: Name des Attachments, dessen SceneCapture (de)aktiviert werden soll

Enable: Gibt an, ob es aktiviert (true) oder deaktiviert (false) werden soll

musicPlayerOpenPlaylist(String Name)
Mit dieser Funktion kann eine Playlist bzw. ein Radiosender geöffnet werden.

Name: Name der Playlist bzw. des Radiosenders der geöffnet werden soll

musicPlayerPlay()
Mit dieser Funktion wird der Musikplayer auf Play geschaltet.

musicPlayerPause()
Mit dieser Funktion wird der Musikplayer pausiert.

musicPlayerPlayPause()
Mit dieser Funktion wird der Musikplayer auf Play bzw. Pause geschaltet.

musicPlayerNext()
Mit dieser Funktion schaltet der Musikplayer zum nächsten Song weiter. Funktioniert nicht bei Radiosendern.

musicPlayerPrevious()
Mit dieser Funktion schaltet der Musikplayer zum vorherigen Song zurück. Funktioniert nicht bei Radiosendern.

musicPlayerNextPlaylist()
Mit dieser Funktion schaltet der Musikplayer zur nächsten Playlist weiter. Radiosender werden übersprungen.

musicPlayerPreviousPlaylist()
Mit dieser Funktion schaltet der Musikplayer zur vorherigen Playlist zurück. Radiosender werden übersprungen.

musicPlayerNextRadioStation()
Mit dieser Funktion schaltet der Musikplayer zum nächsten Radiosender weiter. Playlists werden übersprungen.

musicPlayerPreviousRadioStation()
Mit dieser Funktion schaltet der Musikplayer zum vorherigen Radiosender zurück. Playlists werden übersprungen.

musicPlayerNextPlaylistOrRadioStation()
Mit dieser Funktion schaltet der Musikplayer zur nächsten Playlist bzw. Radiosender weiter.

musicPlayerPreviousPlaylistOrRadioStation()
Mit dieser Funktion schaltet der Musikplayer zur vorherigen Playlist bzw. Radiosender zurück.

musicPlayerSeekPercentage(Float Value)
Mit dieser Funktion kann zu einer bestimmten Stelle im aktuellen Song gesprungen werden.

Value: Position im Song: 0 ist ganz am Anfang, 1 ganz am Ende.

musicPlayerSetLoop(Bool Value)
Mit dieser Funktion kann die Loop-Funktion der Musikplayers ein- bzw. ausgeschalten werden, sodass die aktuelle Playlist in Endlosschleife wiedergegeben wird.

Value: Legt fest, ob die Loop-Funktion ein sein soll

musicPlayerToggleLoop()
Mit dieser Funktion kann die Loop-Funktion der Musikplayers ein- bzw. ausgeschalten werden./i]

musicPlayerSetLoopOneSong(Bool Value)
Mit dieser Funktion kann die Loop-Funktion der Musikplayers ein- bzw. ausgeschalten werden, sodass der aktuelle Song in Endlosschleife wiedergegeben wird.

Value: Legt fest, ob die Loop-Funktion ein sein soll

musicPlayerToggleLoopOneSong()
Mit dieser Funktion kann die Loop-Funktion der Musikplayers ein- bzw. ausgeschalten werden, sodass der aktuelle Song in Endlosschleife wiedergegeben wird.

musicPlayerSetShuffle(Bool Value)
Mit dieser Funktion kann die Shuffle-Funktion der Musikplayers ein- bzw. ausgeschalten werden, sodass Songs aus der aktuellen Playlist zufällig ausgewählt werden.

Value: Legt fest, ob die Shuffle-Funktion ein sein soll

musicPlayerToggleShuffle()
Mit dieser Funktion kann die Shuffle-Funktion der Musikplayers ein- bzw. ausgeschalten werden, sodass Songs aus der aktuellen Playlist zufällig ausgewählt werden.

musicPlayerSetVolume(Float Value)
Mit dieser Funktion kann die Lautstärke des Musikplayers eingestellt werden.

Value: Wert (0 bis 1) auf den die Lautstärke eingestellt werden soll.

musicPlayerIncreaseVolume(Float Value)
Mit dieser Funktion kann die Lautstärke des Musikplayers um einen bestimmten Wert erhöht werden.

Value: Wert, um den die Lautstärke erhöht werden soll.

musicPlayerDecreaseVolume(Float Value)
Mit dieser Funktion kann die Lautstärke des Musikplayers um einen bestimmten Wert verringert werden.

Value: Wert, um den die Lautstärke verringert werden soll.

musicPlayerSetOutsideEffect(Bool Value)
Mit dieser Funktion kann dem Musikplayer mitgeteilt werden, ob sich der Spieler aktuell außerhalb des Fahrzeugs befindet. Dadurch klingt die Musik leiser und dumpfer.

Value: Legt fest, ob der Effekt aktiv sein soll. Sollte immer dann auf True gesetzt werden, wenn sich der Spieler außerhalb des Fahrzeugs befindet und alle Türen und Fenster geschlossen sind.
Scripting - Datentypen Teil 1
Datentypen
VehicleTickData
VehicleTransmissionState Transmission: Zustand des Getriebes

VehicleEngineState Engine: Zustand des Motors

VehicleAssistanceSystemsState AssistanceSystems: Zustand der Assistenzsysteme

EnvironmentState Environment: Zustand der Umwelt

VehiclePlayerInputs Inputs: Spieler-Inputs durch Eingabegeräte. Achtung: Inputs über das Steuerkreuz-Menü oder durch Interagieren mit Fahrzeug-Attachments werden hier nicht berücksichtigt.

Float DeltaSeconds: Zeit in Sekunden, die seit dem letzten Tick vergangen ist

Float Speed: Fahrzeuggeschwindigkeit in km/h

Float AverageSteerAngle: Durchschnittlicher Lenkwinkel

Float SteeringWheelAngle: Lenkradwinkel

Vector Acceleration: Beschleunigungskräfte, die auf das Fahrzeug wirken

Array<Rotator> WheelAnimationRotations

Array<Float> MotionBlurFactor

Array<Rotator> TireAnimationRotations

Array<Vector> WheelAnimationRotations

Array<Vector> WheelAnimationTranslations


Float ResourceLevel: Füllstand des Tanks bzw. der Batterie

Bool InTunnel: Befindet sich das Fahrzeug in einem Tunnel?

Bool InUnderpass: Befindet sich das Fahrzeug in einer Unterführung?

Float DrivenMeters: Distanz in Metern, die das Fahrzeug insgesamt zurückgelegt hat

Float DrivenMetersSinceStart: Distanz in Metern, die das Fahrzeug seit Spielstart zurückgelegt hat

MusicPlayerTickData MusicPlayer: Zustand des Musikplayers

VehicleTransmissionState
Float Torque: Drehmoment-Output des Getriebes

Int GearIndex: Aktuell eingelegter Gang

Float ClutchPosition: Aktuelle Position der Kupplung

int DriveModeIndex: Index des aktuellen Fahrmodus

Array<Int> AllowedDriveModes: Derzeit erlaubte Fahrmodi

Float CurrentGearRatio: Aktuelles Übersetzungsvehältnis des Getriebes

Float ClutchSpeed: Kupplungs-Drehzahl

Float ClutchTorque: Kupplungs-Drehmoment

Bool ClutchIsSlipping: Schleift die Kupplung aktuell?

Float ClutchEngineSpeedDifference: Differenz zwischen der Motordrehzahl und der Kupplungs-Drehzahl

Bool SwitchingGearFailed: Ist true, wenn das Einlegen eines Ganges fehlgeschlagen ist, z.B. weil die Kupplung nicht ausreichend getreten ist oder die Drehzahldifferenz zu groß ist.

Bool AutomaticShiftingAllowed: Darf das Getriebe derzeit automatisch Gänge schalten?

Bool ManualShiftingAllowed: Darf der Spieler beim Automatikgetriebe derzeit manuell Gänge schalten?

Int SelectedShiftingMode: Index des aktuell ausgewählten Schaltmodus

Bool ManualUpshiftingInputReceived: Ist true, wenn das Getriebe die Anforderung erhalten hat, manuell einen Gang hinaufzuschalten. Kann z.B. verwendet werden, um Schaltwippen zu animieren.

Bool ManualDownshiftingInputReceived: Ist true, wenn das Getriebe die Anforderung erhalten hat, manuell einen Gang hinunterzuschalten. Kann z.B. verwendet werden, um Schaltwippen zu animieren.

Bool DriveModeUpInputReceived: Ist true, wenn das Getriebe die Anforderung erhalten hat, einen Fahrmodus (P-R-N-D) hinaufzuschalten. Kann z.B. verwendet werden, um Schalthebel zu animieren.

Bool DriveModeDownInputReceived: Ist true, wenn das Getriebe die Anforderung erhalten hat, einen Fahrmodus (P-R-N-D) hinunterzuschalten. Kann z.B. verwendet werden, um Schalthebel zu animieren.

Bool GearshiftInProgress: Ist true, wenn beim Automatikgetriebe gerade ein Gangwechsel stattfindet

VehicleEngineState
Float RevolutionsPerMinute: Umdrehungen pro Minute des Motors

Float CurrentPower: Aktuelles Motor-Drehmoment in Nm

Float EngineTemperature: Aktuelle Kühlwassertemperatur in °C

Bool RecuperationBrakeLight: Ist die Rekuperation aktuell so stark, dass das Bremslicht eingeschaltet werden soll?

Float FuelInjection: Aktuelle Kraftstoff-Einspritzung (0 bis 1)

Bool EngineStarter: Ist der Anlasser gerade aktiv?

Bool On: Läuft der Motor aktuell?

Float LimitTorque: Wert, auf den das Motordrehmoment aktuell begrenzt wird. 0 bedeutet keine Begrenzung.

VehicleAssistanceSystemsState
Bool ABSDisabled: Ist das ABS aktuell deaktiviert?

Bool ABSIntervention: Greift das ABS gerade ein?

Bool TCSDisabled: Ist die Traktionskontrolle aktuell deaktiviert?

Bool TCSIntervention: Greift die Traktionskontrolle gerade ein?

Bool ESCDisabled: Ist das ESC aktuell deaktiviert?

Bool ESCIntervention: Greift das ESC gerade ein?

Bool AutoHoldDisabled: Ist Autohold aktuell deaktiviert?

Bool AutoHoldActive: Ist Autohold gerade aktiv?

Bool HillStartAssistantDisabled: Ist die Berganfahrhilfe aktuell deaktiviert?

Bool HillStartAssistantActive: Ist die Berganfahrhilfe gerade aktiv?

EnvironmentState
DateTimeLuaState DateTimeLua: Uhrzeit für Lua aufbereitet (wird später voraussichtlich auch das Datum beinhalten)

Float SunBrightness: Helligkeit der Sonne

DateTimeLuaState
Hour: Stunde

Minute: Minute

Second: Sekunde

VehiclePlayerInput
Float ThrottleInput: Gaspedal-Input (0 bis 1)

Float BrakeInput: Bremspedal-Input(0 bis 1)

Float SteeringInput: Lenk-Input (-1 bis 1)

Float ClutchInput: Kupplungspedal-Input (0 bis 1)

Bool DriveModeUpRequested: Nächster Fahrmodus verlangt

Bool DriveModeDownRequested: Vorheriger Fahrmodus verlangt

Bool DriveModeParkRequested: Park-Modus verlangt

Bool DriveModeOrGearUpRequested: Nächster Fahrmodus oder Gang verlangt

Bool DriveModeOrGearDownRequested: Vorheriger Fahrmodus oder Gang verlangt

Bool GearUpRequested: Nächster Gang verlangt

Bool GearDownRequested: Vorheriger Gang verlangt

Int RequestedGearIndex: Verlangter Gang

Bool GearRequested: True, wenn der Spieler gerade einen bestimmten Gang verlangt hat

Bool ToggleEngine: Motorknopf gedrückt

Bool AutoClutch: Automatische Kupplung eingeschaltet

VehicleDefinition
VehicleMetaDefinition Meta: Fahrzeug-Metadaten

Map<VehicleAppearanceProperty, VehicleAppearanceDefinition> AppearanceDefinitions: Erscheinungsbild-Definition

Guid Id: Id

String SkeletonReferencePath: Skeleton Referenzpfad

Map<String, VehicleCameraDefinition> Cameras: Kamera-Definitionen

VehiclePowerTrainDefinition PowerTrain: Antriebstrang-Definition

Guid SelectedProfileId: Id des ausgewählten Profils

VehicleAssistanceSystemsDefinition AssistanceSystems: Assistenzsysteme-Definition

Array<VehicleCrossMenuFunctionDefinition> CrossMenuFunctions: Steuerkreuzmenü-Funktionsdefinition

VehicleMetaDefinition
String Manufacturer: Hersteller

String Model: Modellbezeichnung

String Author: Autor

String Version: Version

String Description: Fahrzeugkurzbeschreibung

Bool PlayerDriveable: Fahrzeug vom Spieler fahrbar

String Category: Fahrzeugart. Mögliche Werte: Sedan, Coupe, SportsCar, StationWagon, Hatchback, Convertible, Suv, MiniVan, PickUp, Other

VehiclePowerTrainDefinition
VehicleEngineDefinition Engine: Motor-Definition

VehicleTransmissionDefinition Transmission: Getriebe-Definition

VehicleDifferentialDefinition Differential: Differential-Definition
Scripting - Datentypen Teil 2
VehicleEngineDefinition
Definiert einen Motor. Beschreibung der Parameter siehe Antrieb konfigurieren

String Identifier

Float MaxPower

Float MaxRecuperationPower

Float MaxTorque

Float RecuperationEfficiency

Bool UseCustomTorqueCurves

Bool UseCustomRecuperationCurves

Float MinRecuperationTorqueForBrakeLight

Float MaxReversingSpeed

Float PowerOutputChangeRate

Float RevUpSpeed

Bool UseOnePedalDrivingThrottleResponse

Float OnePedalDrivingRecuperationMaxThrottlePositionAtSpeed

Float IdlePower

Float IdleRPM

Float IdleRPMAfterColdStart

Float StallRPM

Float StallTime

Float StarterTorque

Float StarterTime

Float CoolingFactor

String MaxTorqueCurve

String ThrottleResponseCurve

String ThrottleResponseAccelerationCurve

String ThrottleResponseRecuperationCurve

String MaxRecuperationCurve

String BrakeRecuperationCurve

String MinTorqueCurve

String StallingTorqueCurve

String EngineEfficiencyCurve

String ThrottleEfficiencyCurve


VehicleTransmissionDefinition
Definiert ein Getriebe. Beschreibung der Parameter siehe Antrieb konfigurieren

String Identifier

VehicleTransmissionType TransmissionType

Float BaseRatio

Float ChangeTime

Float Efficiency

Float MaxClutchTorque

Float MaxClutchTorqueSlipping

Float ClutchFullyDisengagedAtBrakePosition

Float ClutchDisengagesAtSpeed

Float MaxClutchSpeed

Float MaxClutchSpeedGearSwitching

Float MaxClutchSpeedDifferenceForEngagingGear

Float DrivingOffClutchFactor

Float DrivingOffMaxClutchSpeed

Float DrivingOffMinClutchSpeed

Float DrivingOffMinRPM

Float DrivingOffMaxRPM

Float MinCreepingSpeedAtIdle

Float MaxCreepingSpeedAtIdle

Float MaxAllowedRpm

Float KickdownTreshold

Bool DynamicShiftPoints

VehicleGearDefinition ReverseGear

Array<VehicleGearDefinition> ForwardGears

String DynamicShiftingThrottleResponseCurve

String ClutchCurve

Bool AutomaticallyShiftToParkWhenEngineIsOff

Bool AutomaticallyShiftToFirstGearAtStandstill

Bool UseClassicGearSelectorPattern


VehicleDifferentialDefinition
String Type: Typ. Derzeit möglich: AllWheelDrive, FrontWheelDrive, RearWheelDrive

Float FrontRearSplit: Antriebskräfte Aufteilung vorne/hinten bei Allradantrieb

VehicleAssistanceSystemsDefinition
Definiert die vorhandenen Assistenzsysteme. Beschreibung der Parameter siehe Assistenzsysteme konfigurieren

VehicleABSDefinition ABS

VehicleTCSDefinition TCS

VehicleESCDefinition ESC

VehicleAutoHoldDefinition AutoHold

VehicleHillStartAssistantDefinition HillStartDefinition


VehicleCrossMenuFunctionDefinition
Definiert die Steuerkreuzmenü-Funktionen. Beschreibung der Parameter siehe Steuerkreuz

String Category

String Name

Array<String> States

Int DefaultState

String Icon


VehicleProfile
VehicleProfileMeta Meta: Fahrzeugprofil-Metadaten

Map<VehicleAppearanceProperty, VehicleAppearancePropertyValues> Appearence: Erscheinungsbild

VehicleResourcesDefinition Resources: Ressourcen-Definition

VehicleSteeringDefinition Steering: Lenkungsdefinition

VehicleChassisDefinition Chassis: Chassisdefinition

Array<VehicleWheelDefinition> Wheels: Rad-Definitionen

Array<VehicleAttachmentDefinition> Attachments: Attachment-Definitionen

Map<String, VehicleLightDefinition> Lights: Lichtquellen-Definitionen

Map<String, VehiclePostProcessingVolumeDefinition> PostProcessingVolumes: PostProcessingVolume-Definitionen

Array<VehicleLightBillboardDefinition> Billboards: Billboard-Definitionen

VehicleProfileMeta
String Name

Guid Id

Guid VehicleId

Bool bIsDefault

Bool bIsValid

String Path

DateTime LastModificationDate


VehicleResourcesDefinition
Float MaxEngineResourceLevel

VehicleSteeringDefinition
Float InputRatio

VehicleChassisDefinition
String MeshReferencePath

Float Width

Float Length

Float Height

Float Mass

Float DragCoefficient

Float DownforceCoefficient

Vector CenterOfMassOffset


VehicleWheelDefinition
String MeshReferencePath

String MeshReferencePathForMotionBlur

Bool StationaryMeshAlwaysVisible

Bool StationaryMeshCustomDepth

Bool MotionBlurMeshStatic

Float MotionBlurTreshold

Float MotionBlurRange

Float MotionBlurScale

String VerticalPosition

String HorizontalPosition

Vector Offset

Bool AffectedByEngine

Bool AffectedByBrake

Bool AffectedBySteering

Bool AffectedByHandBrake

Float RimRadius

Float Radius

Float Width

Float FrictionForceMultiplier

Float CorneringStiffness

Float SideSlipModifier

Float SlipThreshold

Float SkidThreshold

Float SpringRate

Float SpringPreload

Vector SuspensionAxis

Vector SuspensionForceOffset

Float SuspensionMaxRaise

Float SuspensionMaxDrop

Float SuspensionDampingRatio

Float SuspensionSmoothing

Float WheelLoadRatio

Float RollbarScaling

Float MaxSteerAngle

Float MaxBrakeTorque

Float MaxHandBrakeTorque

Float MaxBrakeSpeed


VehicleAttachmentDefinition
String Name

String MeshReferencePath

Array<VehicleAttachmentMaterialOverrideDefinition> MaterialOverrides

String Target

String Role

Vector PositionOffset

Rotator RotationOffset

Bool TriggerClickEvent

Map<String, Int> DynamicMaterialIndices

Map<String, String> DynamicMaterialSlotNames

Array<VehicleDynamicDisplayDefinition> DynamicDisplays

VehicleInteractionDefinition Interaction

VehicleAttachmentSceneCaptureDefinition

Map<String, Int> CustomDataInts


VehicleAttachmentMaterialOverrideDefinition
String SlotName

Int SlotIndex

String MaterialReferencePath


VehicleDynamicDisplayDefinition
String Name

Vector Offset

Vector Scale

Rotator RotationOffset

Vector2D Resolution

Bool ContainsNavigation

Vector2D NavigationResolution


VehicleInteractionDefinition
Bool Interactable

String Identifier

Vector InfoOffset

Rotator InfoRotationOffset

String InfoText

String SecondaryInfoText

Bool AllowLongInteraction

Bool SupportSecondaryInteraction


VehicleAttachmentSceneCaptureDefinition
Bool Enabled

String TargetTextureReferencePath

Vector PositionOffset

Rotator RotationOffset

Float ProjectionFov


VehicleLightDefinition
String Type

Vector Position

Rotator Rotation

Float Intensity

Float AttenuationRadius

Bool CastsShadows

Bool AffectsWorld

LinearColor Color

Float InnerConeAngle

Float OuterConeAngle


VehiclePostProcessingVolumeDefinition
Vector Position

VehicleEngineDescription
String Identifier:
Motor-Identifier

VehicleEngineType Type: Motorart. Derzeit möglich: Combustion, Electric, Other

Map<String, LuaValue> Parameters: Motorparameter

VehicleTransmissionDescription
String Identifier

VehicleTransmissionType Type

Array<VehicleGearDescription> Gears

Array<VehicleEngineDriveModeDescription> DriveModes

Map<String, LuaValue> Parameters
Scripting - Datentypen Teil 2
MusicPlayerTickData
Bool IsPlaying: Gibt an, ob der Musikplayer derzeit etwas abspielt

Bool IsLooping: Gibt an, ob die Loop-Funktion derzeit eingeschaltet ist

Bool IsLoopingOneSong: Gibt an, ob die Loop-Funktion für einen Song derzeit eingeschaltet ist

Bool IsShuffled: Gibt an, ob die Shuffle-Funktion derzeit eingeschaltet ist

Array<String> AvailablePlaylists: Enthält alle verfügbaren Playlists

Array<String> AvailableRadioStations: Enhält alle verfügbaren Radiostationen

Array<String> AvailablePlaylistsAndRadioStations: Enthält alle verfügbaren Playlists und Radiostationen

String PlaylistName: Der Name der aktuellen Playlist bzw. Radiostation

String Artist: Der Interpret des aktuellen Songs. Bei Radiostationen ist dieser Wert leer.

String Title: Der Titel des aktuellen Songs. Bei Radiostationen ist dieser Wert leer.

Float TrackLength: Die Länge des aktuellen Songs in Sekunden. Bei Radiostationen ist dieser Wert leer.

Float TrackTime: Gibt an, wie viele Sekunden des aktuellen Songs bereits abgespielt wurden. Bei Radiostationen ist dieser Wert leer.

Float TrackProgress: Gibt den Fortschritt des aktuellen Songs (0 bis 1) an. Bei Radiostationen ist dieser Wert leer.

Float Volume: Die aktuell eingestellte Lautstärke (0 bis 1)

Bool IsRadioStation: Gibt an, ob es sich um eine Radiostation (true) oder eine Playlist (false) handelt.
Sounds
Für Fahrzeugsounds empfiehlt sich die Verwendung von MetaSounds. Zu verwendenede Sounds müssen im Unreal-Editor importiert werden und sollten eine Sampling-Rate von 44100 Hz haben. Es können beliebig viele MetaSound-Assets angelegt werden, welche über Lua-Scripts angesteuert werden.

Um ein MetaSound-Assets in ein Fahrzeug einzubinden, muss zunächst die Referenz auf das Objekt kopiert werden. Diese erhält man, indem man das MetaSound-Asset mit der rechten Maustaste anklickt und "Copy Reference" auswählt. Anschließend kann im Lua-Script requireMetaSound aufgerufen werden. Dadurch wird das MetaSound-Asset mit dem jeweiligen Lua-Script verknüpft und kann angesteuert werden.

Script-Funktionen
RequireMetaSound(String Path)
Diese Funktion verknüpft ein MetaSound-Asset mit dem aktuellen Script. Es kann immer nur ein Asset mit einem Script verknüpft werden.

Path: Referenz auf das MetaSound-Asset

RequireMetaSoundAtLocation(String Path, Float X, Float Y, Float Z)
Diese Funktion verknüpft ein MetaSound-Asset mit dem aktuellen Script und setzt es an eine bestimme Position im Fahrzeug. Es kann immer nur ein Asset mit einem Script verknüpft werden.

Path: Referenz auf das MetaSound-Asset

X: X-Koordinate der Position des Sounds

Y: Y-Koordinate der Position des Sounds

Z: Z-Koordinate der Position des Sounds

SetSoundInputFloat(String Name, Float Value)
Setzt einen Float-Parameter im verknüpften MetaSound-Asset.

Name: Name des Parameters

Value: Wert, auf den der Parameter gesetzt werden soll

SetSoundInputInt(String Name, Int Value)
Setzt einen Integer-Parameter im verknüpften MetaSound-Asset.

Name: Name des Parameters

Value: Wert, auf den der Parameter gesetzt werden soll

SetSoundInputBool(String Name, Bool Value)
Setzt einen Boolean-Parameter im verknüpften MetaSound-Asset.

Name: Name des Parameters

Value: Wert, auf den der Parameter gesetzt werden soll

CallSoundTrigger(String Name)
Ruft im verknüpften MetaSound-Asset einen Trigger auf.

Name: Name des Triggers
Displays - Teil 1
Attachment-Parameter
Um ein Display zu erzeugen, gibt es den Attachment-Parameter "dynamicDisplays". Dieser ist ein Array welches Display-Definitionen enthält. Eine Display-Definition hat die folgenden Parameter:

Parameter
Datentyp
Beschreibung
name
String
Name des Displays
offset
Vektor
Positions-Offset gegenüber dem Attachment
rotationOffset
Rotator
Rotations-Offset gegenüber dem Attachment
scale
Vektor
Größe des Displays (Die tatsächlich Größe ergibt sich aus der Auflösung multipliziert mit diesem Parameter)
resolution
Vektor2D
Auflösung des Displays in Pixeln
containsNavigation
Boolean
Legt fest, ob dieses Display eine Minimap mit Navigation darstellen kann
navigationResolution
Vektor2D
Auflösung der Minimap (falls vorhanden) in Pixeln
supportsInteraction
Boolean
Legt fest, ob für dieses Display Interaktionen zugelassen sind

Texturen und Brushes
Um Texturen auf Displays zu zeichnen, müssen die Texturen zunächst im Unreal-Editor importiert werden. Anschließend muss für jede Textur ein Brush erstellt werden und in dem Brush die jeweilige Textur als "Image" zugewiesen werden.


Um einfärbige Flächen zu zeichnen, ist es auch möglich, im Brush das Image wegzulassen und die gewünschte Farbe als "Tint" einzustellen.

Schriftarten
Um bestimmte Schriftarten zu benutzen, müssen diese zunächst im Unreal-Editor importiert werden. Unreal erstellt hierbei für jede Schriftart sowohl ein FontFace-Asset als auch ein Font-Asset. Das Font-Asset muss später noch im Script registriert werden. Dafür wird eine Referenz auf das Asset benötigt, welche durch Rechtsklick auf das Asset und "Copy Reference" erhalten werden kann.

Scripting
Das eigentliche Zeichnen des Displays erfolgt im Script. Zunächst muss mittels activateDynamicDisplayContext der korrekte Kontext ausgewählt werden. Anschließend müssen alle Brushes und Schriftarten, die verwendet werden sollen, mittels registerBrush und registerFont registriert werden. Danach können mit createRectangle und createText entsprechende Display-Elemente erzeugt werden. Diese Elemente können dann später dynamisch aktualisiert werden, um auf veränderte Fahrzeugzustände zu reagieren.

Script-Funktionen
ActivateDynamicDisplayContext(String DynamicDisplayName)
Diese Funktion setzt den Kontext auf das angegebene Display. Alle übrigen Funktionen wirken immer auf das jeweils aktive Display, weshalb diese Funktion immer als erstes aufgerufen werden muss.

DynamicDisplayName: Name des Displays, auf das der Kontext gesetzt werden soll.

ClearDynamicDisplay()
Diese Funktion entfernt alle vorhandenen Elemente vom aktiven Display.

registerBrush(String Path)
Diese Funktion registriert einen Brush für das aktive Display. Dabei ist zu beachten, dass eine Registrierung nur für das aktive Display gilt und ein Brush, der auf mehreren Displays verwendet werden soll, auch bei allen Displays registriert werden muss. Als Rückgabewert liefert diese Funktion eine BrushHandle, welche in anderen Funktionen angegeben werden kann, um auf diesen Brush zu referenzieren.

Path: Referenzpfad auf das Brush-Asset

registerFont(String Path)
Diese Funktion registriert eine Schriftart für das aktive Display. Dabei ist zu beachten, dass eine Registrierung nur für das aktive Display gilt und eine Schriftart, die auf mehreren Displays verwendet werden soll, auch bei allen Displays registriert werden muss. Als Rückgabewert liefert diese Funktion eine FontHandle, welche in anderen Funktionen angegeben werden kann, um auf diese Schriftart zu referenzieren.

Path: Referenzpfad auf das Font-Asset

CreateRectangle(Float PositionX, Float PositionY, Float SizeX, Float SizeY, Int BrushHandle)
Erzeugt ein Rechteck an der angegebenen Position mit der angegebenen Größe unter Verwendung des angegebenen Brush. Als Rückgabewert liefert diese Funktion eine RectangleHandle, welche in anderen Funktionen angegeben werden kann, um auf dieses Rechteck zu referenzieren.

PositionX: X-Koordinate der Position in Pixeln, an der das Rechteck gezeichnet werden soll.

PositionY: Y-Koordinate der Position in Pixeln, an der das Rechteck gezeichnet werden soll.

SizeX: Breite des Rechtecks in Pixeln

SizeY: Höhe des Rechtecks in Pixeln

BrushHandle: Handle des zu verwendenden Brushes

CreateText(String Text, Float PositionX, Float PositionY, Float SizeX, Float SizeY, Int FontHandle, Int FontSize, Float ColorR, Float ColorG, Float ColorB)
Erzeugt einen Text mit den angegebenen Parametern. Als Rückgabewert liefert diese Funktion eine TextHandle, welche in anderen Funktionen angegeben werden kann, um auf diesen Text zu referenzieren.

Text: Text

PositionX: X-Koordinate der Position in Pixeln, an der der Text gezeichnet werden soll.

PositionY: Y-Koordinate der Position in Pixeln, an der der Text gezeichnet werden soll.

SizeX: Breite des Texts in Pixeln

SizeY: Höhe des Texts in Pixeln

FontHandle: Handle der zu verwendenden Schriftart

FontSize: Schriftgröße

ColorR: R-Komponente der zu verwendenden Schriftfarbe

ColorG: G-Komponente der zu verwendenden Schriftfarbe

ColorB: B-Komponente der zu verwendenden Schriftfarbe

CreateNavigation(Float PositionX, Float PositionY, Float SizeX, Float SizeY)
Erzeugt ein Rechteck, welches eine Minimap mit der aktuellen Navigation enthält. Funktioniert nur, wenn im Attachment der DynamicDisplay-Parameter containsNavigation auf true gesetzt wurde. Als Rückgabewert liefert diese Funktion eine RectangleHandle, welche in anderen Funktionen angegeben werden kann, um auf dieses Rechteck zu referenzieren.

PositionX: X-Koordinate der Position in Pixeln, an der das Rechteck gezeichnet werden soll.

PositionY: Y-Koordinate der Position in Pixeln, an der das Rechteck gezeichnet werden soll.

SizeX: Breite des Rechtecks in Pixeln

SizeY: Höhe des Rechtecks in Pixeln

SetNavigationZoom(Number Zoom)
Mit dieser Funktion kann der Zoom-Level der Minimap eingestellt werden.

Zoom: Neuer Zoom-Wert

SetNavigationLineThickness(Number LineThickness)
Mit dieser Funktion kann die Linienstärke der Navigation auf der Minimap eingestellt werden.

LineThickness: Neue Linienstärke

SetNavigationIconSize(Number Size)
Mit dieser Funktion kann die Größe der PointOfInterest-Markierungen auf der Minimap eingestellt werden.

Size: Neue Größe
Displays - Teil 2
SetText(Int TextHandle, String NewText)
Mit dieser Funktion kann der Text einer bestehenden TextHandle aktualisiert werden.

TextHandle: TextHandle, deren Text geändert werden soll

NewText: Neuer Text

SetTextFontSize(Int TextHandle, Int NewFontSize)
Mit dieser Funktion kann die Schriftgröße einer bestehenden TextHandle aktualisiert werden.

TextHandle: TextHandle, deren Schriftgröße geändert werden soll

NewFontSize: Neue Schriftgröße

SetTextColor(Int TextHandle, Float NewColorR, Float NewColorG, Float NewColorB, Float NewColorA)
Mit dieser Funktion kann die Textfarbe einer bestehenden TextHandle aktualisiert werden.

TextHandle: TextHandle, deren Schriftgröße geändert werden soll

NewColorR: R-Komponente der neuen Textfarbe

NewColorG: G-Komponente der neuen Textfarbe

NewColorB: B-Komponente der neuen Textfarbe

NewColorA: A-Komponente der neuen Textfarbe

SetTextFont(Int TextHandle, Int NewFontHandle)
Mit dieser Funktion kann die Schriftart einer bestehenden TextHandle aktualisiert werden.

TextHandle: TextHandle, deren Schriftart geändert werden soll

NewFontHandle: FontHandle der neuen Schriftart

SetTextAlignInCenter(Int TextHandle, Bool AlignInCenter)
Mit dieser Funktion kann Text zentriert werden.

TextHandle: TextHandle, deren Text zentriert werden soll

AlignInCenter: True um den Text zu zentrieren, false um ihn nicht mehr zu zentrieren

SetTextAlignRight(Int TextHandle, Bool AlignRight)
Mit dieser Funktion kann Text rechtsbündig gesetzt werden.

TextHandle: TextHandle, deren Text rechtsbündig werden soll

AlignRight: True um den Text rechtsbündig zu setzen, false um ihn linksbündig zu setzen

SetRectangleSize(Int RectangleHandle, Float SizeX, Float SizeY)
Mit dieser Funktion kann die Größe eines bestehenden Rechtecks verändert werden.

RectangleHandle: RectangleHandle des Rechtecks, welches verändert werden soll

SizeX: Neue Breite in Pixeln

SizeY: Neue Höhe in Pixeln

SetRectanglePosition(Int RectangleHandle, Float PosX, Float PosY)
Mit dieser Funktion kann die Position eines bestehenden Rechtecks verändert werden.

RectangleHandle: RectangleHandle des Rechtecks, welches verändert werden soll

PosX: Neue X-Koordinate in Pixeln

PosY: Neue Y-Koordinate in Pixeln

SetRectangleRotation(Int RectangleHandle, Number Angle, Float RotateAroundPointX, Float RotateAroundPointY)
Mit dieser Funktion kann ein bestehendes Rechteck rotiert werden.

RectangleHandle: RectangleHandle des Rechtecks, welches verändert werden soll

Angle: Neuer Rotationswinkel

RotateAroundPointX: X-Koordinate des Punkts, um den das Rechteck rotiert werden soll

RotateAroundPointY: Y-Koordinate des Punkts, um den das Rechteck rotiert werden soll

HideElement(Int Handle)
Mit dieser Funktion kann ein Element ausgeblendet werden.

Handle: Handle auf das Element

ShowElement(Int Handle)
Mit dieser Funktion kann ein ausgeblendetes Element wieder eingeblendet werden.

Handle: Handle auf das Element

SetRectangleBrush(Int RectangleHandle, Int BrushHandle)
Mit dieser Funktion kann der für ein Rechteck verwendete Brush geändert werden.

RectangleHandle: RectangleHandle auf das Rechteck, dessen Brush geändert werden soll

BrushHandle: BrushHandle auf den zu verwendenden Brush

SetDisplayRendering(Bool Active)
Diese Funktion legt fest, ob das aktive Display gerendert werden soll.

Active: Soll das Display gerendert werden?
Steuerkreuzmenu
Damit ein Fahrzeug korrekt mit dem Steuerkreuz-Menü funktioniert, sind einige Anpassungen erforderlich.

Konfiguration in der data.json
In der "data.json" des Fahrzeugs muss definiert werden, welche Funktionen das Fahrzeug im Steuerkreuz zur Verfügung stellen soll. Dafür können unter "CrossMenuFunctions" beliebig viele Steuerkreuz-Funktionen angelegt werden, welche die folgenden Parameter haben:

Parameter
Datentyp
Beschreibung
name
String
Funktionsname
category
String
Kategorie
Icon
Referenzpfad
Referenz auf das Icon für diese Funktion
States
String-Array
Array aus allen Zuständen, die diese Funktion annehmen kann
DefaultState
Integer
Index des Standard-Zustands beim Initialisieren des Fahrzeugs

Beispiel
"CrossMenuFunctions": [ { "Name": "Lightswitch", "Category": "Lights", "Icon": "Texture2D'/Game/Vehicles/Cars/Mercedes_AMG_C63_2016/Blueprints/Dashboard/Textures/ArrowUp.ArrowUp'", "States": [ "ParkingLight", "Automatic", "Headlight" ], "DefaultState": 1 }, { "Name": "Foglight", "Category": "Lights", "Icon": "Texture2D'/Game/Vehicles/Cars/Mercedes_AMG_C63_2016/Blueprints/Dashboard/Textures/ArrowUp.ArrowUp'", "States": [ "Off", "On" ], "DefaultState": 0 } ],

Script-Funktionen
Vom Steuerkreuz aufgerufene Funktion
onCrossMenuChanged(String Function, String State)
Diese Funktion kann im Script angelegt werden und wird vom Steuerkreuz immer dann aufgerufen, wenn der Spieler eine Funktion im Steuerkreuz anklickt. Das Fahrzeugscript sollte dann dafür sorgen, dass die vom Spieler ausgewählte Funktion auch tatsächlich ausgeführt wird (also z.B. der Lichtschalter auf die entsprechende Position gedreht wird und das Licht eingeschaltet wird).

Function: Name der aufgerufenen Funktion (z.B. Lichtschalter). Entspricht "name" in "CrossMenuFunctions" in der "data.json"

State: Neuer Status, auf den die Funktion gesetzt werden soll (z.B. Abblendlicht). Entspricht dem entsprechenden Eintrag in "states" in "CrossMenuFunctions" in der "data.json"

Vom Script aufzurufende Funktion
updateCrossMenu(String Function, String State)
Mit dieser Funktion wird dem Steuerkreuz-Menü mitgeteilt, dass sich der Status einer Fahrzeugfunktion geändert hat. Diese Funktion sollte vom Script immer aufgerufen werden, wenn sich der Status einer Funktion im Steuerkreuz geändert hat, egal ob die Änderung durch onCrossMenuChanged ausgelöst wurde oder auf eine andere Art.

Function: Name der Funktion. Muss einem in "CrossMenuFunctions" in der "data.json" festgelegten Funktionsnamen entsprechen.

State: Neuer Status. Muss einem in "CrossMenuFunctions" in der "data.json" festgelegten Funktionsstatus entsprechen.
Interaktionen
Als Interaktion wird bezeichnet, wenn der Spieler ein Fahrzeug-Attachment anvisiert und anschließend eine Interaktionstaste drückt. Es gibt primäre und sekundäre Interaktionen und es wird zwischen Drücken und Loslassen unterschieden.

Es gibt zwei verschiedene Interaktionstypen. Diese Unterscheidung ist nötig, weil ein langes Drücken der Interaktionstaste normalerweise das Ein- bzw. Aussteigen aus dem Fahrzeug bewirkt. In diesem Fall ist eine Unterscheidung zwischen Beginn und Ende der Interaktion nicht möglich, weil ja erst beim Loslassen der Taste feststeht, ob die Interaktion überhaupt ausgelöst wird. Deshalb gibt es als zweiten Typ sogenannte "lange" Interaktionen, die das Ein-/Aussteigen unterdrücken und sowohl zu Beginn als auch beim Ende des Tastendrucks ausgelöst werden. Dadurch ist es z.B. möglich, lange Tastendrücke im Cockpit umzusetzen.

Attachment-Parameter
Interaktionen werden jeweils für ein Attachment konfiguriert. Dafür gibt es den Attachment-Parameter "interaction", welcher seinerseits die folgenden Parameter besitzt:

Parameter
Datentyp
Beschreibung
identifier
String
Name, um die Interaktion zu identifizieren
interactable
Boolean
Muss auf true gesetzt werden, damit die Interaktion aktiv ist
allowLongInteraction
Boolean
Legt fest, ob die Aussteigen-Interaktion unterdrückt wird und somit lange Interaktionen möglich werden (siehe oben)
SupportSecondaryInteraction
Boolean
Legt fest, ob dieses Attachment neben der primären Interaktion auch eine sekundäre Interaktion erlaubt
InfoText
String
Infotext für die Interaktion. Wird angezeigt, wenn das Attachment anvisiert wird
SecondaryInfoText
String
Infotext für die sekundäre Interaktion
ExteriorOnly
Boolean
Wenn dieser Parameter true ist, kann die Interaktion nur außerhalb des Fahrzeugs aufgerufen werden

Script-Funktion
onAttachmentInteract(String InteractionName, bool Secondary, bool Pressed)
Diese Funktion im Script wird immer aufgerufen, wenn mit einem Attachment interagiert wird.

InteractionName: Name der Interaktion, entspricht dem Parameter "identifier". Wenn "identifier" nicht definiert ist, wird stattdessen die Rolle des Attachments verwendet.

Secondary: Ist true, wenn es sich um die sekundäre Interaktion handelt

Pressed: Ist true, wenn die Interaktionstaste gedrückt wurde und false, wenn die Interaktionstaste losgelassen wurde. Wenn das Attachment keine langen Interaktionen unterstützt, ist diese Variable immer false

Display-Interaktionen
Es ist auch möglich, Display-Interaktionen einzurichten. Diese werden immer dann ausgelöst, wenn der Spieler ein Display anklickt. Damit Display-Interaktionen funktionieren, muss beim entsprechenden DynamicDisplay der Parameter supportsInteraction auf true gesetzt sein.

Script-Funktion
onDynamicDisplayInteract(String DisplayName, String AttachmentName, Bool Pressed, Float CoordinateX, Float CoordinateY)
Diese Funktion im Script wird immer aufgerufen, wenn mit einem Display interagiert wird.

DisplayName: Name des Displays, mit dem interagiert wird.

AttachmentName: Name des Attachments, dem das Display zugeordnet ist. Diese Unterscheidung ist wichtig, wenn es in mehreren Attachments Displays gibt, die den selben Namen haben.

Pressed: Ist true, wenn die Interaktionstaste gedrückt wurde und false, wenn die Interaktionstaste losgelassen wurde.

CoordinateX: X-Koordinate der Position in Pixeln, an der das Display angeklickt wurde.

CoordinateY: Y-Koordinate der Position in Pixeln, an der das Display angeklickt wurde.
Hochladen und Teilen

Inzwischen hast du deinen Mod wahrscheinlich schon häufig in CityDriver getestet, um sicherzustellen, dass alles wie vorgesehen funktioniert. Falls du deinen Mod mit der Community teilen möchtest, kannst du ihn in der "Fahrzeugauswahl" in CityDriver in den Steam Workshop hochladen - dein Mod wird standardmäßig versteckt sein, so dass du ihn testen kannst, bevor du ihn für die gesamte Community veröffentlichst.

Du findest die Option "Workshop-Einstellungen" in der unteren rechten Ecke der Benutzeroberfläche von CityDriver oder über Taste R.

Das Hochladen deines Mods kann eine Weile dauern, da die Dateien im Hintergrund auf den Steam Workshop übertragen werden.

Wo kannst du deine Mod im Steam Workshop finden?
Wenn deine Mod-Dateien erfolgreich an den Workshop übermittelt wurden, kannst du deine Mod in deinem Steam-Profil unter "Workshop Submission" von CityDriver finden.
Du kannst deinen Mod auch später über die "Steam Workshop-Einstellungen" in der "Fahrzeugauswahl" von CityDriver aktualisieren und veröffentlichen.

Stelle sicher, dass du deinen Mod im Steam Workshop überprüfst, bevor du ihn veröffentlichst, da man gelegentlich die Workshop-Vereinbarung von Steam erneut akzeptieren muss. Auch das Hochladen eines Vorschaubildes für deinen Mod kann aktuell nur über den Steam Workshop selbst erfolgen und CityDriver bietet einen praktischen Fotomodus für Screenshots.

Erneutes Hochladen eines Mod über CityDriver nach dem Löschen des Mod im Steam Workshop
Falls du deine Mod im Steam Workshop gelöscht haben solltest und ihn aus irgendeinem Grund wieder über CityDriver hochladen möchtest, musst du die Nummer der workshopId in der default.json deines Mod-Dateien ebenfalls löschen:

Vorher:
"workshopId": "2976988849"
Nachher:
"workshopId": ""



Viel Erfolg
Das wäre vorerst Alles zu dieser Version des Fahrzeug-Moddings von CityDriver. Schreibe gerne in die Kommentare oder tausche dich direkt aus mit der Modding Community auf unserem Discord: https://discord.gg/viewapp-community

2 Comments
anmillionkov 31 May, 2023 @ 1:03am 
Здравствуйте, хочу у вас попросить игру на видео обзор в социальную сеть ВК зарание говорю вам спасибо. Желаю вам больших успехов и скорейшего выхода игры. Hello, I want to ask you to play a video review on the VK social network in advance, I say thank you. I wish you great success and a speedy release of the game
_TheMarCraft_ 25 May, 2023 @ 9:49pm 
Muss man sich mal durchlesen bevor man anfängt zu modden😅