

UEFNのVerse言語でシンプルなコードを作成する方法について教えてください!

初心者向けにわかりやすく解説してほしいですね!
こんなお悩みを解決します。
本記事の内容この記事を書いている僕は、金融系専門卒の投資家兼ブロガーです。実際にUEFNを使っており、現在進行形で学んでいます。
今回は、UEFNのVerseでシンプルなコードを作成する方法を解説します。
さっそく、やっていきましょう。

コード コメントとは

コードコメントとは、自身が作った作業やその理由に関するメモを、コードの一部ではないコメントとして残すことを指します。
これらのコメントは実行時は無視されますが、プログラマーのメモである「コードコメント」または単に「コメント」と呼ばれるものは、コード内に保持されます。
以前に行った作業の背景や理由を理解したい場合などに活用されます。
自身とは別のプログラマーがコードを見る際にも役立ちますね。

コメントを記述する最も簡単な方法は、「#」をコメントの前に追加することですが、他にも様々な方法が存在します。
コメントを記述する方法1+2 # こんにちは | 単一行のコメント: # から行末までの間にあるものはすべて、コード コメントの一部となります。 |
1<# インライン コメント#>+2 | インラインのブロック コメント: # から行末までの間にあるものはすべて、コード コメントの一部となります。 インラインのブロック コメントは、単一行の式の間に入れることができ、それぞれの式の動作は変わりません。 |
1<# インライン コメント#>+2 | 複数行のブロック コメント: <# から #> までの間にあるものすべてがコード コメントの一部になります。 複数行のブロック コメントでは、複数行にまたがってコメントを記述できます。 |
<# ブロック コメントはネスティングできます<# like this #> #> | ネストしたブロック コメント: <# から #> までの間にあるものすべてがコード コメントの一部になり、それをネストすることができます。 これは、テストやデバッグを行う際に、既存のコード コメントを変更せずに、行内にある式をコメント アウトする場合に便利です。 |
<#> これは 複数行にまたがる 長めの説明です。 DoThis()# This expression is not part of the indented comment | インデントされたコメント: <#> の後に続く、4 つのスペース文字でインデントされた行すべてがコード コメントの一部になります。 4 つのスペース文字でインデントされていない最初の行はコード コメントではなくなり、コード コメントが終了します。 |
コードで条件式を使って判断する

続いて、コードで条件式を使って判断する方法を解説していきます。
「Verse初心者」で解説した if…else 式を使って条件式を作っていきます。
if式は「真偽」、つまり、成功or失敗、はいorいいえのどちらであるかを調べるときに活用します。

実際に動作を試してみましょう。
お題【疲れていますか?】
「はい(true)」であれば眠りにつき、答えが「いいえ(else)」であれば、遅くまで起きてアニメを見るとしましょう。
var Tired: logic = false
var WhatToWatch: string = “nothing”
if (Tired?):
set WhatToWatch = “your eyelids”
else:
set WhatToWatch = “cartoons”
Print(“You should watch {WhatToWatch}”)
# アニメを見るべきです
【引用:EpicGames、以下、同じ】
上記のコードでは、「いいえ(else)」を入力しています。

ネスト
ネスティングとは、ある構造の中に別の構造をネスト(入れ子)することです。
たとえば、if文の中に別のif文をネストしたり、ループ文の中に別のループ文をネストしたりすることができます。
if (Tired?):
set WhatToWatch = “your eyelids”
else:
set WhatToWatch = “cartoons”
上記のコードですと、if(Tired?):の行の下にある「set WhatToWatch = “your eyelids”」の行がインデントされています。
また、else:の行でも同じパターンが繰り返されていますね。
インデントとは、文章の行頭に空白を挿入して、先頭の文字を右に押しやることです。

ネストは1行のコードだけでなく、ブロック(複数行)のコードをネストすることもできます。
ネストされたコードは、その上にあるネスト元のコードのコンテキスト内でのみ実行されるということです。
複数の条件式を使う
Verse では、複数の条件を組み合わせて判断することができます。そのときに使うのが 判定演算子 と呼ばれる「and」と「or」です。
- and
- 両方の条件が true または成功でなければならないという意味
- or
- どちらか一方の条件が true または成功であればよいという意味
第一条件 | 演算子 | 第二条件 | 式全体 |
成功 | and | 成功 | 成功 |
成功 | and | 失敗 | 成功 |
失敗 | and | 失敗 | 失敗 |
成功 | or | 成功 | 成功 |
成功 | or | 失敗 | 成功 |
失敗 | or | 失敗 | 失敗 |
これらの演算子の働きを確かめるために、コードを変更してみましょう。
疲れているわけではなくても、明日が授業日ならば早く寝るべきかもしれません。
▼ SchoolTomorrow という変数を作り、or を使って両方の logic 変数をチェックします。
var Tired: logic = false
var SchoolTomorrow: logic = true
var WhatToWatch: string = “nothing”
if (Tired? or SchoolTomorrow?):
set WhatToWatch = “your eyelids”
else:
set WhatToWatch = “cartoons”
Print(“You should watch {WhatToWatch}”)
# まぶたに注意するべきです
Tired が false のままで、SchoolTomorrow
が true に設定されているため、この式は成立し、WhatToWatch は "your eyelids" に設定されます。
また、複数の条件を検証する別の方法もあります。
if …else if … else を使って、順番にチェックすることを書きます。
これは、最初の条件を検証し、前の条件が不成立だった場合に限り、次の条件を検証するということです。

