

UEFNのVerse言語でデータを格納して使用する方法について教えてください!

初心者向けにわかりやすく解説してほしいですね!
こんなお悩みを解決します。
本記事の内容この記事を書いている僕は、金融系専門卒の投資家兼ブロガーです。実際にUEFNを使っており、現在進行形で学んでいます。
今回は、UEFNのVerseでデータを格納して使用する方法を解説します。
※VERSEの基本操作マニュアルについては、『【初心者向け】FortniteのVerseの基本【Creative2.0】』で解説していますので、参考にどうぞ。
さっそく、やっていきましょう。

もくじ
可変と不変

プログラムを実行するには、「情報」や「値」などのデータが必要です。
ゲームのスコアやプレイヤーの名前などがデータの例ですね。
そんなデータのパフォーマンスやセキュリティ、保守性を向上させるには、以下のように分離させる必要があります。
順番に解説していきますね。
可変
可変 (mutable) とは、変わることができるという意味です。
この言葉は、英語の "mutant"(突然変異によって変化したもの)と同じ語源を持っています。
植物は種から始まり、時間とともに成長して変化し、新しい枝や葉が生え、花が咲きます。
外部の条件や栄養状態によって成長が影響を受けるため、植物は「可変」であるといえますね。
時間の経過とともに変更されるデータが「可変」です。

不変
不変 (immutable) とは、変わることができないことを意味します。
天空に輝く星々は、長い年月を経ても位置関係が変わらないため、不変であるといえます。
※ただし、実際には宇宙の動きや地球の回転によって微妙に変化することもありますが、人間の観察においては不変と見なせるでしょう。
これらの例えから分かるように、不変性は変化しない特性を指します。

データやオブジェクトが不変である場合、その値や状態を変更することができません。
不変性は、データの安定性や信頼性を高める一方で、プログラムの安全性や予測性を向上させる役割を果たします。
変数と定数

続いて、変数と定数について解説していきます。
プログラミングでは、データを保管するために「変数」と「定数」というものを使います。
プログラムがどの処理をするかを判断するためには、データが必要ですね。
そのため、コンピュータはコード内の「変数」と「定数」に保存されたデータを使って計算や判断を行います。

「変数」という言葉は、変数と定数の両方を含む意味で使われることもありますが、重要な違いがあります。
変数はプログラムが実行されている間に値を変えることができますが、定数の値は変更できません。

つまり、変数の値は変わる可能性があるけれども、定数の値は変わらないということですね!
変数と定数の構文
結論からいうと、変数と定数の構文の唯一の違いは、「var」の有無です。
基本構文は以下のとおりです。
変数
var name : type = value
定数
name : type = value
変数の冒頭にある「var」は、変数であることを示しています。

さらに構文を細かく分けると、以下のようになります。
name | 変数・定数に(プログラマーが)名前を付ける |
type | 変数の値を使って行える動作 いわゆる、型の設定である |
value | 変数・定数の初期値の設定 定数は必ず初期値を設定する必要があります。 |
識別子
識別子は、プログラム内で使われる独自の名前です。
識別子とname(名前)は同じ意味で使われます。
命名規則
変数や定数を作るときには、以下の命名規則に気をつけましょう。
- 識別子の最初の文字は、文字またはアンダースコア (_) のどちらかを使う
- 変数の名前は他の人が読みやすいように一貫性を持たせると良い。(他の人もコードを理解しやすくなるから)
- 最初の文字の後には、文字、数字、またはアンダースコアを使うことができる
- 名前には複数のアンダースコアを使ってもOK
- 変数や定数の識別子にはスペースを含めることはできない
- 変数や式の名前は、「その動作を表すもの」にすることが推奨される
変数や定数の名前を決めるときには、上記のルールに従って適切な名前をつけるようにしましょう。

変数を宣言する
変数や定数は、それぞれ名前(識別子)、格納できる値の種類(型)、そして値そのものの3つの要素で構成されています。
例えば、マウスを捕まえるためのコインを表す変数を作成する場合、以下のような宣言を行います。
var Coins : int = 500
上記の宣言では、「Coins」という名前の変数を作成し、その型を「int(整数)」と指定しています。
そして、値として「500」という数値を格納していますね。
変数を宣言する際には、名前をコロン(:)の前、型をコロンと等号(:=)の間に、そして値を等号(=)の後に書きます。
これによって、プログラム内で変数を使用して値を保持したり操作したりすることができるわけですね。
例えば、上記の変数「Coins」を使ってマウスを捕まえるためのコインの数を増減させたり、他の計算に利用したりすることができます。
つまり、変数や定数は、名前と型、そして値の3つの要素から成り立っており、それぞれの要素を正しく指定することでデータを扱うことができるわけです。

初期化
初期化とは、定数(または式)に初期値を設定することを意味します。
初期値を設定することによって、定数はプログラムの実行中にその値を変えることなく一定のまま維持されます。
例えば、以下のコードを考えてみましょう。
var score: int = 100
このコードでは、変数「score」を宣言しています。
変数の型は「int(整数)」と指定されており、初期値として「100」という値が設定されていますね。

