Ziel dieser Übung ist es, dem Spieler Schaden zuzufügen, wenn er sich nicht innerhalb einer bestimmten Zeit von seinem Spawnpad entfernt. Du wirst fehlbare Ausdrücke und Fehlerkontexte verwenden, um Informationen über den Standort des Spielers zu erhalten und um herauszufinden, wie weit er sich 10 Sekunden nach dem Spawnen bewegt hat.
Vergewissere dich zunächst, dass du die Funktionen HurtPlayer()
und CalculateDamage()
noch in deiner Verse-Datei hast. Du rufst HurtPlayer()
auf, wenn der Spieler sich nicht weit genug bewegt hat. Zur Erinnerung: Hier ist der Code für diese Funktionen.
HurtPlayer(DamageAmount:float):void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
if (Player:player = AllPlayers[0]):
if (FortniteCharacter:fort_character = Player.GetFortCharacter[]):
MyCharacterHealth:float = FortniteCharacter.GetHealth()
DamageToDo:float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Damage To Do: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Diesen Schaden zufügen, wenn das Ausmaß des Schadens den Spieler eliminieren würde
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten.
return PlayerHealth - MinHealth
else:
# Spieler eliminieren
return PlayerHealth
Jetzt musst du alle player
-Objekte im Level holen (in diesem Fall nur eines, nämlich dich!). Du erstellst auch zwei Variablen, um die transform
des Spielers zu verschiedenen Zeitpunkten zu speichern. Ein transform-Objekt enthält Daten über die Position, die Drehung und den Maßstab eines Objekts. Für diese Übung brauchst du nur die Position, aber die ist im Objekt transform
gespeichert.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
Es ist an der Zeit, einige Fehlerkontexte mit if
zu erstellen. Die ersten beiden Zeilen unten holen das fort_character
Objekt aus dem player
Objekt. Wenn dieser Code dir bekannt vorkommt, liegt das daran, dass er fast identisch ist mit einem Teil des Codes der Funktion HurtPlayer()
. Du musst es hier noch einmal schreiben, weil du es auch brauchst, um die transform
eines 'fort_character' zu erhalten. Er kann auch fehlschlagen, wie durch das []
angedeutet, also muss er in einem Fehlerkontext stehen.
Setze die Variable FirstPosition
, die du zuvor erstellt hast, auf den Wert, den FortniteCharacter.GetTransform()
zurückgibt. Dieser Ausdruck ist nicht fehlbar, aber wenn einer der beiden vorherigen Ausdrücke fehlschlägt, soll dieser Ausdruck nicht ausgeführt werden, so dass er sich im gleichen Fehlerkontext befindet.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Da sich alle fehlbaren Ausdrücke im if
-Codeblock befinden, benötigst du einen neuen Codeblock für den Code, der im Erfolgsfall ausgeführt werden soll. Das ist der Punkt, an dem das then
ins Spiel kommt. Wenn du die Form von if
ohne ()
schreibst, verwende then
für Code, der ausgeführt werden soll, wenn der gesamte Code im if
Codeblock erfolgreich ist.
Dein erster then
-Block sollte so aussehen.
then:
Print("Beweg dich oder du erleidest Schaden!")
Sleep(10.0)
Diese beiden Funktionen hast du schon einmal gesehen. Print()
wird hier benutzt, um den Spieler zu warnen, dass er sich bewegen muss. Sleep()
gibt dem Spieler 10 Sekunden Zeit, sich vom Spawnpunkt zu entfernen, bevor der nächste Code-Block ausgeführt wird.
Nach einer Wartezeit von 10 Sekunden wird der Code ausgeführt, der prüft, ob sich der Spieler in einer bestimmten Entfernung von seinem Spawnpunkt befindet, und wenn nicht, ihm Schaden zufügt.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
Die ersten drei Zeilen sind fast identisch mit dem ersten if
-Codeblock, außer dass du jetzt SecondPosition
anstelle von FirstPosition
setzt. Jetzt hast du zwei Positionen zum Vergleich.
Als nächstes muss DistanceBetweenPositions
deklariert und initialisiert werden. Um dies zu ermitteln, wird eine integrierte Verse-Funktion namens DistanceXY()
verwendet. Sie benötigt zwei Argumente, beides Koordinaten im 3D-Raum, die Vektoren genannt werden. Sie verwendet nur die X- und Y-Koordinaten, um die Entfernung zu messen, und gibt diese Entfernung als float
zurück. Denke daran, nur die Eigenschaft Translation
der beiden transform
-Variablen zu verwenden.
Vergleiche schließlich den DistanceBetweenPositions
-Wert mit einem Float
-Wert. Es ist eine gute Idee, mit einer großen Zahl zu beginnen, um sicherzustellen, dass dein Code funktioniert. Verringere den Wert, wenn du herausgefunden hast, wie weit du dich in der vorgegebenen Zeit bewegen kannst.
Der nächste `then´-Block wird ausgeführt, wenn die Spieler nicht die erforderliche Entfernung innerhalb des Zeitlimits zurücklegen. Dies soll also der Code sein, der den Spieler schädigt.
then:
Print("Zurückgelegte Distanz: {DistanceBetweenPositions}")
Print("Schaden wird ausgeteilt")
HurtPlayer(50.0)
Dies gibt die tatsächliche Entfernung aus, die der Spieler zurückgelegt hat, eine Benachrichtigung, dass der Schaden angewendet wird, und einen Aufruf der Funktion HurtPlayer()
, die du zuvor geschrieben hast. Indem du die Funktion HurtPlayer()
aufrufst, musst du nicht darüber nachdenken, wie sie implementiert wird. Du weißt, dass sie die Regeln befolgen wird, die du vorher für die Schädigung des Spielers festgelegt hast.
Vollständiges Script
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Temporary/SpatialMath }
hello_world_device := class(creative_device):
# Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird
OnBegin<override>()<suspends>:void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
then:
Print("Beweg dich oder du erleidest Schaden!")
Sleep(10.0)
if:
Player : player = AllPlayers[0]
FortniteCharacter : fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions: float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
then:
Print("Zurückgelegte Distanz: {DistanceBetweenPositions}")
Print("Schaden wird ausgeteilt")
HurtPlayer(50.0)
# Funktionen aus früheren Lektionen
#################################
HurtPlayer(DamageAmount : float):void=
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (Player : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = Player.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Damage To Do: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Diesen Schaden zufügen, wenn das Ausmaß des Schadens den Spieler eliminieren würde
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten.
return PlayerHealth - MinHealth
else:
# Spieler eliminieren
return PlayerHealth
Nächste Schritte
Jetzt, da du die Grundlagen kennst, bist du bereit, mit Verse dein eigenes Gerät in Unreal Editor für Fortnite zu erstellen! Wie das geht, erfährst du in der folgenden Anleitung.