翌日に授業がなくて、疲れていない場合はどうでしょうか?友人と映画を見るのも楽しいでしょう。コードを再び変更して、どのように動くか確かめましょう。
SchoolTomorrow
変数の値を変え、新しい変数 FriendsAvailable
を宣言します。
var FriendsAvailable : logic = true
set SchoolTomorrow = false
次に、友人の都合がよいかどうかをチェックするようにコードを更新しましょう。
ただ、『自分が疲れていないか、翌日に授業がない場合だけ』です。
if (Tired? or SchoolTomorrow?):
set WhatToWatch = "your eyelids"
else if (FriendsAvailable?):
set WhatToWatch = "a movie with your friends"
else:
set WhatToWatch = "cartoons"
上記のコードにより、疲れているか、授業がある日の前夜であれ場合にのみ、寝ることになります。
どちらかの答えが「いいえ」であれば、友人と映画を見に行くか、友人の都合が悪ければ家にいてアニメを見ることになりますね。
練習問題

「データを格納して使用する方法」で書いた魔法のポーションのコードに戻ります。
プレイヤーが回復ポーションを飲んだら回復コードを実行し、ダメージポーションを飲んだらダメージ コードを実行する必要があります。
最初にいくつかコードを書いてみる
ポーションの種類に関する質問に対応するために、PotionType
という新しい変数を作成して、種類を記録することが必要です。
# ポーションの種類を記録する変数
var PotionType: string = "heal"
PotionType変数を使用して、異なる文字列と等しいかを質問できるようになりました。
もしPotionTypeが「heal」と等しいか尋ねると、回答は「イエス」となります。
そして、回復のコードが実行されます。
# PotionTypeが "heal" と等しい場合、プレイヤーの体力を回復する
if (PotionType = "heal"):
set PlayerHealth = PlayerHealth + PotionHealAmount
if 文の条件式では、変数 PotionType
が "heal" と厳密に等しいかどうかを判定しています。
もし等しい場合は、””内のコードが実行されます。
具体的に、PlayerHealth(プレイヤーの体力)に PotionHealAmount(ポーションの回復量)を加える処理が行われる感じですね。

▼ 同じように、ダメージコードにもif文を追加してみましょう。
# ポーションがダメージタイプの場合、プレイヤーの体力を減少させる
if (PotionType = "damage"):
set PlayerHealth = PlayerHealth - PotionDamageAmount
もし PotionType
が "damage" と等しい場合は、PlayerHealth
から PotionDamageAmount
(ポーションによるダメージ量)を減らす処理が実行されます。
ただ、上記のままですと、プレイヤーがポーションで体力値を回復し続けることを止めることができません。
そこで、ifを使って制限をかけていきましょう。
▼ まず、float
型の新しい定数を宣言していきます。
MaxHealth
とし、100.0
に設定します。
# プレイヤーの最大体力値
MaxHealth: float = 100.0
上記のコードは、新しい float 型の定数 MaxHealth
を宣言しています。
MaxHealth
はプレイヤーの最大体力を表すものです。
初期値として 100.0 を設定しています。

ちなみに、float
である理由は、小数点(100.0)だからビット⚡

整数の場合は、int
を使用しましょう。
プレイヤーが回復ポーションを飲んだ際、もし PlayerHealth
の値が MaxHealth
を超えてしまうなら、PlayerHealth
を MaxHealth
に設定する必要があります。
# プレイヤーが回復ポーションを飲んだときに実行するコード
# 回復時にプレイヤーの体力値が MaxHealth の値を超えないのであれば、
# 全量を回復させます
if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
else:
set PlayerHealth = MaxHealth
上記のコードの条件式は2つの部分から成り立っています。
1つ目の条件は、PotionType が "heal" であること。2つ目の条件は、回復後の体力が最大体力を超えないことを確認しています。
【真(true)の場合】
もし条件式が真である場合、つまりプレイヤーが回復ポーションを飲み、回復後の体力が最大体力を超えない場合には、PlayerHealth
に回復ポーションの効果量である PotionHealAmount
を加えて、プレイヤーの体力を回復させます。
【偽(false)の場合】
しかし、もし条件式が偽である場合、つまり回復後の体力が最大体力を超える場合には、PlayerHealth
を MaxHealth
に設定して、プレイヤーの体力を最大値に制限します。
このように、条件に応じてプレイヤーの体力を回復させるか最大値に制限するかを決定することで、プレイヤーの体力が常に適切な範囲内に保たれるようになります。

