W tym ćwiczeniu twoim celem jest zadanie obrażeń graczowi, jeśli w określonym czasie nie odejdzie on od panelu startowego na konkretną odległość. Wykorzystasz wyrażenia zawodne oraz konteksty niepowodzenia, aby pobrać informacje o lokalizacji gracza i ustalić, jak daleko udało mu się przemieścić w ciągu 10 sekund od zespawnowania.
Najpierw upewnij się, że w Twoim pliku Verse wciąż znajdują się funkcje HurtPlayer() i CalculateDamage(). Funkcję HurtPlayer() będziesz wywoływać, jeśli gracz nie odejdzie dość daleko. Dla przypomnienia poniżej zamieszczono kody tych funkcji.
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("Obrażenia do zadania: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Jeśli wartość zadanych obrażeń nie wyeliminuje gracza, zadaj mu taką ilość obrażeń
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia
return PlayerHealth - MinHealth
else:
# Wyeliminuj gracza
return PlayerHealth
Teraz musisz pobrać wszystkie obiekty player w poziomie (w tym przypadku tylko jeden obiekt, czyli ciebie!). Utworzysz również dwie zmienne do przechowywania obiektu transform gracza w różnych momentach w czasie. Obiekt przekształcenia transform zawiera dane na temat lokalizacji, obrotu oraz skali obiektu. W tym ćwiczeniu potrzebna jest jedynie lokalizacja, jednak jest ona przechowywana w obiekcie transform.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
Czas utworzyć kilka kontekstów niepowodzenia przy użyciu wyrażenia if. Pierwsze dwa wiersze poniżej pobierają obiekt fort_character z obiektu player. Jeśli kod wygląda znajomo, to dlatego, że jest bardzo zbliżony do fragmentu kodu funkcji HurtPlayer(). Musisz zapisać go tutaj ponownie, ponieważ jest on potrzebny również do pobrania obiektu transform z obiektu ‘fort_character'. Kod ten może zwrócić niepowodzenie, na co wskazuje nawias [], zatem musi on być ujęty w kontekst niepowodzenia.
Dla utworzonej wcześniej zmiennej FirstPosition ustaw wartość zwróconą przez FortniteCharacter.GetTransform(). To wyrażenie nie jest zawodne, jednak jeśli dowolne z dwóch poprzednich wyrażeń zwróci niepowodzenie, to wyrażenie również nie powinno być wykonywane, dlatego należy ono do tego samego kontekstu niepowodzenia.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Wszystkie wyrażenia zawodne należą do bloku kodu if, dlatego potrzebny jest nowy blok kodu zawierający kod, który ma być wykonywany w przypadku powodzenia tych wyrażeń. Do tego właśnie służy blok then. Jeśli zapiszesz blok kodu if bez użycia nawiasu (), wówczas then pozwoli wprowadzić kod, który ma być uruchamiany, gdy wszystkie wyrażenia w bloku kodu if zwrócą powodzenie.
Twój pierwszy blok then powinien wyglądać następująco.
then:
Print("Rusz się, inaczej odniesiesz obrażenia!")
Sleep(10.0)
Obydwie te funkcje są ci już znane. Print() służy tutaj do ostrzegania gracza o konieczności przemieszczenia się. Sleep() daje graczowi 10 sekund na odejście od panelu startowego, zanim uruchomiony zostanie kolejny blok kodu.
Po upływie 10-sekundowego okresu oczekiwania czas uruchomić kod, który sprawdzi, czy gracz znajduje się w określonej odległości od swojego panelu startowego, a jeśli nie, zada graczowi obrażenia.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
Pierwsze trzy wiersze są niemal identyczne, jak w pierwszym bloku kodu if. Różnica polega na tym, że ustawiasz SecondPosition zamiast FirstPosition. Teraz masz dwie lokalizacje do porównania.
Następnie zadeklaruj i zainicjuj DistanceBetweenPositions. Do pobrania tej wartości wykorzystasz wbudowaną funkcję Verse o nazwie DistanceXY(). Przyjmuje ona dwa argumenty, z których obydwa są współrzędnymi w przestrzeni 3D nazywanymi wektorami. Wykorzystuje ona współrzędne X i Y do pomiaru odległości i zwraca odległość jako wartość float. Pamiętaj, aby użyć jedynie właściwości Translation dwóch zmiennych transform.
Na końcu porównaj DistanceBetweenPositions z wartością literału float. Na początek dobrze jest wybrać dużą wartość i upewnić się, że kod działa. Zmniejsz wartość, gdy ustalisz sensowną odległość, na jaką gracz może się przemieścić w podanym czasie.
Twój kolejny blok then zostanie uruchomiony, jeśli gracze nie odejdą na wymaganą odległość w przewidzianym limicie czasu. W związku z tym w tym bloku zamieszczasz kod, który zadaje graczowi obrażenia.
then:
Print("Przebyta odległość: {DistanceBetweenPositions}")
Print("Zadanie obrażeń")
HurtPlayer(50.0)
Ten kod spowoduje wyświetlenie rzeczywistej odległości przebytej przez gracza, powiadomienia o obrażeniach, które zostaną zadane, a także wywołanie napisanej wcześniej funkcji HurtPlayer(). Wywołując funkcję HurtPlayer(), nie trzeba się zastanawiać nad sposobem jej implementacji. Wiadomo, że będzie ona działać zgodnie z regułami ustawionymi wcześniej dla zadawania graczowi obrażeń.
Kompletny skrypt
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):
# Działa po uruchomieniu urządzenia w aktywnej grze
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("Rusz się, inaczej odniesiesz obrażenia!")
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("Przebyta odległość: {DistanceBetweenPositions}")
Print("Zadanie obrażeń")
HurtPlayer(50.0)
# Funkcje z poprzednich lekcji
#################################
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("Obrażenia do zadania: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Jeśli wartość zadanych obrażeń nie wyeliminuje gracza, zadaj mu taką ilość obrażeń
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia
return PlayerHealth - MinHealth
else:
# Wyeliminuj gracza
return PlayerHealth
Następne kroki
Teraz znasz już podstawy i możesz wykorzystać Verse do utworzenia własnego urządzenia w Unreal Editor dla Fortnite! Z poniższego przewodnika dowiesz się, jak to zrobić.