Dans cet exercice, votre objectif est d'infliger des dégâts au joueur s'il ne se déplace pas à une certaine distance de son point d'apparition dans un délai défini. Vous allez utiliser des expressions faillibles et des contextes d'échec pour obtenir des informations sur l'emplacement du joueur et pour déterminer la distance parcourue 10 secondes après l'apparition du joueur.
Pour commencer, assurez-vous que les fonctions HurtPlayer()
et CalculateDamage()
se trouvent toujours dans votre fichier Verse. Vous appellerez HurtPlayer()
si le joueur ne s'est pas suffisamment déplacé. Pour rappel, voici le code de ces fonctions.
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=
# Si le niveau de dégâts infligé n'élimine pas le joueur, définir ce niveau
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Donner au joueur une chance supplémentaire si ses PV sont faibles
return PlayerHealth - MinHealth
else:
# Éliminer le joueur
return PlayerHealth
Vous devez maintenant récupérer tous les objets player
du niveau (dans ce cas, un seul : vous !). Vous allez également créer deux variables pour stocker la transformation (objet transform
) du joueur à différents moments. Une transformation contient des données sur l'emplacement, la rotation et l'échelle d'un objet. Dans cet exercice, vous n'avez besoin que de l'emplacement, mais il est stocké dans l'objet transform
.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
Vous devez à présent créer des contextes d'échec en utilisant if
. Les deux premières lignes ci-dessous récupèrent l'objet fort_character
à partir de l'objet player
. Si ce code vous semble familier, c'est parce qu'il est pratiquement identique à une partie du code de la fonction HurtPlayer()
. Vous devez le réécrire ici, car vous en avez également besoin pour obtenir l'objet transform
d'un objet fort_character
. Il peut également échouer, comme l'indique []
, et doit donc se trouver dans un contexte d'échec.
Définissez la variable FirstPosition
que vous avez créée précédemment sur la valeur renvoyée par FortniteCharacter.GetTransform()
. Cette expression n'est pas faillible, mais si l'une des deux expressions précédentes échoue, vous ne souhaitez pas exécuter cette expression, qui se trouve donc dans le même contexte d'échec.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Étant donné que toutes vos expressions faillibles se trouvent dans le bloc de code if
, vous devez disposer d'un nouveau bloc de code pour le code à exécuter en cas de réussite. C'est là que then
entre en jeu. Lorsque vous écrivez if
sans ()
, utilisez then
pour indiquer que le code doit être exécuté si tout le code du bloc de code if
réussit.
Votre premier bloc then
doit être similaire à celui-ci.
then:
Print("Move or prepare to take damage!")
Sleep(10.0)
Vous avez déjà vu ces deux fonctions dans une leçon précédente. Print()
est utilisée ici pour avertir le joueur qu'il doit se déplacer. Sleep()
donne au joueur 10 secondes pour s'éloigner du point d'apparition avant l'exécution du prochain bloc de code.
Après un délai d'attente de 10 secondes, le code qui vérifie si le joueur se trouve à une certaine distance de son point d'apparition s'exécute et, si ce n'est pas le cas, lui inflige des dégâts.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
Les trois premières lignes sont presque identiques au premier bloc de code if
, sauf que maintenant vous définissez SecondPosition
au lieu de FirstPosition
. Vous avez maintenant deux emplacements à comparer.
Ensuite, déclarez et initialisez DistanceBetweenPositions
. Pour cela, vous allez utiliser une fonction Verse intégrée appelée DistanceXY()
. Celle-ci prend deux arguments, à savoir des coordonnées dans l'espace 3D appelées vecteurs. Elle n'utilise que les coordonnées X et Y pour mesurer la distance, et renvoie cette distance sous forme de valeur float
. Veillez à utiliser uniquement la propriété Translation
des deux variables transform
.
Enfin, comparez la valeur DistanceBetweenPositions
à une valeur float
littérale. Nous vous conseillons de commencer par une valeur élevée pour vous assurer que votre code fonctionne. Réduisez-la à mesure que vous déterminez une distance raisonnable à parcourir dans le délai imparti.
Votre bloc then
suivant est exécuté si les joueurs ne parcourent pas la distance requise dans le délai imparti. Vous souhaitez donc que le code inflige des dégâts au joueur.
then:
Print("Distance Moved: {DistanceBetweenPositions}")
Print("Applying Damage")
HurtPlayer(50.0)
Ce code affiche la distance réelle parcourue par le joueur, une notification indiquant que des dégâts sont sur le point d'être infligés, ainsi qu'un appel à la fonction HurtPlayer()
que vous avez écrite précédemment. En appelant la fonction HurtPlayer()
, vous n'avez pas à réfléchir à la façon dont elle est mise en œuvre. Vous savez qu'elle suit les règles que vous avez définies précédemment pour infliger des dégâts au joueur.
Script complet
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):
# S'exécute à l'activation de l'appareil dans une partie en cours.
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("Move or prepare to take damage!")
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("Distance Moved: {DistanceBetweenPositions}")
Print("Applying Damage")
HurtPlayer(50.0)
# Fonctions des leçons précédentes
#################################
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 =
# Si le niveau de dégâts infligé n'élimine pas le joueur, définir ce niveau
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Donner au joueur une chance supplémentaire si ses PV sont faibles
return PlayerHealth - MinHealth
else:
# Éliminer le joueur
return PlayerHealth
Étapes suivantes
Maintenant que vous connaissez les principes de base, vous pouvez créer votre propre appareil avec Verse dans l'Unreal Editor pour Fortnite. Consultez le guide suivant pour savoir comment procéder.