ダメージコードは正常に動作しますが、さらなる改善を行うために、if ... else if ... else 文を使用することができます。
プレイヤーがダメージポーションを使用した場合、PlayerHealth が 0.0 以下になるかどうかを確認し、その結果に応じて適切な対応を取ります。
具体的には、以下のルールを適用します:
- もし PlayerHealth が 0.0 未満になる場合、それを防ぐために PlayerHealth を 1.0 に設定します。
- もし PlayerHealth が既に 1.0 の場合、さらなるダメージを与えずに PlayerHealth を 0.0 に設定します。
これにより、プレイヤーに過度なダメージを与えることなく、ダメージポーションの有害性を表現することができます。
改良したダメージコードは以下のとおり。
# プレイヤーがダメージ ポーションを飲んだときに実行するコード
# プレイヤーの体力値が MinHealth より大きく、PotionDamageAmount よりも小さい場合はプレイヤーを倒しません
# 体力値がすでに MinHealth 以下の場合はプレイヤーを倒します
if (PotionType = "damage" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
else if (PlayerHealth > MinHealth):
# プレイヤーの体力値が低い場合は、もう一度チャンスを与えます
set PlayerHealth = 1.0
else:
set PlayerHealth = 0.0
このコードによって、ダメージポーションの効果を適切に制御し、プレイヤーにバランスの取れたゲームプレイ体験を提供することができますね。
…バグを見つける
以下に、この演習のすべてのコードと、テストのために追加されたいくつかのPrint()関数呼び出しを示します。
このコードを実行してみて、バグを見つけてください。Print()呼び出しは自由に変更して構いません。
PotionType変数が初期値"heal"に設定されているため、回復コードのみが実行されることが期待されます。
MaxHealth: float = 100.0
MinHealth: float = 1.0
var PotionType: string = "heal"
# プレイヤーが回復ポーションを飲んだときに実行するコード
# 回復時にプレイヤーの体力値が MaxHealth の値を超えないのであれば、
# 全量を回復させます
if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# else の場合は PlayerHealth を MaxHealth に設定します
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# プレイヤーがダメージ ポーションを飲んだときに実行するコード
# プレイヤーの体力値が MinHealth より大きく、PotionDamageAmount よりも小さい場合はプレイヤーを倒しません
# 体力値がすでに MinHealth 以下の場合はプレイヤーを倒します
if (PotionType = "damage" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# プレイヤーの体力値が低い場合は、もう一度チャンスを与えます
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
# プレイヤーを倒します
set PlayerHealth = 0.0
Print("Player eliminated!")
# プレイヤーが回復ポーションを飲んだときに実行するコード
# 回復時にプレイヤーの体力値が MaxHealth の値を超えないのであれば、
# 全量を回復させます
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# PlayerHealth を MaxHealth に設定します
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# プレイヤーがダメージ ポーションを飲んだときに実行するコード
# プレイヤーの体力値が MinHealth より大きく、PotionDamageAmount よりも小さい場合はプレイヤーを倒しません
# 体力値がすでに MinHealth 以下の場合はプレイヤーを倒します
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# プレイヤーの体力値が低い場合は、もう一度チャンスを与えます
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
# プレイヤーを倒します
set PlayerHealth = 0.0
Print("Player eliminated!")
以上、完了です。
お疲れ様でした🍵

(今回は難易度高めでしたね、、、本当にお疲れ様でした。)
まとめ

今回は、シンプルなコードを作成する方法について解説しました。
今回のまとめ- コードコメントは、プログラムの特定の方法や実行された手順の理由を他の開発者が理解できるように記述します。
- 定数は、プログラム全体で不変な値に使われます。
- 変数は、入力に応じて変化する値に使われます。
- バグやコンパイルエラーは、コード内の誤りによって発生します。
また、今回の演習で扱ったコードは以下のとおりです。
完全なスクリプトusing { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "heal"
set PlayerHealth = 80.0
# プレイヤーが回復ポーションを飲んだときに実行するコード
# 回復時にプレイヤーのヘルス値が MaxHealth の値を超えないのであれば、
# 全量を回復させます
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# else の場合は PlayerHealth を MaxHealth に設定します
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# プレイヤーがダメージ ポーションを飲んだときに実行するコード
# プレイヤーのヘルス値が MinHealth より大きく、PotionDamageAmount よりも小さい場合はプレイヤーを倒しません
# ヘルス値がすでに MinHealth 以下の場合はプレイヤーを倒します
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# プレイヤーのヘルス値が低い場合は、もう一度チャンスを与えます
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
set PlayerHealth = 0.0
Print("Player eliminated!")
Print("PlayerHealth now {PlayerHealth}")
次回は、関数の呼び出し方をやっていきます。
少し休憩してから、またがんばっていきましょう👊
>> 【2023年最新版】UEFNのVerseで関数を呼び出す方法
-
-
【2023年最新版】UEFNのVerseで関数を呼び出す方法
続きを見る
※参考文献:Epic Games