これによって、プログラム内で「score」という変数を使用する際には、最初の値として「100」が割り当てられます。
この初期値を設定することで、プログラムの実行中に「score」の値が変化する可能性があっても、最初に指定した「100」という値から始まることが保証されます。
例えば、後で以下のように値を変更することもできます。
score = 200
この場合、変数「score」の値は最初の初期値の「100」から「200」に変更されます。
ただ、初期化は変数を最初に設定するためのものであり、変数を宣言した後に初期値を指定する必要があります。

整数型の場合、初期値は整数(例えば「100」や「0」など)である必要があります。
初期値は変数の値を初めて使用する前に設定されるため、プログラムが正しく動作するためには適切な初期値の設定が重要です。
定数と変数を使った練習

先述解説した定数と変数の練習問題をしていきましょう。
参考:Epic Games
以下は例の問題です。
【魔法のポーションを使ったゲーム】
ポーションには、プレイヤーの体力を回復させたり、減少させたり、その他の効果を与えたりするさまざまな効果があります。
プレイヤーの体力や、ポーションによるダメージ、回復量を格納する定数や変数を宣言し、初期化していきましょう。

var PlayerHealth: float = 100.0
PotionDamageAmount: float = 20.0
PotionHealAmount: float = 10.0
【引用:EpicGames、以下同じ。】
ゲーム中では、プレイヤーの体力値は使用するポーションによって変動する可能性があります。
体力値が変化する場合は、それを「変数」として考えましょう。
一方、ポーションが与えるダメージや回復の量はゲーム中に変更する必要があまりないため、これらは「定数」として宣言しましょう。
文字列定数と文字列変数を宣言して初期化
もし、PlayerHealth変数を変更するコードを書く場合、その結果を確認するためにはログに出力する必要があります。
そのために、以下の文字列定数と文字列変数を宣言して初期化します。
※ログとは、プログラムの実行中に発生したイベントを記録したものです。例えば、プログラムの実行時間や実行したコマンド、エラーメッセージなどが表示されます。
文字列の終わりと最後の「"」の間にはスペースを入れることを忘れないでください。

PlayerStatusText: string = "Player health now "
var EffectOnPlayerText: string = "damaged "
上記の出力により、プレイヤーの体力値を変更する準備ができました。
PotionDamageAmount を PlayerHealth から減算する必要があるため、- 演算子を使用しましょう。
set PlayerHealth = PlayerHealth - PotionDamageAmount
変数の値を変更するには、式の最初に set というキーワードを使用する必要があります。

PlayerHealth が変化したら、以下に示す Print() の呼び出しを行いましょう。
(変化を確認しよう。)
Print("The Player was {EffectOnPlayerText + ToString(PotionDamageAmount)}")
Print("{PlayerStatusText + ToString(PlayerHealth)}")
プログラミングで「+」演算子は、数値を足すだけでなく、文字列を連結する(つなげる)こともできます。
この+演算子で組み合わせることを『結合』といいます。

また、ToString() 関数は、数値を文字列に変換する関数です。
文字列に変換された数値は、計算に使用することができないことを覚えておきましょう。
これで、上述したコードを実行すると、以下の新しい行が表示されるはずです。
The Player was damaged 20.0
Player health now 80.00
上記が問題なく表示されたら、同じことを PotionHealAmount でやってみましょう。
PotionHealAmount Ver.
▼ キーワードと演算子を使って PlayerHealth を変更します。
set PlayerHealth = PlayerHealth + PotionHealAmount
▼ また、 EffectOnPlayerText 変数を変更して、出力されたときに意味が分かるようにします。
set EffectOnPlayerText = "healed "
▼ 最後に、プレイヤーの体力値がどのように変化したか、そして現在の体力値を出力していきましょう。
Print("The Player was {EffectOnPlayerText + ToString(PotionHealAmount)}")
Print("{PlayerStatusText + ToString(PlayerHealth)}")
以上、練習問題は終了です。
お疲れ様でした🍵

まとめ

今回は、データの格納方法について解説しました。
今回のまとめ- 変数 と 定数 はいずれも 値の格納 に使用される
- これら 2 つの最大の違いは、定数の値は変更不可なのに対し、変数の値は変更可能な点
- 変数と定数は、それぞれ 評価 時に 結果を生成する 式
- 変数と定数を 宣言するには、式にユニークな名前もしくは 識別子、型、値 を指定する
- 式に初期値を設定する処理は 初期化 と呼ばれる
また、今回の演習で扱ったコードは以下のとおりです。
完全なスクリプトusing { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# 実行中のゲームで仕掛けが開始した時に実行します
OnBegin<override>()<suspends> : void =
PotionDamageAmount : float = 20.0
PotionHealAmount : float = 10.0
var PlayerHealth : float = 100.0
PlayerStatusText : string = "Player health now "
var EffectOnPlayerText: string = "damaged "
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("The Player was {EffectOnPlayerText + ToString(PotionDamageAmount)}")
Print("{PlayerStatusText + ToString(PlayerHealth)}")
set PlayerHealth = PlayerHealth + PotionHealAmount
set EffectOnPlayerText = "healed "
Print("The Player was {EffectOnPlayerText + ToString(PotionHealAmount)}")
Print("{PlayerStatusText + ToString(PlayerHealth)}")
次回は、シンプルなコードを作成していきます。
お互いがんばりましょう。🐬
>> 【2023年最新版】UEFNのVerseでシンプルなコードを作成する方法
-
-
【2023年最新版】UEFNのVerseでシンプルなコードを作成する方法
続きを見る
※参考文献:Epic Games