この演習の目標は、プレイヤーが規定時間内にスポーン パッドから一定の距離を移動しなかった場合にプレイヤーにダメージを与えることです。 失敗する可能性がある式と失敗コンテキストを使用して、プレイヤーの位置情報を取得し、スポーン後 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
オブジェクトを取得する必要があります (この場合は 1 つだけです。つまり、あなた自身です)。また、異なる時点でのプレイヤーの transform
を保存する 2 つの変数も作成します。トランスフォーム には、オブジェクトの位置、回転、スケールに関するデータが保持されます。この演習では場所のみが必要となります。しかしこれは、transform
オブジェクトに保存されています。
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
if
を使用していくつかの失敗コンテキストを作成します。以下の最初の 2 行は、player
オブジェクトから fort_character
オブジェクトを取得します。これは HurtPlayer()
関数のコードの一部とほぼ同じであることから、このコードに見覚えがある方もいるかもしれません。‘fort_character' の transform
の取得にも必要なことから、ここで再度記述する必要があります。[]
で示されているように、失敗する可能性もあるため、失敗コンテキスト内に記述する必要があります。
前に作成した FirstPosition
変数を、FortniteCharacter.GetTransform()
によって返される値に設定します。この式は失敗する可能性があるわけではありませんが、前の 2 つの式のいずれかが失敗した場合にこの式の実行を防ぐため、同じ失敗コンテキスト内に記述します。
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
最初の 3 行は、最初の if
のコード ブロックとほぼ同じですが、FirstPosition
の代わりに SecondPosition
を設定している点が異なります。これで、2 つの場所を比較できるようになりました。
次に、DistanceBetweenPositions
を宣言して初期化します。これを取得するには、DistanceXY()
というビルトインの Verse 関数を使用します。これは 2 つの引数、どちらもベクターと呼ばれる 3D 空間内の座標を受け取ります。X 座標と Y 座標のみを使用して距離を測定し、その距離を float
として返します。2 つの 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 the damage amount would not eliminate the player, do that amount of damage
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# プレイヤーのヘルス値が低い場合は、もう一度チャンスを与えます
return PlayerHealth - MinHealth
else:
# プレイヤーを倒します
return PlayerHealth
次のステップ
基礎を理解したので、Unreal Editor for Fortnite で Verse を使用して独自の仕掛けを作成する準備ができました。 作成方法は以下のガイドをご確認ください。