이 실습의 목표는 플레이어가 정해진 시간 내에 생성 패드에서 일정 거리 이상 떨어지지 않으면 플레이어에게 피해를 입히는 것입니다. 실패 표현식과 실패 컨텍스트를 사용하여 플레이어에 대한 위치 정보를 구하고, 생성 후 10초 동안 플레이어가 얼마나 멀리 움직였는지 알아낼 것입니다.
우선 Verse 파일에 HurtPlayer()
및 CalculateDamage()
함수가 있어야 합니다. 플레이어가 충분히 멀리 움직이지 않으면 HurtPlayer()
함수를 호출합니다. 이러한 함수의 코드는 다음과 같습니다.
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=
# 피해량이 플레이어를 처치하기에 부족한 경우 그만큼의 피해를 입힙니다.
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# 플레이어의 체력이 낮은 경우 한 번 더 기회를 부여합니다.
return PlayerHealth - MinHealth
else:
# 플레이어를 처치합니다.
return PlayerHealth
이제 레벨에서 모든 player
오브젝트를 구해야 합니다. 이 경우에는 여러분 한 명뿐입니다. 플레이어의 transform
을 각 시간별로 저장하기 위해 2개의 변수를 생성합니다. transform 은 오브젝트의 위치, 회전, 스케일 관련 데이터를 보관합니다. 이 실습에서는 위치만 필요하며, transform
오브젝트에 저장됩니다.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
이제 if
를 사용하여 실패 컨텍스트를 몇 개 생성해 보겠습니다. 아래의 첫 두 줄은 player
오브젝트에서 fort_character
오브젝트를 구합니다. 이 코드가 익숙해 보이는 이유는 HurtPlayer()
함수의 코드 일부와 거의 같기 때문입니다. 'fort_character' 의 transform
을 구하는 데도 필요하므로 여기서 한 번 더 작성해야 합니다. []
로 알 수 있듯이, 이것도 실패할 수 있으므로 실패 컨텍스트 내에 있어야 합니다.
앞에서 생성한 FirstPosition
변수를 FortniteCharacter.GetTransform()
에 의해 반환된 값으로 설정합니다. 이 표현식은 실패 가능하지 않지만, 이전의 두 표현식 중 하나라도 실패하면 이 표현식을 실행하지 않으므로 같은 실패 컨텍스트 내에 있는 것입니다.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
모든 실패 가능 표현식이 if
코드 블록 내에 있으므로 성공 시 실행할 코드를 위해 새 코드 블록이 필요합니다. 이때 then
을 사용합니다. ()
없이 if
를 작성하는 경우, if
코드 블록 내의 모든 코드가 성공하면 실행할 코드를 위해 then
을 사용합니다.
첫 번째 then
블록은 다음과 같습니다.
then:
Print("Move or prepare to take damage!")
Sleep(10.0)
둘 모두 앞에서 봤던 함수입니다. Print()
는 플레이어에게 움직여야 한다고 경고하는 데 사용됩니다. Sleep()
은 플레이어가 생성 지점에서 움직이도록 다음 코드 블록 실행 전까지 10초를 부여합니다.
10초 기다린 뒤에는 플레이어가 생성 지점으로부터 일정 거리 떨어져 있는지 확인하고 그렇지 않으면 피해를 입히는 코드를 실행합니다.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
첫 세 줄은 첫 번째 if
코드 블록과 거의 동일하지만, 여기에서는 FirstPosition
대신 SecondPosition
을 설정합니다. 이제 비교할 위치가 두 개 있습니다.
다음으로, DistanceBetweenPositions
를 선언하고 초기화합니다. 이를 구하기 위해 DistanceXY()
라는 내장 Verse 함수를 사용합니다. 두 개의 실행인자가 필요합니다. 둘 모두 벡터라고 하는 3D 공간의 좌표입니다. X 및 Y 좌표만을 사용하여 거리를 측정하고 그 거리를 float
로 반환합니다. 두 transform
변수 중에서 Translation
프로퍼티만 사용해야 합니다.
마지막으로, DistanceBetweenPositions
를 리터럴 float
값과 비교합니다. 코드가 잘 작동하는지 확인하기 위해 큰 수로 시작하는 것이 좋습니다. 지정된 시간 내에 움직일 적당한 거리를 파악하면서 줄여 나가세요.
다음 then
블록은 플레이어가 시간 제한 내에 필요한 거리만큼 움직이지 않는 경우 실행됩니다. 따라서 이 코드는 플레이어에게 피해를 입힙니다.
then:
Print("Distance Moved: {DistanceBetweenPositions}")
Print("Applying Damage")
HurtPlayer(50.0)
플레이어가 움직인 실제 거리와 곧 피해가 가해진다는 알림을 프린트하며, 앞서 작성한 HurtPlayer()
함수를 호출합니다. HurtPlayer()
함수를 호출하면 어떻게 구현되는지는 생각할 필요가 없습니다. 플레이어에게 피해를 입히기 위해 앞에서 설정한 규칙을 따르게 됩니다.
전체 스크립트
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):
# 실행 중인 게임에서 장치가 시작되면 실행됩니다.
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)
# 이전 강좌의 함수
#################################
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 =
# 피해량이 플레이어를 처치하기에 부족한 경우 그만큼의 피해를 입힙니다.
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# 플레이어의 체력이 낮은 경우 한 번 더 기회를 부여합니다.
return PlayerHealth - MinHealth
else:
# 플레이어를 처치합니다.
return PlayerHealth
다음 단계
기본 내용을 학습했으니 이제 포트나이트 언리얼 에디터에서 Verse로 나만의 장치를 만들 수 있습니다! 다음 가이드를 확인하여 방법을 알아보세요.