前のレッスン では CalculateDamage()
の優れた開始点となる関数を作成しましたが、その関数ボディにはパラメータにすればさらにうまく機能する定数と変数が含まれています。この関数は次のとおりです。
CalculateDamage() : float =
MinHealth : float = 1.0
PotionDamageAmount : float = 80.0
var PlayerHealth : float = 100.0
# ダメージ量によってプレイヤーが倒れない場合は、そのダメージ量を実行します
if (PlayerHealth > PotionDamageAmount):
return PotionDamageAmount
else if (PlayerHealth > MinHealth):
# プレイヤーのヘルス値が低い場合は、もう一度チャンスを与えます
return PlayerHealth - MinHealth
else:
# プレイヤーを倒します
return PlayerHealth
ここで修正を加える関数では次の 3 つのパラメータを使用します。
PlayerHealth
:プレイヤーの現在のヘルス値DesiredDamageAmount
:プレイヤーに対して与えられるダメージの最大量MinHealth
:DesiredDamageAmount
によってヘルス値が0.0
以下に減少される場合の、プレイヤーのヘルス値
以下に一致するように関数を更新します。
CalculateDamage(PlayerHealth : float, DesiredDamageAmount : float, MinHealth : float) : float =
# ダメージ量によってプレイヤーが倒れない場合は、そのダメージ量を実行します
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# プレイヤーのヘルス値が低い場合は、もう一度チャンスを与えます
return PlayerHealth - MinHealth
else:
# プレイヤーを倒します
return PlayerHealth
おつかれさまでした! これでこの関数が、プレイヤーに与えられるダメージを関数内で宣言された変数と定数を使用してではなく、3 つのパラメータを使って計算するようになりました。
現時点で、HurtPlayer()
内の CalculateDamage()
への呼び出しにおいて ()
に 赤色の波線 が表示されることがありますが、これは、3 つのパラメータを必須とするように CalculateDamage()
の宣言を更新した一方で、CalculateDamage()
への呼び出しに引数をパスしていないことが原因です。 以下の手順でこれを修正します。
-
PlayerHealth
の引数をCalculateDamage()
にパスする前に、キャラクターの現在のヘルス値を知る必要があります。これにはGetHealth()
メソッドを使用します。Damage()
およびHeal()
と同様に呼び出しますが、HurtPlayer()
関数内に保存する必要がある値が返されます。HurtPlayer() : void = Playspace : fort_playspace = GetPlayspace() AllPlayers : []player = Playspace.GetPlayers() if (FirstPlayer : player = AllPlayers[0]): if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): MyCharacterHealth : float = FortniteCharacter.GetHealth() DamageToDo: float = CalculateDamage() Print("DamageToDo: {DamageToDo}") FortniteCharacter.Damage(DamageToDo)
-
CalculateDamage()
の 2 番目のパラメータについては、HurtPlayer()
からのパラメータが必要になります。そのパラメータを今から作成します。DamageAmount
というfloat
パラメータを追加します。HurtPlayer()
は次のようになるはずです。HurtPlayer(DamageAmount : float) : void = Playspace: fort_playspace = GetPlayspace() AllPlayers: []player = Playspace.GetPlayers() if (FirstPlayer : player = AllPlayers[0]): if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): MyCharacterHealth : float = FortniteCharacter.GetHealth() DamageToDo : float = CalculateDamage() Print("DamageToDo: {DamageToDo}") FortniteCharacter.Damage(DamageToDo)
-
CalculateDamage()
に追加する 3 つの引数がすべて準備できました。PlayerHealth
パラメータ のためのMyCharacterHealth
DesiredDamageAmount
パラメータ のためのDamageAmount
MinHealth
パラメータ のための1.0
HurtPlayer()
は次のようになり、エラーは生じなくなるはずです。
HurtPlayer(DamageAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Damage To Do: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
HurtPlayer()
を数回呼び出して、プレイヤーのヘルス値に応じた異なるエフェクトを確認します。
HealPlayer()
関数はどうでしょうか?パラメータの使用方法がわかったので、これを更新する方法を考えましょう。
便利なメソッドがもう一つあります。これは SetMaxHealth()
という名前で、Damage()
、Heal()
、GetHealth()
と同様に呼び出されます。SetMaxHealth()
と、パラメータと関数に関してあなたが知っているすべての知識を活用して、HealPlayer()
関数を更新できるかどうか試してみてください。プレイヤーは何が面白いと感じるのか、または何が楽しいと感じるのかについて考えましょう。
完全なスクリプト
using { /Fortnite.com/Devices}
using { /Fortnite.com/Characters}
using { /Fortnite.com/Playspaces}
using { /Verse.org/Simulation}
using { /Verse.org/Verse}
hello_world_device := class(creative_device):
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends>:void=
HurtPlayer(80.0)
Print("Player Hurt")
CalculateDamage(PlayerHealth : float, DesiredDamageAmount : float, MinHealth : float) : float =
# ダメージ量によってプレイヤーが倒れない場合は、そのダメージ量を実行します
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# プレイヤーのヘルス値が低い場合は、もう一度チャンスを与えます
return PlayerHealth - MinHealth
else:
# プレイヤーを倒します
return PlayerHealth
HurtPlayer(DamageAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
FortniteCharacter.Damage(DamageToDo)
Print("{DamageToDo} damage dealt to player")
HealPlayer(HealAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
FortniteCharacter.Heal(HealAmount)