

カスタム仕様のカウントダウンタイマーの作り方について教えてください!

初心者向けにわかりやすく解説してほしいですね!
こんなお悩みを解決します。
本記事の内容この記事を書いている僕は、クリエイター兼ブロガーです。実際にUEFNを使っており、現在進行形で学んでいます。
今回は、カスタム仕様のカウントダウンタイマーについて解説します。
なお、以下のコードの解説文は、プログラミング初心者の主がなんとか調べて記述したものです。
参考程度にどうぞ。

誤りがありましたら恐縮ですm(_ _)m
使用するVerse言語機能

・if (条件):
if 式は条件をテストし、失敗する 可能性のある値にアクセスします。
・block (ブロック):この例では、カウントダウン タイマーが作成された場合に UI を 初期化する ために block 式を使用しています。
・loop (ループ):loop 式は UI を更新し、カウントダウンがゼロになると終了します。
・spawn (スポーン):spawn 式は任意の コンテキスト で 非同期式 を開始します。
・message (メッセージ):メッセージ タイプはテキストをローカライズできることを意味し、メッセージ変数の初期化に使用する文字列は、メッセージのデフォルトのテキストと言語です。
・class (クラス):この例では、カウントダウンを管理、表示する Verse クラスを作成します。
・constructor (コンストラクタ):コンストラクタは、関連付けられているクラスのインスタンスを作成する特別な関数です。
・Access specifier (アクセス指定子):アクセス指定子を使用してコードのアクセス レベルを設定できます。
公式ドキュメント
使用するVerse API

・Sleep (スリープ):
Sleep() API を使用することにより、UI の更新間隔を選択できます。
・Event (イベント):Verse で独自のイベントを作成し、イベントの発生時にカスタム仕様の機能を追加できます。
・Verse UI:プレイヤーとゲームに関する情報を表示するカスタム仕様のインゲーム UI を作成します。
公式ドキュメント
カスタム仕様のカウントダウンタイマーのVerse言語

これはカウントダウンタイマーゲームのスクリプトです。
このスクリプトは、ボタンが押されるたびにカウントダウンタイマーに追加の時間を加え、カウントダウンが終了するとゲームを終了する動作を行います。
▼ 下記のコードはカウントダウンタイマーを作成するためのカスタム仕様のコードです。
この部分では、使用するモジュールをインポートしています。これにより、UI、数学的な演算、Fortnite ゲームの UI、および色に関連する機能を利用できるようになります。
- Verse モジュールのインポート:
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Fortnite.com/UI }
using { /Verse.org/Colors }
countdown_timerのクラス定義
▼ 下記のコードは、カウントダウンタイマーを表すcountdown_timer
クラスの定義です。
- クラスの定義と変数の追加:
countdown_timer := class:
MaybePlayerUI : ?player_ui = false
var RemainingTime : float = 0.0
var Canvas : canvas = canvas{}
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
# countdown_timer クラスを定義
countdown_timer := class:
# プレイヤーの UI の存在を表すオプション型の変数を定義
MaybePlayerUI : ?player_ui = false
# カウントダウンの残り時間を表す変数を定義
var RemainingTime : float = 0.0
# キャンバスウィジェットを表す変数を定義
var Canvas : canvas = canvas{}
# テキストブロックウィジェットを表す変数を定義し、デフォルトのテキスト色を白色に設定
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
# 残り時間を表すメッセージを返す関数を定義。ローカライズに対応
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
クリックすると開きます。
countdown_timer := class:
クラスcountdown_timer
の定義を開始します。
MaybePlayerUI : ?player_ui = false
オプションのプレイヤーUIを表すMaybePlayerUI
変数を宣言し、デフォルト値をfalse
に設定しています。
この変数は、プレイヤーのUIを制御するために使用されます。
var RemainingTime : float = 0.0
浮動小数点数の変数RemainingTime
を宣言し、デフォルト値を0.0
に設定しています。
この変数は、カウントダウンの残り時間を保持します。
var Canvas : canvas = canvas{}
canvas
型の変数Canvas
を宣言し、canvas{}
で初期化しています。
この変数は、UI要素を配置するためのキャンバスを表します。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
text_block
型の変数RemainingTimeWidget
を宣言し、text_block{DefaultTextColor := NamedColors.White}
で初期化しています。
この変数は、カウントダウンの残り時間を表示するテキストブロックです。デフォルトのテキスト色は白です。
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
RemainingTimeText
という名前の関数を定義しています。
この関数は、引数CurrentRemainingTime
を受け取り、その値を文字列として返します。具体的には、"{CurrentRemainingTime}"
という形式の文字列が返されます。
インスタンスが作成されていない理由
クリックすると開きます。
countdown_timer := class:
MaybePlayerUI : ?player_ui = false
var RemainingTime : float = 0.0
var Canvas : canvas = canvas{}
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
上記のコードでは、countdown_timer
というクラスが定義されていますが、実際のインスタンス化は行われていません。
これは、クラス自体がまだ設計途中であり、完全な形で定義されていないためです。
クラスは、オブジェクトの設計図やテンプレートのようなものであり、それ自体は実体を持ちません。
インスタンスとは、クラスの設計図を基に作られた具体的なオブジェクトのことです。
インスタンス化とは、クラスをもとに新しいインスタンスを作成することを指します。
まとめると、上記のコードはcountdown_timer
クラスの定義が不完全なままであり、インスタンス化するための具体的なコードが示されていない可能性があると言えます。
クラスの設計とインスタンスの作成を行うためには、さらなるコードの追加や設計の完了が必要です。
オブジェクトのクラス(設計図)を作っている段階だよ。ということです。

var RemainingTime : float = 0.0の詳細
クリックすると開きます。
var RemainingTime : float = 0.0
この行は、クラス内にあるRemainingTime
という名前の変数を宣言しています。
変数は値を格納するための箱のようなもので、ここでは浮動小数点数(float)の値を格納することができます。
具体的には、RemainingTime
変数は0.0で初期化されています。
初期化とは、変数に最初の値を与えることを意味します。ここでは、RemainingTime
変数に最初の値として0.0を設定しています。
浮動小数点数は、小数点以下の桁数を持つ数値を表現するためのデータ型です。
例えば、1.5や3.14などが浮動小数点数の値ですね。
float
は浮動小数点数を表すためのキーワードであり、メモリ上で特定のサイズを持つ浮動小数点数の変数を宣言するために使用されます。
このコードでは、RemainingTime
変数はクラス内のメンバ変数として宣言されています。
これは、countdown_timer
クラスのインスタンスごとに独立して存在する変数であり、そのインスタンスに関連付けられたデータを保持する役割を果たします。
つまり、countdown_timer
クラスのインスタンスが作成されると、そのインスタンスごとにRemainingTime
変数が存在し、初期値として0.0が設定されます。この変数は、後で必要に応じて変更や利用が可能です。
プログラミング初心者の方にわかりやすく説明すると、var RemainingTime : float = 0.0
は、「RemainingTimeという名前の箱を作って、その初期値を0.0に設定する」という意味です。
この箱はcountdown_timer
クラスの一部であり、クラスのインスタンスごとにそれぞれの箱が存在します。
この行の目的は、RemainingTime
という名前の変数を作成し、その初期値を0.0に設定することです。
変数は、プログラム内でデータを一時的に格納するための入れ物のようなものです。データを格納することで、そのデータを後で取得したり操作したりできます。
RemainingTime
という変数は、残り時間を表すために使用されると想像されます。
例えば、ゲーム内のカウントダウンタイマーなど、時間の経過を追跡する必要がある場面で使用されるかもしれません。
初期値の設定は、変数が最初に作成されたときに持つ値を指定するものです。
ここでは、float
というデータ型を使用しているため、小数点以下の桁数を持つ数値を表現できます。
初期値を0.0に設定することで、最初に変数が作成されたときは残り時間が0.0であることを意味します。
初期値の設定は、変数を使用する前に値が設定されていることを保証するために重要です。
これにより、プログラムの他の部分で変数を使用する際に、初期値が設定されていないエラーや予期しない動作を避けることができます。
まとめると、var RemainingTime: float = 0.0
は、残り時間を表すための変数RemainingTime
を作成し、初期値を0.0に設定することで、変数の使用準備を整えるという意味を持ちます。
var Canvas : canvas = canvas{}の詳細
クリックすると開きます。
▼ この行は、Canvas
という名前の変数を宣言し、その型をcanvas
としています。
変数は、データを格納するための箱のようなもので、ここではcanvas
という特定の型のデータを格納するための箱を作成しています。
var Canvas : canvas = canvas{}
canvas
は、ウィンドウや画面上に要素を配置するためのグラフィカルなコンテナです。
具体的には、UI要素やテキスト、イメージなどを表示するための領域を提供します。
初期化の部分では、canvas{}
という構文が使用されています。
これは、canvas
型のオブジェクトを新しく作成するという意味です。{}
の中には、作成されるcanvas
オブジェクトの初期設定を記述することができます。
このコードでは、空のcanvas
オブジェクトが作成され、Canvas
変数に格納されています。
具体的には、Canvas
変数はcanvas
オブジェクトへの参照を持ち、そのオブジェクトを操作するために使用されます。
意義と記述理由については、このコードではカウントダウンタイマーのUIを表示するためにキャンバスが使用されていると考えられます。
キャンバスはUI要素を配置するコンテナであり、Canvas
変数によってそのコンテナを参照することができます。
キャンバスとは、2Dグラフィックスを描画するための領域です😌

また、初期化の部分で空のcanvas
オブジェクトが作成されているのは、カウントダウンタイマーのUIを後で追加するための準備をしているからです。
この空のキャンバスを後で具体的なUI要素で構成して、カウントダウンタイマーの見た目や配置を設定することができます。
要するに、var Canvas: canvas = canvas{}
は、カウントダウンタイマーのUIを表示するためのキャンバスを作成し、それをCanvas
変数に格納するためのコードです。
この変数を通じて、カウントダウンタイマーのUIの設定や表示に関する操作を行うことができます。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}の詳細
クリックすると開きます。
▼ この行は、「RemainingTimeWidget」という名前のテキストウィジェットを定義しています。
テキストウィジェットは、テキストを表示するためのUI要素です。
具体的には、文字列や数字などの情報をユーザーに表示するために使用されます。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
意義
- テキストウィジェットの作成:
text_block{}
という構文を使用して、新しいtext_block
オブジェクトを作成しています。- これにより、テキストウィジェットを表す変数が作成されます。
- テキストウィジェットの初期設定:
text_block{}
の中には、テキストウィジェットの初期設定が記述されます。- ここでは、
DefaultTextColor := NamedColors.White
という設定が行われています。 - この設定は、テキストウィジェットのデフォルトのテキスト色を白に設定しています。
意義としては、カウントダウンタイマーのUIにおいて、RemainingTimeWidget
という名前のテキストウィジェットが使用されることが想定されます。
このウィジェットは、残り時間の表示に使用されるテキストを表示する役割を持ちます。
記述理由としては、テキストウィジェットの初期設定を行っているためです。デフォルトのテキスト色を白に設定することで、カウントダウンタイマーのUIで表示されるテキストの見た目を調整しています。
白いテキストは、一般的には目立ちやすく読みやすいため、情報を明確に伝えるのに適しています。
つまり、RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
は、カウントダウンタイマーのUIに使用される「RemainingTimeWidget」という名前のテキストウィジェットを定義し、その初期設定としてデフォルトのテキスト色を白に設定していることを意味します。
これにより、カウントダウンタイマーのUIで残り時間を視覚的に表示するためのテキストウィジェットが準備されます。
計算式の論理以下のコード行を見ていきましょう。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
この行は、RemainingTimeWidget
という名前のtext_block
(テキストブロック)型の変数を宣言し、右辺の式で初期化しています。
text_block
は、UI上でテキストを表示するためのウィジェット(部品)です。このウィジェットには様々なプロパティや設定がありますが、ここではDefaultTextColor
というプロパティを設定しています。
このプロパティは、テキストのデフォルトの色を指定するためのものです。
具体的には、DefaultTextColor := NamedColors.White
という式が使われています。この式では、NamedColors.White
という定数を使用して、テキストの色を白に設定しています。
NamedColors.White
は、あらかじめ定義された色の一部であり、白色を表す値です。
したがって、RemainingTimeWidget
は、デフォルトのテキスト色が白色に設定されたtext_block
ウィジェットを表しています。このウィジェットはカウントダウンタイマーの残り時間を表示するために使用されます。
初心者の方にわかりやすく説明すると、RemainingTimeWidget
はカウントダウンタイマーのUI部品であり、テキストの色を白に設定しています。これにより、カウントダウンの残り時間が白色のテキストで表示されることになります。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
<localizes>という表記は、テキストのローカライズ(言語切り替え)のために使用されるマークアップです。
ローカライズは、ゲームやアプリケーションを異なる言語に対応させるプロセスです。ユーザーが利用する言語に基づいて、テキストやメッセージを適切な言語に変換することができます。
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
というコードでは、RemainingTimeText
という関数が定義されており、<localizes>
が関数の宣言に付加されています。これは、関数のテキストをローカライズ可能なメッセージとしてマークアップすることを意味します。
具体的には、"{CurrentRemainingTime}"
というメッセージ文字列が使用されています。この文字列は、CurrentRemainingTime
という変数を文字列中に埋め込むためのプレースホルダとして機能します。
ローカライズされたメッセージは、異なる言語に対応するために、このプレースホルダを適切な言語に置き換えることができます。
例えば、英語の場合は"{CurrentRemainingTime}"
がそのまま表示されますが、別の言語に切り替えると、"{CurrentRemainingTime}"
が翻訳されたメッセージに置き換わる可能性があります。
つまり、RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
のは、この関数がテキストのローカライズに対応していることを示しています。
この関数は、異なる言語に対応したテキストメッセージを生成するためのマークアップとして使用されています。
DefaultTextColor := NamedColors.Whiteの論理 RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
DefaultTextColor := NamedColors.White
の部分は、text_block
ウィジェットの初期設定を行うためのコードです。
DefaultTextColor
は、text_block
ウィジェットのプロパティであり、テキストのデフォルトの色を指定します。NamedColors.White
は、あらかじめ定義された色の定数で、ここでは白色を表します。
:=
は、変数に値を代入するための演算子です。DefaultTextColor := NamedColors.White
という式は、DefaultTextColor
というプロパティにNamedColors.White
という値を代入しています。
つまり、このコードは、text_block
ウィジェットのデフォルトのテキスト色を白色に設定しています。
例えば、もしDefaultTextColor
が別の色である場合、このコードを使用することでデフォルトのテキスト色を白色に変更することができます。
DefaultTextColor := NamedColors.White
は、プロパティの初期値を設定する操作です。NamedColors.White
という色の定数をDefaultTextColor
に代入することで、テキストブロックの初期設定が行われます。
初心者の方にわかりやすく説明すると、DefaultTextColor := NamedColors.White
は、テキストブロックのデフォルトのテキスト色を白色に設定するためのコードです。テキストブロックのプロパティであるDefaultTextColor
に、定義済みの色であるNamedColors.White
を代入しています。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
ウィジェット(Widget)は、グラフィカルユーザーインターフェース(GUI)やユーザーインターフェース(UI)の一部を指すプログラミング用語です。
ウィジェットは、ユーザーインターフェースを構成する要素やコンポーネントのことを指します。ボタン、テキストボックス、チェックボックス、スライダーなどの要素は、すべてウィジェットと呼ばれます。
ウィジェットは、ユーザーが操作したり情報を表示したりするための機能を持っています。例えば、ボタンウィジェットはクリックされた時に特定のアクションを実行し、テキストウィジェットはテキストを表示・編集することができます。
プログラミングにおいては、ウィジェットはコード上で作成・設定・制御されます。UIフレームワークやライブラリでは、ウィジェットを使ってユーザーインターフェースを構築することができます。
ウィジェットは、ユーザーとの対話や情報の表示において重要な役割を果たしています。プログラム内でウィジェットを操作することで、ユーザーとのインタラクティブな体験や情報の可視化を実現することができます。
初心者の方にわかりやすく説明すると、ウィジェットは、ユーザーが操作したり情報を表示したりするためのGUI要素やコンポーネントです。ボタンやテキストボックスなど、ユーザーが見たりクリックしたりする部品のことを指します。
プログラム内でウィジェットを使ってユーザーインターフェースを作成し、ユーザーとの対話や情報の表示を行うことができます。
【さらに深掘り】
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
DefaultTextColor
は、text_block
ウィジェットのプロパティであり、テキストのデフォルトの色を指定します。
NamedColors.White
は、あらかじめ定義された色の定数で、ここでは白色を表しています。
具体的には、DefaultTextColor := NamedColors.White
は、text_block
ウィジェットのデフォルトのテキスト色を白色に設定しています。
ウィジェットのプロパティとは、ウィジェットが持つ設定や属性のことです。例えば、テキストブロックのプロパティにはテキストの色、フォントサイズ、配置などが含まれます。DefaultTextColor
はその中の一つで、デフォルトのテキストの色を指定するプロパティです。
:=
は、変数に値を代入するための演算子です。DefaultTextColor := NamedColors.White
という式は、DefaultTextColor
というプロパティにNamedColors.White
という値(ここでは白色)を代入しています。
したがって、このコードは、text_block
ウィジェットのデフォルトのテキスト色を白色に設定するための操作です。
プログラミング的な観点から言えば、DefaultTextColor := NamedColors.White
は、プロパティに値を代入してその設定を変更する操作です。
NamedColors.White
という色の定数をDefaultTextColor
プロパティに代入することで、テキストブロックのデフォルトのテキスト色が白色に変更されます。
初心者の方にわかりやすく説明すると、DefaultTextColor := NamedColors.White
は、テキストブロックのデフォルトのテキスト色を白色に設定するためのコードです。
テキストブロックのプロパティであるDefaultTextColor
に、定義済みの色であるNamedColors.White
を代入しています。
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
NamedColors
は、あらかじめ定義された色の一覧を表す機能やデータ構造のことを指します。このような一覧は、プログラミングのコンテキストでよく使用されます。
具体的には、NamedColors
は色を表す定数や列挙型の集合です。プログラミングフレームワークやライブラリで一般的に提供されており、開発者が簡単に一貫した色を使用できるようにするために用意されています。
例えば、NamedColors.White
は「白色」を表す定数であり、NamedColors.Red
は「赤色」を表す定数です。これらの定数は、色を使用する際に直接参照することができます。
NamedColors
は、色の指定を簡略化し、一貫性のあるカラーパレットを提供するために使用されます。開発者はこれらの定数を利用することで、特定の色を個別に定義する必要なく、あらかじめ定義された色を利用できます。
また、NamedColors
はプログラミングの可読性や保守性を向上させるのに役立ちます。定義済みの色を使用することで、色の名前だけで意図を明確に伝えることができます。
つまり、NamedColors
は、プログラミングにおいて一般的に使用されるあらかじめ定義された色の集合であり、開発者が簡単かつ一貫した色を利用できるようにする機能です。
色の指定=NamedColors

RemainingTimeとRemainingTimeWidgetの関係性
クリックすると開きます。
RemainingTimeとRemainingTimeWidgetは、カウントダウンタイマーのUIにおいて関連性を持つ要素です。
RemainingTimeは、実際の残り時間を表す変数です。この変数には浮動小数点数(float)の値が格納されます。
例えば、10.5や5.0などの値がRemainingTimeに割り当てられることがあります。
この変数は、カウントダウンタイマーの実際の時間を追跡し、更新されることで残り時間の変動を反映します。
一方、RemainingTimeWidgetは、カウントダウンタイマーのUI上で実際に時間を表示するためのテキストウィジェットです。
このウィジェットは、テキスト要素を表示するための特定の領域を提供します。
RemainingTimeWidgetには、テキストウィジェットの設定や表示内容が関連付けられています。
関係性としては、RemainingTimeの値が変化すると、その変化がRemainingTimeWidgetに反映されます。具体的には、RemainingTimeの値が更新されるたびに、RemainingTimeWidgetに表示されるテキストも更新されます。
たとえば、RemainingTimeが10.5になった場合、RemainingTimeWidgetには「10.5」というテキストが表示されます。
このような関係性により、RemainingTimeとRemainingTimeWidgetは連動して動作し、カウントダウンタイマーの実際の残り時間がUI上に表示されることになります。
RemainingTimeが変化するたびに、それがRemainingTimeWidgetに反映され、ユーザーは実際の時間の経過を見ることができます。
要するに、RemainingTimeは実際の残り時間を格納する変数であり、RemainingTimeWidgetはその時間を表示するためのUI要素です。
両者は関連付けられており、RemainingTimeの変化に応じてRemainingTimeWidgetが更新されることで、カウントダウンタイマーの時間を視覚的に表現する役割を果たします。
RemainingTimeText(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"の詳細
クリックすると開きます。
▼ このコードは、整数パラメータCurrentRemainingTime
を受け取り、それをRemainingTime
で表される値を表示するための「RemainingTimeText」という名前のメッセージを返す関数を定義しています。
RemainingTimeText
関数の追加:
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
以下のとおり。
- 関数の名前と引数:
RemainingTimeText
は関数の名前です。<localizes>
はローカライズ(多言語対応)を意味し、関数が言語や地域に依存せずに使えるようにするための指示です。CurrentRemainingTime : int
は引数であり、CurrentRemainingTime
という名前の整数型の引数を受け取ります。
- 関数の返り値:
: message
は関数の返り値の型を示しており、message
はメッセージ型を表しています。- 返り値の型は、関数が処理を実行した後に返す値のデータ型を指定します。
- 関数の処理:
= "{CurrentRemainingTime}"
は関数の処理部分です。- ここでは、引数の
CurrentRemainingTime
を文字列の中に埋め込んでいます。 {}
で囲まれた部分は、値が埋め込まれる場所を示しています。- つまり、この関数は引数で受け取った現在の残り時間をテキストメッセージとして表現したものを返します。
意義としては、カウントダウンタイマーのUIにおいて、現在の残り時間を表示するためのテキストメッセージを生成するために使用されることが想像されます。
RemainingTimeText
関数は、引数として渡された現在の残り時間をテキストメッセージに変換し、そのメッセージを返り値として返します。
記述理由としては、引数として渡される残り時間をテキストとして整形する必要があるためです。"{CurrentRemainingTime}"
という形式の文字列は、引数の値を埋め込んだテキストメッセージを作成するための表記方法です。
これにより、カウントダウンタイマーのUIにおいて、現在の残り時間を適切な形式で表示することができます。
つまり、RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
は、カウントダウンタイマーのUIにおいて、引数として渡された現在の残り時間をテキストメッセージに変換して返すための関数です。
これにより、カウントダウンタイマーのUIにおいて、現在の残り時間をテキストとして表示することができます。
計算式の論理RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
この行は、RemainingTimeText
という名前の関数を定義しています。この関数は、CurrentRemainingTime
という整数パラメータを受け取り、message
という型の値を返します。
message
は、文字列を表すデータ型です。この関数は、CurrentRemainingTime
の値を文字列として表現し、それをmessage
として返す役割を持ちます。
具体的には、"{CurrentRemainingTime}"
という文字列が使用されています。{}
で囲まれた部分は、変数や式を文字列中に埋め込むためのプレースホルダとして機能します。
ここでは、CurrentRemainingTime
という変数がプレースホルダになっており、実際の値で置き換えられます。
例えば、CurrentRemainingTime
が5であれば、"{CurrentRemainingTime}"
は"5"
という文字列に置き換えられます。
この関数の役割は、残り時間の数値を文字列として表現することです。例えば、残り時間が10の場合、RemainingTimeText(10)
の呼び出しは"10"
という文字列を返します。
プログラミング初心者の方にわかりやすく説明すると、RemainingTimeText
は、残り時間を文字列として表現するための関数です。CurrentRemainingTime
という数値を受け取り、その数値を文字列に変換して返します。
RemainingTimeとRemainingTimeWidgetとRemainingTimeTextの関係性
クリックすると開きます。
RemainingTimeは、実際の残り時間を表す変数です。
この変数には浮動小数点数(float)の値が格納されます。
例えば、10.5や5.0などの値がRemainingTimeに割り当てられることがあります。この変数は、カウントダウンタイマーの実際の時間を追跡し、更新されることで残り時間の変動を反映します。
RemainingTimeWidgetは、カウントダウンタイマーのUI上で実際の時間を表示するためのテキストウィジェットです。
このウィジェットは、テキスト要素を表示するための特定の領域を提供します。
RemainingTimeWidgetは、カウントダウンタイマーのUI上で実際の残り時間を視覚的に表示する役割を担っています。
RemainingTimeTextは、残り時間をテキスト形式で表現するための関数です。
この関数は、整数パラメータ(CurrentRemainingTime)を受け取り、その値をテキストメッセージとして表現したものを返します。
つまり、RemainingTimeTextは、引数として渡された現在の残り時間をテキスト形式に変換する役割を持っています。
これらの要素の関係性は次のようになります。
- RemainingTimeの値が変化すると、その変化がRemainingTimeWidgetに反映されます。
- 具体的には、RemainingTimeの値が更新されるたびに、RemainingTimeWidgetに表示されるテキストも更新されます。
- これにより、ユーザーはカウントダウンタイマーの実際の残り時間をRemainingTimeWidgetを通じて視覚的に確認することができます。
- RemainingTimeTextは、RemainingTimeの値を受け取り、テキスト形式に変換します。
- この関数は、RemainingTimeの値を引数として受け取り、その値をテキストメッセージに変換して返します。
- その返り値がRemainingTimeWidgetに表示されるテキストとして使用されます。
つまり、RemainingTimeは実際の残り時間を格納し、RemainingTimeWidgetはその時間を表示するためのUI要素です。
RemainingTimeTextはRemainingTimeの値をテキスト形式に変換し、そのテキストがRemainingTimeWidgetに表示されます。
このように、RemainingTime、RemainingTimeWidget、RemainingTimeTextは連携して動作し、カウントダウンタイマーの実際の残り時間をUI上で表示する役割を果たしています。
具体例カウントダウンタイマーを考えてみましょう。そのタイマーは、残り時間を表示するUIを持っています。
- RemainingTime(残り時間)は、実際の数値を表す変数です。
- 例えば、30秒や60秒などが代入されます。
- RemainingTimeWidget(残り時間の表示エリア)は、実際の時間を表示するためのテキストウィジェットです。
- このウィジェットは、カウントダウンタイマーのUI上で特定の場所に表示されます。
- 例えば、画面の上部にタイマーが表示されるとします。
- RemainingTimeText(残り時間のテキスト)は、RemainingTimeを表示するための関数です。
- この関数は、RemainingTimeの値を受け取り、それをテキストに変換して返します。
- 例えば、RemainingTimeが30の場合、関数は「30」というテキストを返します。
関係性の具体例を見てみましょう。
- 初期状態では、RemainingTimeの値は60とします。
- RemainingTimeText関数は、RemainingTimeの値を受け取り、それをテキストに変換します。
- 例えば、RemainingTimeText(60)の呼び出しで、関数は「60」というテキストを返します。
- RemainingTimeWidgetは、RemainingTimeText関数から返されたテキストを受け取り、自身の表示エリアにそのテキストを表示します。
- その結果、カウントダウンタイマーのUI上に「60」という表示が現れます。
- 時間が経過し、RemainingTimeの値が変化します。例えば、RemainingTimeが30になったとします。
- RemainingTimeText関数は、新しいRemainingTimeの値である30を受け取り、それをテキストに変換します。
- RemainingTimeText(30)の呼び出しによって、関数は「30」というテキストを返します。
- RemainingTimeWidgetは、新しいテキストである「30」として自身を更新します。
- これにより、カウントダウンタイマーのUI上には新しい表示として「30」という数値が現れます。
このように、RemainingTime、RemainingTimeWidget、RemainingTimeTextは連携して動作します。
RemainingTimeの値が変化するたびに、RemainingTimeText関数がテキストに変換し、そのテキストがRemainingTimeWidgetに表示されます。これにより、カウントダウンタイマーの実際の残り時間がUI上で正確に表示されます。
MaybePlayerUI : ?player_ui = falseの詳細
クリックすると開きます。
このコードは、MaybePlayerUI
という名前の変数を定義しています。この変数は任意のプレイヤーUIを表し、初期値としてfalse
が設定されています。
- 変数の名前と型:
MaybePlayerUI
は変数の名前であり、?player_ui
は変数の型です。?
は、この変数がオプション(Nullable)であることを示しています。- つまり、
player_ui
型の値を持つことも、null
を持つこともできます。
- 初期値:
= false
は変数の初期値を設定しています。
- ここでは、
MaybePlayerUI
の初期値としてfalse
が指定されています。 false
はブール値(真偽値)であり、偽を表します。
意義としては、プレイヤーUIの有無を管理するために使用されます。MaybePlayerUI
変数は、プレイヤーUIが存在する場合はその参照を持ち、存在しない場合はnull
またはfalse
の値を持つことができます。
MaybePlayerUI
変数をオプション型として定義することで、プレイヤーUIが存在しない場合を明示的に表現できます。
また、初期値としてfalse
を設定することで、プレイヤーUIがまだ割り当てられていない状態を示すことができます。
例えば、ゲームの開始時にプレイヤーUIが設定されると、MaybePlayerUI
変数はそのプレイヤーUIの参照を持つことになります。
プレイヤーUIが存在しない場合は、MaybePlayerUI
変数はnull
またはfalse
の値を持ちます。
このように、MaybePlayerUI
変数はプレイヤーUIの有無を管理し、プログラムの実行中に柔軟に対応できるようにするためのものです。
MaybePlayerUI
という変数は、任意のプレイヤーUIを表すために使用されます。これにより、プログラムの実行中にプレイヤーUIが存在するかどうかを管理できます。
例えば、ゲーム内でプレイヤーがログインすると、プレイヤーUIが作成されることがあります。
その場合、MaybePlayerUI
変数にはプレイヤーUIの参照が格納されます。
具体的には、MaybePlayerUI = playerUIInstance
というように、プレイヤーUIのインスタンスを変数に代入します。
プレイヤーUIとは、ゲームやアプリケーションのユーザーインターフェース(UI)のうち、プレイヤーが操作や情報を表示するために使用する部分を指します。

逆に、プレイヤーがログアウトするなどしてプレイヤーUIが存在しなくなった場合、MaybePlayerUI
変数はnull
またはfalse
の値を持ちます。具体的には、MaybePlayerUI = null
やMaybePlayerUI = false
のようになります。
このような設計の意義は、プログラムの実行中にプレイヤーUIの有無を柔軟に扱うことです。
例えば、プレイヤーがログアウトした場合にプレイヤーUIを表示しないようにするために、MaybePlayerUI
の値を確認して条件分岐することができます。
具体例を見てみましょう。
- ゲーム開始時に
MaybePlayerUI
はfalse
で初期化されています。 - プレイヤーがログインすると、
MaybePlayerUI
にはプレイヤーUIの参照が代入されます。- 例えば、
MaybePlayerUI = playerUIInstance
となります。
- 例えば、
- プレイヤーUIが表示される場面では、
MaybePlayerUI
の値を確認して、プレイヤーUIを表示する処理を行います。- 例えば、
if (MaybePlayerUI) { displayPlayerUI(); }
のように条件分岐でプレイヤーUIの表示を制御します。
- 例えば、
- プレイヤーがログアウトすると、
MaybePlayerUI
の値はnull
またはfalse
になります。- これにより、プレイヤーUIの表示を停止する処理を実行できます。
- 例えば、
if (!MaybePlayerUI) { hidePlayerUI(); }
のように条件分岐でプレイヤーUIの非表示を制御します。
このように、MaybePlayerUI
変数を使用することで、プログラムの実行中にプレイヤーUIの有無を柔軟に管理できます。
そのため、プレイヤーUIの表示や非表示を制御する場合などに役立ちます。
必要な理由プレイヤーUIは、ゲームやアプリケーションのユーザーインターフェースの一部であり、プレイヤーがゲームプレイや情報の表示を行うために使用する要素です。
しかし、すべての場面でプレイヤーUIが存在するわけではありません。
そのため、MaybePlayerUI
という変数が必要になるのです。
変数MaybePlayerUI
は、任意のプレイヤーUIを表すために使用されます。
具体的には、プレイヤーUIのオブジェクトや参照を格納することができます。
変数の型は?player_ui
となっており、?
はオプション(Nullable)型であることを示しています。
つまり、MaybePlayerUI
はプレイヤーUIを持つことも、null
を持つこともできます。
なぜMaybePlayerUI
がfalse
で初期化されているかというと、ゲームやアプリケーションの開始時点ではまだプレイヤーUIが存在しない可能性があるからです。
例えば、ゲームがまだ開始されておらず、プレイヤーがログインしていない状態です。
そのような場合には、MaybePlayerUI
をfalse
と初期化することで、プレイヤーUIが存在しないことを明示的に示すことができます。
このように、MaybePlayerUI
変数を使用することで、プログラム内でプレイヤーUIの有無を柔軟に管理できます。
プレイヤーUIが存在する場合にはその参照を保持し、存在しない場合にはnull
またはfalse
の値を持つことで、適切な条件分岐や処理を行うことができます。
つまり、MaybePlayerUI
変数は、プレイヤーUIの有無を追跡し、必要な場面で正確に操作や表示を行うためのものです。
MaybePlayerUI : ?player_ui = false
は、カウントダウンタイマーにおいてプレイヤーUIの有無を管理するために使用されます。
MaybePlayerUI
は、プレイヤーUIの参照を格納するための変数です。?player_ui
はオプション型であり、MaybePlayerUI
はプレイヤーUIの参照を持つことも、null
を持つこともできます。false
で初期化されているのは、カウントダウンタイマーが開始される前にプレイヤーUIが存在しない状態であることを示すためです。- カウントダウンタイマーが開始されると、適切なプレイヤーUIの参照が
MaybePlayerUI
に格納されます。- これにより、UIの表示や操作を行うことができます。
- カウントダウンタイマーが終了するか、プレイヤーUIが不要になった場合、
MaybePlayerUI
はnull
またはfalse
に設定されます。- これにより、UIの表示を停止したり、不要なリソースを解放したりすることができます。
このように、MaybePlayerUI : ?player_ui = false
は、カウントダウンタイマーにおいてプレイヤーUIの有無を追跡し、適切なタイミングで操作や表示を行うためのものです。

MaybePlayerUI、RemainingTime、RemainingTimeWidget及びRemainingTimeTextの関係性
クリックすると開きます。
MaybePlayerUI
とRemainingTime
の関係性
MaybePlayerUI
は、プレイヤーUIの有無を表す変数です。RemainingTime
は、カウントダウンタイマーの残り時間を表す変数です。MaybePlayerUI
は、カウントダウンタイマーがプレイヤーUIを持っているかどうかを示すために使用されます。- カウントダウンタイマーが開始されると、適切なプレイヤーUIの参照が
MaybePlayerUI
に格納されます。 - プレイヤーUIの参照が存在する場合、
MaybePlayerUI
を使用してUIの操作や表示を行うことができます。
MaybePlayerUI
とRemainingTimeWidget
の関係性:
MaybePlayerUI
は、プレイヤーUIの有無を表す変数です。RemainingTimeWidget
は、カウントダウンタイマーの残り時間を表示するためのテキストウィジェットです。- カウントダウンタイマーが開始されると、
MaybePlayerUI
の値を確認し、プレイヤーUIが存在する場合にはRemainingTimeWidget
をプレイヤーUIに追加します。 - プレイヤーUIの一部として
RemainingTimeWidget
が表示されることで、プレイヤーはカウントダウンタイマーの残り時間を確認することができます。
MaybePlayerUI
とRemainingTimeText
の関係性:
MaybePlayerUI
は、プレイヤーUIの有無を表す変数です。RemainingTimeText
は、カウントダウンタイマーの残り時間を表すためのメッセージを返す関数です。RemainingTimeText
は、カウントダウンタイマーの残り時間が変更されるたびに呼び出され、現在の残り時間をテキストメッセージとして返します。- プレイヤーUIが存在し、
RemainingTimeText
のメッセージが表示されるUI要素(例:RemainingTimeWidget
)がある場合、RemainingTimeText
の返り値がそのUI要素に表示されます。
以上の関係性により、MaybePlayerUI
はカウントダウンタイマーのプレイヤーUIの有無を追跡し、適切なタイミングでUI要素(例:RemainingTimeWidget
)にカウントダウンタイマーの情報を表示するために使用されます。
カウントダウンタイマーの開始時に、MaybePlayerUI
の値をチェックしてプレイヤーUIの有無を判定します。
もしMaybePlayerUI
がプレイヤーUIの参照を持っていれば、それはプレイヤーUIが存在することを意味します。
その場合、UI要素(例:RemainingTimeWidget
)をプレイヤーUIに追加して表示させることができます。
一方、もしMaybePlayerUI
がnull
またはfalse
の値を持っている場合、それはプレイヤーUIが存在しないことを示します。その場合、UI要素を表示させる必要はありません。
つまり、MaybePlayerUIの値をチェックすることで、カウントダウンタイマーの開始時にUI要素を表示させるかどうかを判別することができます。

このように、MaybePlayerUI
はUI要素の表示制御に関与する役割を持っています。
player_uiクラスとは
クリックすると開きます。
player_ui
クラスは、プレイヤーのUIにウィジェットを追加したり削除したりするための主要なインターフェースです。
このクラスは、ゲーム開発やユーザーインターフェースの設計において、プレイヤーに対する情報や操作の表示に使用されます。
具体的な使用例としては、以下のようなものがあります。
- ゲーム内のプレイヤーの画面に情報を表示する:
- 例えば、スコアや残り時間を表示するためのテキストウィジェットや、アイテムやスキルのアイコンを表示するためのイメージウィジェットを追加します。
- プレイヤーのアクションに応じたボタンやメニューを表示する:
- プレイヤーが特定のアクションを実行する際に、それに対応するボタンやメニューを表示するために使用されます。例えば、ジャンプボタンや攻撃ボタン、ポーズメニューなどがあります。
- ゲームの進行や状態を可視化する:
- プレイヤーにゲームの進行状況や特定の状態を可視化するために、進行バー、ステータスアイコン、エフェクトなどのウィジェットを追加します。
player_ui
クラスのメンバー関数を使用することで、ウィジェットの追加や削除が行えます。
AddWidget
関数は、指定したウィジェットをプレイヤーのUIに追加します。RemoveWidget
関数は、指定したウィジェットをプレイヤーのUIから削除します。
このクラスは、ゲーム開発者がプレイヤーのUIをカスタマイズし、情報や操作要素を適切に表示するために使用されます。プレイヤーに対する直接的な情報提供や操作の提供を行うための重要なクラスです。
player_uiクラスのメンバー関数について
クリックすると開きます。
- AddWidget
- 説明:
- 指定されたウィジェットをプレイヤーのUIに追加します。
- デフォルトの
player_ui_slot
の設定オプションを使用します。
- シグネチャ:
AddWidget(Widget)
- 引数:
Widget
- 追加するウィジェット
- 返り値:
- なし この関数は、指定されたウィジェットをプレイヤーのUIに追加するために使用されます。
- ウィジェットは、テキスト、画像、ボタンなど、表示する情報や操作要素を表すものです。
- デフォルトの設定オプションを使用するため、ウィジェットの表示位置やサイズなどの設定は事前に決まっています。
- 例えば、以下のようなコードで使用します:
PlayerUI.AddWidget(ScoreTextWidget)
- AddWidget
- 説明:
- 指定されたウィジェットをプレイヤーのUIに追加します。
Slot
を使用して表示位置やサイズなどの設定をカスタマイズすることができます。
- シグネチャ:
AddWidget(Widget, Slot)
- 引数:
Widget
- 追加するウィジェット、Slot
- ウィジェットの表示設定をカスタマイズするためのスロット
- 返り値:
- なし この関数は、指定されたウィジェットをプレイヤーのUIに追加します。
Slot
を使用してウィジェットの表示位置やサイズ、アンカーポイント、オフセットなどの詳細な設定を行うことができます。- これにより、ウィジェットの配置を柔軟にカスタマイズすることができます。
- 例えば、以下のようなコードで使用します:
PlayerUI.AddWidget(ScoreTextWidget, Slot{Anchors := Anchors{...}, Alignment := Alignment{...}, Offsets := Offsets{...}})
- RemoveWidget
- 説明:
- 指定されたウィジェットをプレイヤーのUIから削除します。
- シグネチャ:
RemoveWidget(Widget)
- 引数:
Widget
- 削除するウィジェット
- 返り値:
- なし この関数は、指定されたウィジェットをプレイヤーのUIから削除するために使用されます。
- 削除されたウィジェットは表示されなくなります。 例えば、以下のようなコードで使用します:
PlayerUI.RemoveWidget(ScoreTextWidget)
これらのメンバー関数を使用することで、プログラマーはプレイヤーのUIにウィジェットを追加したり削除したりすることができます。
これにより、ゲーム内の情報の表示や操作要素の提供を制御できます。
メンバー関数とシグネチャについて
クリックすると開きます。
- メンバー関数(Member Function):
- メンバー関数は、クラスやオブジェクトに属している関数のことを指します。
- クラス内で定義され、そのクラスのオブジェクトに対して呼び出すことができます。
- メンバー関数は、そのクラスの特定の振る舞いや操作を実現するための処理を含んでいます。
- シグネチャ(Signature):
- シグネチャは、関数の識別情報であり、関数の名前と引数の型および個数で構成されます。
- シグネチャによって関数が一意に識別され、オーバーロード(同じ名前で異なる引数の組み合わせを持つ複数の関数を定義すること)が可能になります。
- シグネチャは、関数の宣言や呼び出し、関数のオーバーロードの解決などで使用されます。
例えば、以下のような関数のシグネチャがあります。
void AddWidget(Widget widget);
この関数のシグネチャは、関数名がAddWidget
であり、引数が1つのWidget
型の引数であることを示しています。
このシグネチャに基づいて、関数の定義や呼び出しが行われます。
同じ関数名で引数の型や個数が異なるシグネチャを持つ別の関数を定義することも可能です。
シグネチャは、関数の識別や型安全性の確保に重要な役割を果たします。
コンパイラやインタプリタは、関数のシグネチャをもとに関数の呼び出しやオーバーロードの解決を行います。
もっとわかりやすい: メンバー関数編メンバー関数は、クラス内で定義される関数のことです。
つまり、あるクラスに属している関数ということですね。
メンバー関数は、そのクラスのオブジェクトに対して操作を行ったり、情報を取得したりするために使用されます。
クラスは、特定のデータや振る舞いを表現するための設計図やテンプレートのようなものです。
そのクラスには、データメンバー(変数)とメンバー関数(関数)が含まれています。
メンバー関数は、そのクラスのデータメンバーに対してアクセスしたり、処理を行ったりするための方法を提供します。
メンバー関数は、クラス内で以下のように定義されます:
class MyClass {
// データメンバー(変数)の定義
public:
// メンバー関数の定義
void MyFunction() {
// 処理の内容
}
};
上記の例では、MyFunction
という名前のメンバー関数が定義されています。
このメンバー関数は、MyClass
というクラスに属しており、public
キーワードによって他の部分からアクセス可能であることを示しています。
メンバー関数は、クラスの内部で定義されるため、クラス内のデータメンバーに直接アクセスすることができます。また、関数内でthis
ポインタを使用して、自身のオブジェクトに対する操作を行うこともできます。
クラスのオブジェクトを作成した場合、そのオブジェクトに対してメンバー関数を呼び出すことができます。
以下は、メンバー関数の呼び出しの例です:
MyClass obj; // MyClassクラスのオブジェクトを作成
obj.MyFunction(); // メンバー関数を呼び出し
このように、メンバー関数を使用することで、クラスのオブジェクトに対して操作や処理を行うことができます。
メンバー関数は、クラスの特定の振る舞いや機能を実現するために使用されます。
クラスに関数が含まれる効果は?クラスに関数が含まれているかどうかによって、プログラムの構造や振る舞いに大きな違いが生じます。
以下に、クラスに関数が含まれている場合と含まれていない場合の違いを説明します。
クラスに関数が含まれている場合:
クラスに関数が含まれているとき、関数はそのクラスの一部として定義されます。
これにより、関数はクラスのオブジェクトに対して操作を行ったり、オブジェクトのデータを処理したりするために使用されます。
クラス内の関数は、そのクラスの特定の振る舞いや機能を実現するために使用されます。
クラス内の関数は、オブジェクト指向プログラミングの概念である「メソッド」としても知られています。
メソッドは、クラスに属している関数であり、クラスのデータにアクセスしたり、そのデータを操作したりするための特別な機能を持っています。
メソッドは、クラスのインスタンス(オブジェクト)に対して呼び出すことができます。
クラスに関数が含まれていない場合:
クラスに関数が含まれていない場合、関数は単独のエンティティとして定義されます。
つまり、関数は特定のクラスに所属せず、独立して存在します。この場合、関数は引数を受け取り、処理を実行し、結果を返す一連の操作を行うために使用されます。
クラスに関数が含まれない場合、関数は通常、プログラムのどこからでも呼び出すことができます。関数は特定のデータや状態にアクセスする必要がない場合に使用されます。
つまり、クラスに関数が含まれるかどうかは、関数が特定のデータや操作に関連付けられているかどうかを示しています。
クラスに関数が含まれている場合、関数はそのクラスの一部として特定の目的を果たすために使用されます。
もっとわかりやすい:シグネチャ編シグネチャ(Signature)は、関数やメソッドの識別情報を表すものです。シグネチャは、関数の名前とその引数の型および個数で構成されます。
つまり、関数のシグネチャは、その関数を一意に特定するために必要な情報を提供します。
シグネチャの概念は、関数のオーバーロード(同じ名前で異なる引数の組み合わせを持つ複数の関数を定義すること)や関数の呼び出し時の引数のチェックなどに重要な役割を果たします。
シグネチャによって、コンパイラやインタプリタは関数を正確に特定し、関数のオーバーロードを解決します。
シグネチャは関数宣言や定義の一部として使用されます。
一般的な関数の宣言は次のような形式を取ります:
戻り値の型 関数名(引数の型 引数名, 引数の型 引数名, ...)
関数名と引数の型・個数がシグネチャを構成する要素です。例えば、以下のような関数のシグネチャがあります:
int Add(int a, int b);
この関数のシグネチャは、関数名がAdd
であり、引数が2つのint
型の引数であることを示しています。このシグネチャに基づいて、関数の定義や呼び出しが行われます。
もし同じ関数名で異なる引数の組み合わせを持つ別の関数が定義されている場合、それぞれの関数は異なるシグネチャを持ちます。
シグネチャは関数の一意性と型安全性を確保するために重要です。コンパイラやインタプリタは、関数のシグネチャに基づいて関数の呼び出しやオーバーロードの解決を行います。正しいシグネチャで関数を宣言・定義することで、予期しないエラーや型の不一致を防ぐことができます。
つまり、関数シグネチャとは、プログラミングにおいて関数の特徴や構造を示すものです。

(CurrentRemainingTime : int) の詳細
クリックすると開きます。
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
は、関数 RemainingTimeText
の宣言です。
RemainingTimeText
:- 関数の名前です。
- この関数はテキストを生成するために使用されます。
<localizes>
:- この宣言は、テキストがローカライズ(多言語対応)されることを示しています。
- ローカライズとは、プログラムが異なる言語や地域に対応できるように、テキストやメッセージを翻訳したり調整したりするプロセスです。
(CurrentRemainingTime : int)
:- この部分は、関数
RemainingTimeText
の引数の定義です。 - 引数は関数に渡される入力値です。
- ここでは、
CurrentRemainingTime
という名前のint
(整数)型の引数が定義されています。
- この部分は、関数
: message
:- この部分は関数の戻り値の型を示します。
message
型は、テキストやメッセージのデータを表します。- 関数が実行されると、指定されたテキスト(
"{CurrentRemainingTime}"
)が返されます。
= "{CurrentRemainingTime}"
:- この部分は、関数の本体です。
- 引数
CurrentRemainingTime
の値をテキストに埋め込んで文字列"{CurrentRemainingTime}"
を返します。
簡単に言えば、この関数は渡された整数の値を受け取り、それをテキストとして返します。
例えば、CurrentRemainingTime
が「10」の場合、関数は文字列 "10"
を返します。
このテキストはローカライズ(多言語対応)されることもできます。
具体的なテキストの翻訳や調整ロジックは、関数の実装によって決まります。
このような関数は、たとえば残り時間を表示する際に使用されることがあります。
例えば、ゲームのカウントダウンタイマーであれば、この関数を使って表示されるテキストを動的に更新することができます。
どうして引数を定義する必要があるの?この場合、関数 RemainingTimeText
に引数を定義する必要があるのは、関数が動作するために必要な情報を外部から受け取るためです。
引数を使用することで、関数に入力値を渡すことができます。関数は受け取った引数を利用して処理を行い、結果を返すことができます。
この場合、CurrentRemainingTime
引数は RemainingTimeText
関数が処理する際に必要な値であり、残り時間を表す整数として渡されることを想定しています。
引数を定義することで、関数は汎用性を持ちます。同じ関数を異なる値で呼び出すことで、関数の再利用性が向上し、柔軟な処理が可能になります。
例えば、ゲームのカウントダウンタイマーにおいて、残り時間をテキストとして表示するためにこの関数を使用する場合、ゲームの状況に応じて異なる残り時間を引数として渡すことができます。
簡単に言えば、引数を定義することによって関数は外部からの情報を受け取り、その情報に基づいて処理を行い、結果を返すことができるのです。
【具体例】
関数は、誰かからの入力(引数)を受けて、その入力を使って特定の処理を行い、結果を返すものです。
引数を使うことで、同じ処理を複数回実行しながら異なるデータを扱うことができます。
例えば、このRemainingTimeText
関数はカウントダウンタイマーで使用されると考えましょう。
ゲームでは、残り時間を表示するためにこの関数を呼び出す必要があります。
しかし、ゲームごとに残り時間は異なる可能性があります。
あるゲームでは残り時間が30秒であるかもしれず、別のゲームでは残り時間が1分であるかもしれません。
このような場合、引数が役立ちます。
引数は、関数に「ここに使ってほしいデータはこれですよ」と教える手段です。
この関数では、引数 CurrentRemainingTime
を使って呼び出されたときの残り時間を渡すことができます。
例えば、RemainingTimeText(30)
と呼び出すと、関数は"{CurrentRemainingTime}"
の部分を30
というテキストに置き換え、"30"
という結果を返します。同様に、RemainingTimeText(60)
を呼び出すと"60"
という結果を返します。
引数を使用することで、同じ関数を様々なデータに対して使うことができ、コードの再利用性が高まります。例えば、他の場所でも同じようなテキストを生成する必要がある場合、この関数を再利用することができます。
UIの作成
▼ 下記のコードは、カウントダウンタイマーを表示するためのUIを作成するためのクラス定義です。
整数パラメータCurrentRemainingTime
を受け取り、その値を表示するためのRemainingTimeText
という名前の関数を定義しています。{CurrentRemainingTime}
はメッセージとして返されます。
- UI の作成:
countdown_timer := class:
block:
set Canvas = canvas:
Slots := array:
canvas_slot:
Anchors := anchors:
Minimum := vector2{X := 0.5, Y := 0.05}
Maximum := vector2{X := 0.5, Y := 0.05}
Alignment := vector2{X := 0.5, Y := 0.0}
Offsets := margin{Top :=0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
SizeToContent := true
Widget := RemainingTimeWidget
countdown_timer := class:
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
クリックすると開きます。
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
この部分は、クラスがインスタンス化されたときに実行されるクラス定義の block
式です。
ここでは、カウントダウンタイマーを表示するための Canvas
オブジェクトを作成しています。
Canvas
はウィジェットの配置や表示を管理するために使用されます。
Canvas
の Slots
は、ウィジェットを配置する領域を定義するためのプロパティです。
ここでは、canvas_slot
という名前のスロットを作成しています。
canvas_slot
のプロパティには以下が設定されています。
Anchors
- ウィジェットの配置の基準となるアンカーの位置を指定しています。ここでは、
Minimum
とMaximum
を同じ値に設定して、画面上部中央にウィジェットが配置されるようにしています。
- ウィジェットの配置の基準となるアンカーの位置を指定しています。ここでは、
Alignment
- ウィジェットの配置がアンカーの位置に対してどのように行われるかを指定しています。ここでは、
X
方向は中央に、Y
方向は上に配置されるように指定しています。
- ウィジェットの配置がアンカーの位置に対してどのように行われるかを指定しています。ここでは、
Offsets
- ウィジェットの配置に対してオフセット(余白)を指定するためのプロパティです。ここでは、すべての余白を 0 に設定しています。
SizeToContent
- ウィジェットのサイズを内容に合わせて自動調整するかどうかを示すブール値です。ここでは、
true
に設定されており、ウィジェットのサイズが自動的に調整されます。
- ウィジェットのサイズを内容に合わせて自動調整するかどうかを示すブール値です。ここでは、
Widget
- このスロットに配置されるウィジェットの種類を指定しています。ここでは、
RemainingTimeWidget
というウィジェットが使用されます。
- このスロットに配置されるウィジェットの種類を指定しています。ここでは、
var Canvas : canvas = canvas{}
RemainingTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
これらの行では、Canvas
と RemainingTimeWidget
、RemainingTimeText
の定義が行われています。
var Canvas: canvas = canvas{}
:Canvas
変数を定義し、初期値として空のcanvas
オブジェクトを割り当てています。
RemainingTimeWidget: text_block = text_block{DefaultTextColor := NamedColors.White}
:RemainingTimeWidget
変数を定義し、初期値としてテキストブロックウィジェットを作成しています。DefaultTextColor
プロパティをNamedColors.White
に設定して、テキストのデフォルトの色を白に指定しています。
RemainingTimeText<localizes>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
:- カウントダウンタイマーの残り時間を表示するための
RemainingTimeText
メッセージを定義しています。 - 引数
CurrentRemainingTime
を受け取り、その値をテキストとして返します。
- カウントダウンタイマーの残り時間を表示するための
このクラス定義の目的は、カウントダウンタイマーのUIを作成することです。
Canvas
には指定されたスロットがあり、その中に RemainingTimeWidget
が配置されます。
RemainingTimeWidget
は、クラス外部から提供された残り時間を表示するためのテキストブロックです。
block式について
クリックすると開きます。
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
block 式は、複数の文をグループ化して1つの式として表現するために使用されます。
一般的な構文は以下のようになります。
block:
statement1
statement2
...
statementN
ここで、statement1
から statementN
までの文は、ブロック内に含まれる複数の文です。
block 式にはいくつかの特徴があります。
- ブロック内の文は順番に実行されます。各文は直前の文の結果を参照することができます。
- ブロック式は最後の文の評価結果を返します。
- したがって、ブロック内の最後の文が値を返す場合、その値がブロック式全体の結果となります。
- ブロック式内で新しいスコープが導入されます。
- このため、ブロック内で宣言された変数や関数は、ブロック外からはアクセスできません。
block 式の主な用途は、複数の文をまとめてグループ化することと、ブロック内で一時的な変数や関数を定義することです。
また、条件分岐や繰り返し処理など、複数の文が必要な場面でよく使用されます。
例えば、次のような状況では block 式が役立ちます:
block:
statement1
statement2
statement3
このような場合、block 式を使用することでこれらの文をまとめて1つの式として扱うことができます。また、ブロック内で一時的な変数を定義して使用することもできます。
ブロック内の文は実行される順序が保証されるため、文の実行に順序や制御フローを持たせたい場合にも block 式を活用できます。
block 式を使った理由block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
上記のコードでは、block 式が使用されていますが、個々の文をまとめて1つのブロックにグループ化する必要がある理由はいくつかあります。以下に説明します。
- 変数のスコープ:
- ブロック内で定義された変数は、ブロックの外からは参照できません。
- そのため、特定のコンテキストでのみ使用される変数を定義する場合に便利です。
- 例えば、
Canvas
変数やRemainingTimeWidget
変数は、countdown_timer
クラス内でのみ使用されるため、ブロック内に定義されています。
- インスタンスの初期化と構成:
- ブロック内では、インスタンスの初期化と構成をまとめて行うことができます。
- 上記のコードでは、Canvas オブジェクトとそれに関連する Slots、canvas_slot、Anchors、Alignment、Offsets、SizeToContent、Widget の設定が一箇所に集約されています。
- これにより、コードの見通しを良くし、関連する設定を追加・変更する際のミスを防ぐことができます。
- コードの整理と可読性:
- block 式を使用することで、コードをブロックごとにグループ化し、関連する部分をまとめることができます。
- これにより、コードの読みやすさと保守性が向上します。
- ブロック内には、論理的なまとまりやタスクごとの手続きが含まれるため、コードの意図や構造が明確になります。
要約すると、上記のコードでは複数の文をまとめてブロックにグループ化することで、変数のスコープを制御し、インスタンスの初期化と構成を整理し、コードの可読性を向上させています。
set Canvas = canvas:の詳細
クリックすると開きます。
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
set Canvas = canvas:
は、変数Canvas
を新しく作成し、その値をcanvas
オブジェクトに設定するコードです。
これにより、クラス内でCanvas
という名前でcanvas
オブジェクトにアクセスできるようになります。
詳細は以下のとおり。
set
:- 変数を設定するキーワードです。新しい変数を作成することや既存の変数に値を設定する場合に使用します。
Canvas
:- 新しく作成または設定される変数の名前です。この場合、
Canvas
という名前の変数が作成されます。
- 新しく作成または設定される変数の名前です。この場合、
=
:- 変数に値を設定するための代入演算子です。右側の値が左側の変数に代入されます。
canvas
:Canvas
変数に設定される値です。ここでは、canvas
という名前のオブジェクトです。このオブジェクトは、UIのキャンバスを表します。
つまり、set Canvas = canvas:
の行は、Canvas
という名前の変数を作成し、その値をcanvas
オブジェクトに設定しています。
これにより、UIのキャンバスにアクセスできるようになります。
例えば、後続の行でCanvas
変数を使用してUIのスロットやウィジェットを設定することができます。
また、他のメソッドや関数内でもCanvas
変数を使用してキャンバスに関する操作を行うことができます。
要するに、set Canvas = canvas:
は、UIのキャンバスを表す変数Canvas
を作成し、canvas
オブジェクトに設定するためのコードです。
これにより、UIの各要素にアクセスして操作するための手段を提供します。

UIのキャンバスは「絵を描く場所」と言えます。
それはUI要素が配置され、描画される抽象的な領域です。
キャンバス上には画像やボタンなどのUI要素が描かれます。
ゲーム内のメニューボタンやアクションボタン、オプション設定へのリンク、クエストの進捗を表示するプログレスバーなど、多くの場面でゲーム画面にボタンやUI要素が使用されますね。

新しく変数を作成する理由
クリックすると開きます。
"set Canvas = canvas:" のコード行は、キャンバスオブジェクトを新しい変数Canvasに割り当てています。
キャンバスはUI要素やウィジェットを配置するためのコンテナです。
このコードでは、キャンバスにウィジェットを追加するために、新しい変数Canvasを作成し、それに対して設定を行っています。
新しい変数を作成する理由は、以下の利点があります:
- 可読性と保守性の向上:
- キャンバスを新しい変数に割り当てることで、コードの可読性が向上します。
- 変数名(Canvas)がキャンバスを表すため、コードを読む人がすぐに理解できます。
- また、キャンバスに対する操作や設定が行われる場合、変数(Canvas)を経由して直感的なコードが書けます。
- さらに、将来的な変更や拡張があった場合にも、変数を変更するだけで済むため保守性が向上します。
- 可換性と適用範囲の明確化:
- setキーワードを使用してキャンバスを新しい変数に設定することで、ある特定のスコープ内でのみその変数を利用できるようになります。
- この場合、countdown_timerクラスのスコープ内でのみ変数Canvasが有効です。
- これにより、変数の名前の衝突や間違った利用を防ぐことができます。
- コードの柔軟性と再利用性:
- キャンバスを変数に割り当てることで、将来的に異なるキャンバスを利用する必要が生じた場合でも、変数の値を変更するだけで対応できます。
- このように変数を介してキャンバスにアクセスすることで、同じコードを再利用しやすくなります。
- また、別の場所で同じキャンバスを利用する場合にも、変数を使いまわすことができます。
以上の理由から、キャンバスを新しい変数に割り当てることは、可読性、保守性、柔軟性、再利用性などを向上させるために一般的なプラクティスです。
canvasクラスについてCanvasクラスは、ウィジェットをキャンバスのスロットに任意の位置に配置するためのコンテナウィジェットです。
widgetクラスから派生しており、プレイヤーの画面上に描画されるすべてのUI要素の基本クラスです。
データメンバーとしては、以下のものがあります:
- Slots:
- キャンバスの子ウィジェットの配列です。
- ウィジェットの初期化中のみ使用され、AddWidgetやRemoveWidgetによって変更されません。
関数としては、以下のようなものがあります:
- AddWidget:
- キャンバスに新しい子スロットを追加します。
- GetParentWidget:
- ウィジェットの親ウィジェットを取得します。
- 親が存在しない場合(このウィジェットがplayer_ui内にない場合やルートウィジェット自体の場合など)、失敗します。
- GetRootWidget:
- このウィジェットをplayer_uiに追加したウィジェットを取得します。
- ルートウィジェットは自分自身を返します。
- このウィジェットがplayer_uiに含まれていない場合、失敗します。
- GetVisibility:
- 現在のウィジェットの表示状態を返します。
- IsEnabled:
- ウィジェットがプレーヤーによって対話的に変更可能かどうかを示す真偽値を返します。
- RemoveWidget:
- 指定したウィジェットを含むスロットを削除します。
- SetEnabled:
- プレーヤーがこのウィジェットと対話できるかどうかを有効または無効にします。
- SetVisibility:
- ウィジェットを表示または非表示にしますが、player_uiから自体を削除しません。
詳しくは以下の公式サイトを参照してください。
set Canvas = canvas:がsetである理由
クリックすると開きます。
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Simulation }
using { /Fortnite.com/UI }
MakeCountdownTimer<constructor><public>(MaxTime : float, InPlayer : agent) := countdown_timer:
RemainingTime := MaxTime
MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}
countdown_timer := class:
<# このブロックは、countdown_timer class のインスタンスごとに実行されます。
ここに到達した際にキャンバスを設定できます。#>
block:
set Canvas = canvas:
Slots := array:
canvas_slot:
Anchors := anchors:
Minimum := vector2{X := 0.4, Y := 0.3}
Maximum := vector2{X := 0.6, Y := 0.3}
Alignment := vector2{X := 0.5, Y := 0.5 }
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
SizeToContent := true
Widget := RemainingTimeTextBlock
canvas_slot:
Anchors := anchors:
Minimum := vector2{X := 0.4, Y := 0.3}
Maximum := vector2{X := 0.6, Y := 0.3}
Alignment := vector2{X := 0.0, Y := 1.0}
Offsets := margin{Top := 0.0, Right := 0.0}
SizeToContent := true
Widget := AddedTimeTextBlock
CountdownEndedEvent<public> : event(float) = event(float){}
StartCountdown<public>() : void =
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
spawn:
RunCountdown()
AddRemainingTime<public>(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
UpdateUI()
# シンプルなコールアウトを起動して、追加される時間を表示します。
spawn:
AddedTimeCallout(Time)
MaybePlayerUI<internal> : ?player_ui = false
var RemainingTime<internal> : float = 0.0
RemainingTimeTextBlock<private> : text_block = text_block{}
AddedTimeTextBlock<private> : text_block = text_block{}
RemainingTimeText<localizes><private>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
AddedTimeText<localizes><private>(AddedTime : int) : message = " +{AddedTime}!"
var Canvas<private> : canvas = canvas{}
var TotalTime<private> : float = 0.0
# タイマーの「精度」を表し、ティックの頻度を秒単位で表します。
TimerTickPeriod<private> : float = 1.0
RunCountdown<private>()<suspends> : void =
# TimerTickPeriod を使ってループします。
# UI も毎回更新されます。
loop:
Sleep(TimerTickPeriod)
set TotalTime += TimerTickPeriod
set RemainingTime -= TimerTickPeriod
UpdateUI()
# タイマーの終了
if (RemainingTime <= 0.0):
Canvas.RemoveWidget(RemainingTimeTextBlock)
if (UI := MaybePlayerUI?):
UI.RemoveWidget(Canvas)
CountdownEndedEvent.Signal(TotalTime)
break
AddedTimeCallout<private>(Time : float)<suspends> : void =
if:
PlayerUI := MaybePlayerUI?
IntTime := Int[Time]
then:
AddedTimeTextBlock.SetVisibility(widget_visibility.Visible)
AddedTimeTextBlock.SetText(AddedTimeText(IntTime))
Sleep(2.0)
AddedTimeTextBlock.SetVisibility(widget_visibility.Hidden)
UpdateUI<private>() : void =
if (IntTime := Int[RemainingTime]):
RemainingTimeTextBlock.SetText(RemainingTimeText(IntTime))
完全なスクリプト2
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/UI }
countdown_timer_example := class(creative_device):
@editable
AddMoreTimeButton : button_device = button_device{}
@editable
EndGame : end_game_device = end_game_device{}
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
OnBegin<override>()<suspends> : void =
AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
CountdownTimer.CountdownEndedEvent.Await()
EndGame.Activate(FirstPlayer)
else:
Print("Can't find player")
OnButtonInteractedWith(Agent : agent) : void =
TimeToAdd : float = 20.0
CountdownTimer.AddRemainingTime(TimeToAdd)
実行されるのが完全なスクリプトの2からです。
Slots := arrayの詳細
クリックすると開きます。
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
Slots := array:
は、プログラミングのコードの一部です。ここでは、プログラミング言語やコンテキストを特定することなく、一般的な概念として説明します。
Slots
とは何ですか?Slots
は、変数(Variable)または名前(Name)と呼ばれるコンテナです。- 変数はデータを格納するための場所で、プログラム内で参照されることがあります。
- このコードでは、
Slots
という名前の変数が作成されます。
:=
とは何ですか?:=
は、代入演算子(Assignment Operator)と呼ばれるもので、右側の値を左側の変数に代入するために使用されます。- つまり、左側の変数に右側の値を割り当てることを意味します。
array:
とは何ですか?array:
は、配列(Array)を作成するための特殊な構文です。- 配列はデータの集まりで、複数の値を一つの変数に格納することができます。
- このコードでは、
array
という名前の配列が作成されます。
- つまり、
Slots := array:
とは何をしているのですか?Slots := array:
というコードは、変数Slots
を作成し、その変数にarray
という名前の配列を代入しています。- つまり、
Slots
という名前を持つ変数に、空の配列を割り当てるということです。
ここで理解する重要なポイントは、:=
が変数への代入を表し、array:
が空の配列を作成する特殊な構文であることです。具体的なプログラミング言語やコンテキストによっては、記述方法や構文が異なる場合があります。
canvas_slot:の詳細
クリックすると開きます。
block:
# クラスがインスタンス化されたときに実行されるコードブロックの開始を示します。
set Canvas = canvas:
# Canvas 変数を canvas オブジェクトで設定します。
Slots := array:
# Slots 変数に、配列である array を代入します。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
Anchors := anchors:
# Anchors 変数を anchors オブジェクトで設定します。
# スロットの配置の基準点を指定します。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
Widget := RemainingTimeWidget
# canvas_slot の Widget プロパティを指定されたウィジェットに設定します。
# スロットに表示するウィジェットを指定します。
このコード部分は、Slots
という配列にcanvas_slot
という名前の要素を追加することを意味しています。
ここでは、グラフィックスプログラムやGUI(グラフィカルユーザインタフェース)を作成する場合に使用されるキャンバス上の特定の領域を表現します。
具体的な例として、あなたがウェブページ上でタイマーを表示したい場合を考えてみましょう。そのタイマーが配置される領域(スロット)を指定するために、このコード部分を使用します。
Slots
配列は、複数のスロットを持つことができます。ここでは、新しいスロットとしてcanvas_slot
が作成されます。このスロットは、キャンバス上の特定の場所に表示物(ウィジェット)を配置するために使用されます。
スロットには位置やサイズの情報を指定するためのプロパティがあります。
例えば、Anchors
プロパティでは、スロットの位置を決定するアンカーポイント(最小値と最大値)を指定します。
Alignment
プロパティでは、スロット内でウィジェットの配置位置を指定します。
Offsets
プロパティでは、スロットの上下左右の余白を設定します。
SizeToContent
プロパティは、スロットのサイズを内部のコンテンツに合わせて自動的に調整するかどうかを指定します。
最後に、Widget
プロパティでは、スロットに表示するウィジェット(この場合はRemainingTimeWidget
という名前のウィジェット)を指定します。
これにより、スロット内にタイマーの表示を行うことができます。
このようにして、canvas_slot
をSlots
配列に追加することで、特定の領域にタイマーを配置する準備が整います。
canvas_slot:
canvas_slot:
は、countdown_timer
クラスで使用されるキャンバス上のスロットを定義するための記述です。
スロットは、キャンバス上でウィジェットを配置するための領域を指定します。具体的には、以下のような役割を果たします:
Anchors
プロパティでは、スロットの上下左右のアンカーポイントを設定します。- 例えば、
Minimum := vector2{X := 0.5, Y := 0.05}
とMaximum := vector2{X := 0.5, Y := 0.05}
という設定は、スロットをキャンバスの上端中央に固定します。
- 例えば、
Alignment
プロパティでは、スロット内のウィジェットの配置を調整します。vector2{X := 0.5, Y := 0.0}
の設定は、ウィジェットをスロットの水平中央に配置します。
Offsets
プロパティは、スロットの上下左右のマージンを設定します。- ここでは、すべてのマージンを0に設定しています。
SizeToContent
プロパティは、スロットのサイズをウィジェットの内容に合わせて自動調整するかどうかを指定します。true
に設定することで、ウィジェットのサイズに合わせてスロットのサイズが変動します。
Widget
プロパティでは、スロットに配置するウィジェットを指定します。- ここでは、
RemainingTimeWidget
という名前のテキストウィジェットを指定しています。
- ここでは、
要するに、canvas_slot:
の記述は、キャンバス内でスロットを作成し、そのスロット内にRemainingTimeWidget
を配置するための設定を行っています。これにより、RemainingTimeWidget
が指定した位置に時間表示用のテキストが表示されます。
キャンバス上のスロットは、ウィジェットを配置するために使用される領域です。ウィジェットは、キャンバスに表示される要素です。
スロットは、次の属性を持ちます。
- Anchors:
- スロットの配置の基準点を指定します。
- Alignment:
- スロットの配置位置を指定します。
- Offsets:
- スロットの上下左右の余白を指定します。
- SizeToContent:
- スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
- Widget:
- スロットに表示するウィジェットを指定します。
たとえば、スロットの Anchors 属性を TopLeft に設定すると、スロットの上端左端がキャンバスの左上隅に配置されます。スロットの Alignment 属性を Center に設定すると、スロットはキャンバスの中央に配置されます。スロットの Offsets 属性を 10px に設定すると、スロットはキャンバスの左上隅から 10 ピクセル離れて配置されます。スロットの SizeToContent 属性を true に設定すると、スロットは内部のコンテンツに合わせてサイズ調整されます。スロットの Widget 属性にウィジェットを指定すると、スロットにウィジェットが表示されます。
スロットは、キャンバスにウィジェットを配置するために使用される便利な機能です。
【スロットを例えると・・・】
スロットは、例えば箱の中にアイテムを整理して収納する際に使う仕切り板のようなものと考えることができます。箱自体はウィジェットを表示する領域(パネルやキャンバス)であり、スロットはその箱の中に配置するアイテムを整理するための区画です。
スロットを使うことで、アイテムを特定の場所に固定したり、間隔を調整したり、グループ化したりすることができます。仕切り板を追加したり移動したりすることで、アイテムを箱内に適切に配置できます。
同様に、ウィジェットをスクリーン上に表示する際にも、スロットを使用してウィジェットを配置することができます。スロットは、ウィジェットの表示位置やサイズを調整するための指標として機能し、ウィジェット同士をグループ化して管理することができます。
このように、スロットは物理的な領域を仕切る仕切り板に例えることができます。それにより、ウィジェットを整理し、適切に配置することができます。
【重要】キャンバス・スロット・ウィジェットについて
クリックすると開きます。
- キャンバス(Canvas):
- キャンバスは、グラフィックスやUI要素を描画するための領域やコンテナとして機能するコンポーネントです。
- 例えば、ゲームの画面全体やメニュー画面は、キャンバス上に配置されます。
- キャンバスは描画オブジェクトを配置するための基本的な要素であり、UIのルート要素となることが多いです。
例えると、キャンバスは絵を描くための白紙のようなものです。
キャンバスはグラフィックスやUI要素を描画するための領域やコンテナであり、その上に絵や図形、テキスト、UI要素などを配置することができます。
絵画のキャンバスが描かれる前は何もない状態で、アーティストやデザイナーがイメージを具現化するための基盤となります。
同様に、UIのキャンバスも空の状態から開始され、ウィジェットやUI要素が配置されることで、ユーザーが操作したり情報を表示したりするためのインターフェースとなります。
ですので、キャンバスは絵を描くための白紙として捉えることができます。
- スロット(Slot):
- スロットは、UI要素やウィジェットを配置するための特定の場所や位置を表す概念です。
- 通常、親要素(例えば、コンテナ)内に作成され、子要素(例えば、ウィジェット)を特定の位置や順序で配置するために使用されます。
- スロットを使用することで、UI要素の位置や配置を細かく制御することができます。
初心者向けの例: スロットは、アイスキャンディの製造工場のアイスキャンディ形状の型です。
アイスキャンディの材料を型のスロットに注ぎ込むことで、特定の形状になるように制御します。
- ウィジェット(Widget):
- ウィジェットは、ユーザーインターフェース(UI)内で表示や操作を可能にする具体的な要素です。
- ウィジェットはボタン、テキストフィールド、チェックボックス、スライダーなど、機能や目的に応じてさまざまな種類があります。
- ユーザーが直接操作したり、情報の表示や入力を受けたりするために使用されます。
初心者向けの例: ウィジェットは、自動車のダッシュボードのボタンやメーターのようなものです。
ボタンでドアを開け閉めすることができたり、メーターで速度や燃料の残量を見ることができます。
キャンバスはコンテナや描画領域、スロットは位置や配置を表し、ウィジェットは具体的な操作や表示を担当する要素として理解することができます。
キャンバスとスロットの違いあなたの部屋にホワイトボード(キャンバス)があると想像してください。
ホワイトボードはメモや絵、リマインダーなどを書くための空白のスペースです。
このホワイトボードには、予め決められたセクションや指定された領域(スロット)があり、例えば「やることリスト」、「重要な日付」、「インスピレーションの引用」などのラベルがついています。
これらのセクションや指定された領域は、ホワイトボード上のスロットであり、特定のカテゴリーに基づいてアイテムをピン留めするための場所です。
例えば、「やることリスト」のセクションにタスクを書き留め、「重要な日付」のセクションには予定されたイベントを書き留め、「インスピレーションの引用」のセクションにはモチベーションを高める引用を書き留めます。
同様に、UIデザインの文脈では、キャンバスはインターフェースをデザインするための全体のスペースや画面を表します。
スロットは、キャンバス内の予め決められたセクションや指定された領域であり、UI要素を意図した目的やレイアウトの要件に基づいて配置するための場所です。
スロットを使うことで、UI要素を効果的に整理し、構造化することができます。
要約すると、ホワイトボードはキャンバスを表し、情報やUI要素を整理するための空白のスペースです。ホワイトボード上の予め決められたセクションや指定された領域は、スロットとして機能し、キャンバス内の特定のアイテムやUI要素をカテゴリー分けして位置づけるのに役立ちます。
つまり、ホワイトボード(キャンバス)の指定された余白部分(スロット)に文字とか画像とかを書く・載せる[オブジェクトを配置](ウィジェット)ことですね。

名前の要素を追加する理由
クリックすると開きます。
canvas_slot:
# Slots 配列に canvas_slot という名前の要素を追加します。
# キャンバス上の特定のスロットを表します。
名前の要素(ここでは "canvas_slot")を追加することで、特定のスロットを識別し、後の処理や設定でそのスロットを参照するために使用されます。
スロットはキャンバス上の特定の領域を表すものであり、名前を指定することでそのスロットに関連するプロパティやウィジェットを設定することができます。
例えば、上記のコードでは "canvas_slot" という名前のスロットに対して、Anchors(配置の基準点や範囲)、Alignment(配置位置)、Offsets(余白)、SizeToContent(コンテンツに合わせたサイズ調整)、Widget(表示するウィジェット)などのプロパティを設定しています。
名前を指定することで、別のスロットと区別し、それぞれのスロットに異なる設定を行うことができます。また、後の処理で特定のスロットを取得したり、他のコンポーネントとの関連付けを行ったりするためにも利用されます。
Anchors := anchors:の詳細
クリックすると開きます。
Anchorsは、キャンバス上のスロットの配置の基準点を指定するためのオブジェクトです。
この例では、Anchorsプロパティは以下のように設定されています。
Anchors := anchors:
Minimum := vector2{X := 0.5, Y := 0.05}
Maximum := vector2{X := 0.5, Y := 0.05}
最小値(Minimum)と最大値(Maximum)の2つのプロパティが指定されています。
それぞれベクトル2D(vector2)オブジェクトです。
- Minimumは、スロットの下端の位置を指定します。
- この例では、X軸方向の位置を0.5、Y軸方向の位置を0.05としています。
- X軸方向の位置はキャンバス幅の相対位置を示し、0.5はキャンバスの中央を表します。
- Y軸方向の位置も相対位置で指定されており、0.05はキャンバスの下端から見て5%の位置を示します。
- Maximumは、スロットの上端の位置を指定します。
- この例でも同様に、X軸方向の位置を0.5、Y軸方向の位置を0.05としています。
この設定により、Anchorsはスロットの配置の基準となり、スロットはMinimumとMaximumで指定された位置の範囲内で配置されることになります。
具体的には、この設定ではキャンバスの中央上部にスロットが配置されるようになります。
Anchorsはスロットの配置を指定するアンカーポイントであり、MinimumとMaximumの値によってスロットの位置が決まる、と言えます。

anchorsは、ウィジェットの親要素に対する位置やサイズ調整を行うためのアンカーポイントを表す構造体です。
アンカーポイントは、左上を原点とした相対的な位置を表します。
左上を (0.0, 0.0)、右下を (1.0, 1.0) とした座標系で表されます。
anchors構造体は以下のデータメンバを持っています。
- Minimum (vector2):
- 最小のアンカーポイントを示します。
- つまり、ウィジェットの左上の位置です。
- この値は、0.0 ~ 1.0 の範囲で指定します。
- たとえば、(0.2, 0.4) と指定すると、親要素の幅や高さに対して、左端から20%、上端から40% の位置にウィジェットが配置されます。
- Maximum (vector2):
- 最大のアンカーポイントを示します。
- つまり、ウィジェットの右下の位置です。
- 同様に、この値も 0.0 ~ 1.0 の範囲で指定します。
- 例えば、(0.8, 0.6) と指定すると、親要素の幅や高さに対して、右端から80%、下端から60% の位置にウィジェットが配置されます。
これらのアンカーポイントによって、ウィジェットは親要素内で自動的に位置やサイズが調整されます。
たとえば、アンカーポイントを (0.0, 0.0) と (1.0, 1.0) に設定すると、ウィジェットは親要素いっぱいに広がるようになります。
アンカーポイントを理解すると、ウィジェットの配置やサイズを柔軟に制御することができます。
例えば、ウィンドウのリサイズに伴ってウィジェットが自動的に調整されるようにする場合などに活用されます。

vector2について
クリックすると開きます。
vector2は、2次元のベクトルを表す構造体で、その要素は浮動小数点数(float)です。
vector2構造体は以下のデータメンバを持っています。
- X(float):
- ベクトルのx成分を表します。
- x軸方向の値を保持します。
- Y(float):
- ベクトルのy成分を表します。
- y軸方向の値を保持します。
vector2を使うことによって、2次元空間内で位置や方向などを表現することができます。
たとえば、座標系上の点の位置や、ベクトルの加減算、スカラー倍などの演算を行う際に使用されます。
例えば、ベクトル v1 を (3.0, 4.0)、ベクトル v2 を (1.5, 2.0) とすると、v1.X は 3.0、v1.Y は 4.0、v2.X は 1.5、v2.Y は 2.0 の値を持ちます。
ベクトル演算では、ベクトル同士の和や差を計算したり、ベクトルにスカラーを掛けたりすることが一般的です。
このような演算を通じて、位置の変更やオブジェクトの移動などを柔軟に扱うことができます。
Mini,Maxの詳細
クリックすると開きます。
Minimum := vector2{X := 0.5, Y := 0.05}
# Anchors の Minimum プロパティを指定された値で設定します。
# スロットの下端の位置を設定します。
Maximum := vector2{X := 0.5, Y := 0.05}
# Anchors の Maximum プロパティを指定された値で設定します。
# スロットの上端の位置を設定します。
上記のコードは、"Minimum" と "Maximum" という2つのベクトルを定義しています。
これらのベクトルは、ウィジェットのスロットの位置を指定するためのアンカーポイントの範囲を示します。
- "Minimum" ベクトル:
- このベクトルは、スロットの下端の位置を設定します。
- 具体的には、X 成分が 0.5、Y 成分が 0.05 の値を持ちます。
- X 成分の値が 0.5 となっているため、スロットの位置は親要素の幅の中央に配置されます。
- Y 成分の値が 0.05 となっているため、スロットの位置は親要素の下端から上方向に 5% の位置となります。
- "Maximum" ベクトル:
- このベクトルは、スロットの上端の位置を設定します。
- 同様に、X 成分が 0.5、Y 成分が 0.05 の値を持ちます。
- X 成分の値が 0.5 となっているため、スロットの位置は親要素の幅の中央に配置されます。
- Y 成分の値が 0.05 となっているため、スロットの位置は親要素の上端から下方向に 5% の位置となります。
これにより、"Minimum" ベクトルと "Maximum" ベクトルによって定義された範囲内でスロットが配置され、親要素内での縦方向における位置が指定されます。
Alignment := vector2{X := 0.5, Y := 0.0}の詳細
クリックすると開きます。
Alignment := vector2{X := 0.5, Y := 0.0}
上記のコードは、"Alignment" というベクトルを定義しています。このベクトルは、canvas_slot(キャンバス内のスロット)の配置位置を指定するためのプロパティです。
- "Alignment" ベクトル:
- このベクトルは、スロットの配置位置を設定します。
- 具体的には、X 成分が 0.5、Y 成分が 0.0 の値を持ちます。
- X 成分の値が 0.5 となっているため、スロットは親要素の幅の中央に配置されます。
- Y 成分の値が 0.0 となっているため、スロットは親要素の上端に配置されます。
つまり、"Alignment" ベクトルによってスロットが配置される位置は、親要素内での横方向には中央、縦方向には上端となります。
"Alignment" ベクトルは、スロットが親要素内でどの位置に配置されるかを指定するものです。
X 成分が 0.5 となっているため、スロットは親要素の幅の中央に位置します。
Y 成分が 0.0 となっているため、スロットは親要素の上端に位置する感じですね。

このように、ベクトルの値によってスロットの配置位置を自由に指定することができます。
canvas_slot構造体の詳細
クリックすると開きます。
Alignment := vector2{X := 0.5, Y := 0.0}
# canvas_slot の Alignment プロパティを指定された値で設定します。
# スロットの配置位置を設定します。
canvas_slot構造体は、Verse言語で使用される、キャンバスウィジェットのスロットを表すためのデータ構造です。
以下に、canvas_slot構造体のメンバーについて説明します。
- Anchors:
- ウィジェットのマージンと親要素に対するリサイズ方法を定義する値です。値の範囲は0.0から1.0の間です。
- Offsets:
- ウィジェットのサイズと位置を定義するオフセットです。
- アンカーポイントが正しく定義されている場合、Offsets.LeftはアンカーのMinimum.Xからの距離をピクセル単位で表します。
- Offsets.BottomはアンカーのMaximum.Yからの距離をピクセル単位で表し、ウィジェットのサイズを制御します。
- アンカーポイントが正しく定義されていない場合、Offsets.LeftとOffsets.Topはウィジェットの位置を示し、Offsets.RightとOffsets.Bottomはウィジェットのサイズを表します。
- SizeToContent:
- trueの場合、ウィジェットの目的のサイズを使用します。Offsetsによって計算されたサイズは無視されます。
- Alignment:
- ウィジェットのピボット/原点位置を示すアライメント(配置)です。左上(0.0,0.0)を起点とし、右下(1.0,1.0)で終わります。
- ZOrder:
- このスロットのZオーダー(レンダリング順)です。他のスロットに対して相対的に設定され、値が高いほど最後にレンダリングされます(つまり、表示上は最前面に表示されます)。
- Widget:
- このスロットに割り当てられたウィジェットです。このウィジェットがスロット内に配置されます。
canvas_slot構造体を使用することで、キャンバスパネル内でのウィジェットの配置やサイズ、リサイズの方法、描画順序などを指定することができます。
Alignmentを深堀りAlignment(アライメント)は、canvas_slot構造体のメンバーの1つであり、ウィジェットのピボットまたは原点位置を指定します。
具体的には、ウィジェットが配置されるキャンバス内での位置関係を制御します。
Alignmentは、2次元ベクトルで表されます。
一般的には、vector2{X, Y}という形式で表現されます。X成分とY成分は、それぞれ0.0から1.0の範囲の値を取ることができます。
- X 成分は、ウィジェットの水平方向(横方向)での位置を表します。
- 値が0.0の場合、ウィジェットはキャンバスの左端に位置します。
- 値が1.0の場合、ウィジェットはキャンバスの右端に位置します。
- 値が0.5の場合、ウィジェットはキャンバスの中央に位置します。
- Y 成分は、ウィジェットの垂直方向(縦方向)での位置を表します。
- 値が0.0の場合、ウィジェットはキャンバスの上端に位置します。
- 値が1.0の場合、ウィジェットはキャンバスの下端に位置します。
- 値が0.5の場合、ウィジェットはキャンバスの中央に位置します。
Alignmentの値を変更することで、ウィジェットのキャンバス内での配置位置を自由に調整することができます。たとえば、X成分を0.5、Y成分を0.5とすると、ウィジェットはキャンバスの中央に配置されます。
注意点として、ウィジェットのサイズも考慮する必要があります。Alignmentは、ウィジェットのピボットまたは原点位置を指定するだけであり、ウィジェット自体の実際の大きさや配置には直接的な影響は与えません。
ウィジェットのサイズとAlignmentの組み合わせによって、最終的な配置が決まります。
したがって、Alignmentを適切に設定することで、キャンバス内でのウィジェットの配置や位置を柔軟に制御することができます。
詳しくは以下の記事を参考にどうぞ。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}の詳細
クリックすると開きます。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
# canvas_slot の Offsets プロパティを指定された値で設定します。
# スロットの上下左右の余白を設定します。
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}は、Canvas内のcanvas_slotと呼ばれるスロットの上下左右の余白を設定するためのプロパティです。
余白(Offsets)は、要素の周囲にスペースを追加するために使用されます。このプロパティでは、上部(Top)、左側(Left)、下部(Bottom)、右側(Right)の余白をそれぞれ指定することができます。
例えば、Offsets := margin{Top := 10, Left := 20, Bottom := 10, Right := 20}とすると、上部に10ピクセル、左側に20ピクセル、下部に10ピクセル、右側に20ピクセルの余白が追加されます。
しかし、今回の上述したコードでは、全ての余白が0.0と設定されています。これは、canvas_slotの周囲に余白を追加せず、要素をできる限りスロットの範囲いっぱいに広げることを示しています。
余白は要素の周囲に追加のスペースを与えるための設定であり、上下左右の余白の大きさをピクセル単位で指定することができます。
このコードでは、余白はゼロに設定されているため、要素はスロットの領域全体を占めるように配置されます。

margin構造体について
クリックすると開きます。
margin structは、ウィジェットとその隣接要素との間の余白(スペース)を指定するためのデータ構造です。この構造体は、上下左右のエッジごとに余白の値を保持します。
具体的な要素について以下に説明します。
- Left(左エッジの余白):
- ウィジェットとその左側の要素との間のスペースを指定します。マージンの単位は、1080p解像度におけるピクセルの幅を1.0とした単位です。
- Top(上エッジの余白):
- ウィジェットとその上側の要素との間のスペースを指定します。
- Right(右エッジの余白):
- ウィジェットとその右側の要素との間のスペースを指定します。
- Bottom(下エッジの余白):
- ウィジェットとその下側の要素との間のスペースを指定します。
これらの余白は、隣の要素との間に空白領域を作成するために使用され、ウィジェットの配置やデザインの制御に役立ちます。マージンの値は、ピクセル単位ではなく、1080p解像度におけるピクセルの幅を1.0とした比率で指定されます。
margin structはウィジェットの上下左右周辺に追加のスペースを指定するためのデータ構造です。
これにより、ウィジェットとその隣接要素との間に指定したピクセル数の余白が生まれ、ウィジェットのデザインや配置の柔軟性を高めることができますね。

SizeToContent := true
クリックすると開きます。
SizeToContent := true
# canvas_slot の SizeToContent プロパティを true に設定します。
# スロットを内部のコンテンツに合わせてサイズ調整するかを指定します。
SizeToContent := trueは、canvas_slotのサイズを内部のコンテンツに合わせて自動的に調整するためのプロパティです。
通常、ウィジェットや要素のサイズは、事前に指定された固定値に基づいて設定されます。しかし、SizeToContentをtrueに設定すると、canvas_slotは内部のコンテンツのサイズに応じて自動的にサイズを調整します。
具体的には、canvas_slot内に配置された要素やウィジェットのサイズに合わせて、canvas_slot自体のサイズが自動的に拡大または縮小されます。
これは、内部コンテンツのサイズが動的に変化する場合に便利です。例えば、テキストが動的に変更される場合や、要素が追加または削除される場合などです。
SizeToContentをtrueに設定すると、canvas_slotのサイズが内部のコンテンツに合わせて自動的に調整されます。
つまり、内部の要素のサイズが変わると、canvas_slotのサイズもそれに応じて自動的に変わりますね。
これにより、動的なコンテンツに対して柔軟にサイズを調整することができます。

詳しくは以下の記事にて解説しているので参考にどうぞ。
>> 【UEFN】canvas_slot structとは?メンバーやデータなど徹底解説
falseに設定するとどうなるの?SizeToContentをfalseに設定すると、canvas_slotは内部のコンテンツに合わせて自動的にサイズを調整するのではなく、事前に指定された固定サイズを維持します。
つまり、canvas_slotのサイズは内部のコンテンツのサイズに関係なく、事前に指定されたサイズが維持されます。内部のコンテンツが大きくなったり、変更されたりしても、canvas_slotのサイズは変わりません。
この設定を使用する場合、canvas_slotのサイズを手動で調整する必要があります。内部のコンテンツに合わせてcanvas_slotのサイズを自動的に調整する場合は、SizeToContentをtrueに設定しましょう。
Widget := RemainingTimeWidget
クリックすると開きます。
Widget := RemainingTimeWidgetの部分は、canvas_slot内のスロットに表示するウィジェット(要素)を指定するためのプロパティです。
具体的には、RemainingTimeWidgetという名前のウィジェットをcanvas_slotに設定しています。このウィジェットは、スロット内に表示される残り時間を表示するために使用される感じですね。
ウィジェットは、アプリケーション内で様々な要素やコンポーネントを表すために使用されます。例えば、テキストや画像、ボタンなどの要素がウィジェットとして表現されます。
このコードでは、RemainingTimeWidgetという特定のウィジェットをスロット内に表示するために、canvas_slotのWidgetプロパティにそのウィジェットを設定しています。
この設定により、スロット内に指定したウィジェットが表示されますね。
Widget := RemainingTimeWidgetの部分は、スロット内に表示するウィジェットを指定しています。
具体的には、RemainingTimeWidgetという名前のウィジェットをスロット内に表示するように設定しています。
スロット内には、時間を表示するウィジェットが表示される感じですね。

UIを表示させるための関数
StartCountdown
関数の追加から始まります。
StartCountdown() : void =
Print("Starting countdown")
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
クリックすると開きます。
下記のコードは、UIを表示するための関数である"StartCountdown()"を定義しています。
StartCountdown() : void =
Print("Starting countdown")
この部分は、"StartCountdown()"という関数を定義しています。関数名の後にコロンがあり、voidというキーワードが続いています。ここでは、この関数が何も返さないことを意味しています。
関数内のPrint("Starting countdown")
は、"Starting countdown(カウントダウン開始)"というメッセージを出力するためのコードです。
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
この部分は、PlayerUIという変数が存在する場合に、そのUIにCanvasというウィジェットを追加するという処理を行っています。
MaybePlayerUI?
は、PlayerUIが存在するかどうかを確認するためのコードです。もしPlayerUIが存在する場合、つまり非nullである場合、if文のブロック内の処理が実行される感じですね。
PlayerUI.AddWidget(Canvas)
は、PlayerUIというオブジェクトに対して、AddWidgetという関数を呼び出しています。この関数は、CanvasというウィジェットをPlayerUIに追加するためのものです。
このコードの意義は、Countdownの開始時にメッセージを表示し、UIのPlayerUIオブジェクトが存在する場合に、そのUIにCanvasウィジェットを追加することです。UIの操作や表示に関わる処理をまとめて行うための関数となっています。
深掘り上記のコードの計算式を1つずつ解説します。
StartCountdown() : void
:
StartCountdown()
は関数(メソッド)の名前です。: void
はこの関数が何も返さないことを示しています。
Print("Starting countdown")
:
Print()
は指定したメッセージをコンソールやログに出力するための関数です。"Starting countdown"
というメッセージを出力します。
if (PlayerUI := MaybePlayerUI?)
:
if
ステートメントは条件分岐を行うための制御構造です。PlayerUI := MaybePlayerUI?
は変数PlayerUI
を宣言し、MaybePlayerUI?
という値を代入します。:=
は変数に値を代入(バインド)するための演算子です。MaybePlayerUI?
はMaybePlayerUI
というオブジェクトまたはnull
(値が存在しないことを表す特殊な値)のいずれかを表すことを示します。
PlayerUI.AddWidget(Canvas)
:
PlayerUI
オブジェクトが存在する(MaybePlayerUI?
がnull
でない)場合に、PlayerUI
のAddWidget()
メソッドを呼び出します。AddWidget()
はPlayerUI
にウィジェット(UI要素)を追加するためのメソッドです。Canvas
は追加するウィジェットの種類や内容を表すオブジェクトや変数を示します。
このコードは、まず「Starting countdown」というメッセージを出力し、その後に「PlayerUI」オブジェクトが存在すれば、そのオブジェクトのAddWidget()
メソッドを使ってCanvas
というウィジェットを追加します。
なお、MaybePlayerUI?
は仮の名前であり、実際のコードではこの部分が具体的なオブジェクト名や参照になる場合があります。
if (PlayerUI := MaybePlayerUI?):PlayerUI.AddWidget(Canvas)
クリックすると開きます。
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
このコードは、PlayerUI という変数が存在するかどうかをチェックし、存在する場合は Canvas ウィジェットを追加します。
PlayerUI 変数は、MaybePlayerUI という型の値を保持します。MaybePlayerUI 型は、PlayerUI の値が存在する場合は PlayerUI の値を、存在しない場合は null を保持します。
if 文は、PlayerUI 変数が存在する場合は PlayerUI.AddWidget(Canvas) というステートメントを実行し、存在しない場合は何も実行しません。
PlayerUI.AddWidget(Canvas) ステートメントは、Canvas ウィジェットを PlayerUI に追加します。
このコードの目的は、PlayerUI に Canvas ウィジェットを追加することです。PlayerUI に Canvas ウィジェットを追加することで、PlayerUI にウィジェットが表示されます。
player_uiクラスについて
クリックすると開きます。
player_ui
クラスは、プレイヤーのユーザーインターフェース(UI)にウィジェットを追加したり削除したりするためのメインのインターフェースです。
Verse using statement using { /UnrealEngine.com/Temporary/UI }
上記の行は、/UnrealEngine.com/Temporary/UI
モジュールを使用することを宣言しています。
このモジュールは、player_ui
クラスを含む関連するクラスや機能を提供します。
player_ui
クラスは次の関数を持っています。
AddWidget
- 説明:
- デフォルトの
player_ui_slot
の設定オプションを使用して、ウィジェットをこのplayer_ui
に追加します。
- デフォルトの
- シグネチャ:
- AddWidget(Widget)
- 引数:
Widget
:- 追加するウィジェットの参照。
- 返り値:
- なし
AddWidget
- 説明:
- カスタム
player_ui_slot
の設定オプションを使用して、ウィジェットをこのplayer_ui
に追加します。
- カスタム
- シグネチャ:
- AddWidget(Widget, Slot)
- 引数:
Widget
:- 追加するウィジェットの参照。
Slot
:- ウィジェットの配置やサイズなどの詳細な設定を指定するスロットオブジェクト。
- 返り値:
- なし
RemoveWidget
- 説明:
- 指定したウィジェットをこの
player_ui
から削除します。
- 指定したウィジェットをこの
- シグネチャ:
- RemoveWidget(Widget)
- 引数:
Widget
:- 削除するウィジェットの参照。
- 返り値:
- なし
これらの関数を使用することで、プレイヤーのUIにウィジェットを追加したり削除したりすることができます。
AddWidget
関数は、デフォルトの設定オプションを使用してウィジェットを追加することができますが、より詳細な設定を行いたい場合には Slot
オブジェクトを指定して AddWidget
関数を使用します。
ウィジェットをプレイヤーのUIから削除するには、RemoveWidget
関数を使用して削除したいウィジェットの参照を指定します。
player_ui
クラスは、プレイヤーのUIを操作するための重要なクラスであり、ゲームやアプリケーションでカスタムのユーザーインターフェースを作成したり管理したりする際に使用されます。
countdown_timer_exampleクラスの定義
▼ 下記のコードは、countdown_timer_example
というクラスを定義しています。
このクラスは creative_device
クラスを継承しており、カウントダウンタイマーの例を実装しています。
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
countdown_timer_example := class(creative_device):
@editable
AddMoreTimeButton : button_device = button_device{}
@editable
EndGame : end_game_device = end_game_device{}
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
OnBegin<override>()<suspends> : void =
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
else:
Print("Can't find player")
using { /Verse.org/Simulation }
# Verse.orgのSimulationを使用することを宣言します(インポート)。
using { /Fortnite.com/Devices }
# Fortnite.comのDevicesを使用することを宣言します(インポート)。
countdown_timer_example := class(creative_device):
# countdown_timer_exampleクラスを作成し、creative_deviceクラスを継承します。
@editable
AddMoreTimeButton : button_device = button_device{}
# アクセス可能(編集可能)なプロパティで、button_device型のAddMoreTimeButton変数を宣言し、button_deviceのインスタンスを生成して代入します。
@editable
EndGame : end_game_device = end_game_device{}
# アクセス可能(編集可能)なプロパティで、end_game_device型のEndGame変数を宣言し、end_game_deviceのインスタンスを生成して代入します。
var CountdownTimer : countdown_timer = countdown_timer{}
# countdown_timer型のCountdownTimer変数を宣言し、countdown_timerのインスタンスを生成して代入します。
InitialCountdownTime : float = 30.0
# 初期のカウントダウン時間を表す浮動小数点数のInitialCountdownTime変数を宣言し、30.0で初期化します。
OnBegin<override>()<suspends> : void =
# オーバーライドされたOnBegin関数を定義します。実行中断を可能にする<maintains>フラグが指定されています。戻り値の型はvoidです。
if:
# もし以下の条件がtrueの場合、次のブロック内のコードが実行されます。
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
# FirstPlayerという変数に、Self(countdown_timer_exampleのインスタンス自体)が所属するプレイスペース(Playspace)のプレイヤーを取得して代入します。
PlayerUI := GetPlayerUI[player[FirstPlayer]]
# PlayerUIという変数に、FirstPlayerに関連するプレイヤーUI(User Interface)を取得して代入します。
then:
# 前の条件がtrueの場合に実行されるブロックです。
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
# CountdownTimer変数に、countdown_timerのインスタンスを生成し、MaybePlayerUIとRemainingTimeのパラメーターにそれぞれPlayerUIとInitialCountdownTimeを指定して代入します。
CountdownTimer.StartCountdown()
# CountdownTimerのStartCountdown関数を呼び出してカウントダウンを開始します。
else:
# 前の条件がfalseの場合に実行されるブロックです。
Print("Can't find player")
# メッセージ "Can't find player" を表示します。
クリックすると開きます。
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
上記の行は、/Verse.org/Simulation
および /Fortnite.com/Devices
モジュールを使用することを宣言しています。
これらのモジュールは、ゲームのシミュレーションやデバイスに関連する機能を提供します。
countdown_timer_example := class(creative_device):
上記の行では、countdown_timer_example
というクラスを定義しています。
このクラスは、creative_device
クラスを継承しています。
creative_device
クラスは、ゲーム内のクリエイティブデバイスを表す基本クラスです。
@editable
AddMoreTimeButton : button_device = button_device{}
上記の行では、AddMoreTimeButton
という名前の button_device
型の変数を定義しています。
@editable
アノテーションは、この変数がエディタで編集可能であることを示しています。
@editable
EndGame : end_game_device = end_game_device{}
上記の行では、EndGame
という名前の end_game_device
型の変数を定義しています。
これもエディタで編集可能な変数です。
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
上記の行では、CountdownTimer
という名前の countdown_timer
型の変数と、InitialCountdownTime
という名前の float
型の変数を定義しています。
CountdownTimer
変数は、後で作成されるカウントダウンタイマーのインスタンスを格納するために使用されます。
InitialCountdownTime
変数は、カウントダウンの初期時間を格納します。
OnBegin<override>()<suspends> : void =
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
else:
Print("Can't find player")
上記の行は、OnBegin
というイベントハンドラをオーバーライドしています。
OnBegin
は、ゲームが始まったときに実行されるイベントです。
OnBegin
イベントハンドラでは、以下の処理が行われます:
Self.GetPlayspace().GetPlayers()
を使用して、現在のプレイスペース(ゲーム内のプレイヤーが存在する領域)のプレイヤーリストを取得します。- プレイヤーリストの最初のプレイヤーを
FirstPlayer
変数に代入します。 GetPlayerUI[player[FirstPlayer]]
を使用して、FirstPlayer
のプレイヤーUIを取得し、PlayerUI
変数に代入します。CountdownTimer
変数に、countdown_timer
クラスのインスタンスを生成し代入します。このとき、MaybePlayerUI
パラメータにPlayerUI
をオプション型として渡し、RemainingTime
パラメータにInitialCountdownTime
を設定します。CountdownTimer.StartCountdown()
を呼び出して、カウントダウンを開始します。- もしプレイヤーが見つからない場合(プレイヤーのUIが取得できない場合)、"Can't find player" というメッセージを表示します。
このコードは、ゲームを開始したときにカウントダウンタイマーを作成し、プレイヤーのUIに表示するための処理を行っています。
カウントダウンタイマーの初期時間は InitialCountdownTime
変数で設定されます。
また、プレイヤーが見つからない場合にはエラーメッセージが表示されます。
creative_deviceについて
クリックすると開きます。
creative_device
クラスは、カスタムのクリエイティブデバイスを作成するために継承するクラスです。
このクラスを継承すると、派生クラスは次回の Verse コンパイル時に UEFNコンテンツブラウザに表示されます。
その後、派生した creative_device
のインスタンスは、コンテンツブラウザからシーンにドラッグして配置することができます。
creative_device
クラスは /Fortnite.com/Devices
モジュールで提供されており、カスタムのクリエイティブデバイスの作成に使用されます。以下に、creative_device
クラスの詳細を解説します。
【メンバー】
creative_device
クラスは以下のメンバーを持ちます。
- 関数(Functions):
OnBegin
、OnEnd
、GetTransform
の3つの関数が定義されています。データメンバーはありません。
【関数】
creative_device
クラスが提供する主な関数は次のとおりです。
OnBegin
:- ゲーム体験が始まったときにカスタムのロジックを追加するためにオーバーライドします。ゲームが始まると自動的に呼び出されます。
OnEnd
:- ゲーム体験が終了したときにカスタムのロジックを追加するためにオーバーライドします。
OnEnd
内で生成されたコルーチンは実行されない可能性があるため注意が必要です。
- ゲーム体験が終了したときにカスタムのロジックを追加するためにオーバーライドします。
GetTransform
:creative_device
のトランスフォーム(位置と回転情報)を cm 単位で取得します。
このクラスは、ゲーム体験の開始や終了時にカスタムのロジックを追加するための関数を提供します。
また、デバイスのトランスフォーム情報も取得することができますね。
新しいデバイスを作成する際には、このクラスを継承し、派生クラスに独自のロジックを追加することができます。
@editable AddMore~float = 30.0 までの詳細
クリックすると開きます。
@editable
AddMoreTimeButton : button_device = button_device{}
@editable
EndGame : end_game_device = end_game_device{}
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
上記のコードは、カスタムデバイスを作成するためのコードです。
詳細は以下のとおり。
AddMoreTimeButton: button_device = button_device{}
:
AddMoreTimeButton
は、ボタンデバイスのインスタンスを表す名前です。button_device{}
は、ボタンデバイスを作成してAddMoreTimeButton
に代入する文法です。- このデバイスは、プレイヤーがクリックすると実行されるアクションをトリガーするボタンを表します。
EndGame : end_game_device = end_game_device{}
:
EndGame
は、ゲーム終了デバイスのインスタンスを表す名前です。end_game_device{}
は、ゲーム終了デバイスを作成してEndGame
に代入する文法です。- このデバイスは、ゲームを終了するアクションをトリガーするデバイスを表します。
var CountdownTimer : countdown_timer = countdown_timer{}
:
CountdownTimer
は、カウントダウンタイマーのインスタンスを表す変数名です。countdown_timer{}
は、カウントダウンタイマーを作成してCountdownTimer
に代入する文法です。
InitialCountdownTime : float = 30.0
:
InitialCountdownTime
は、初期カウントダウンの時間を表す変数名です。float
は、浮動小数点数を表すデータ型です。30.0
は、初期カウントダウンの時間を具体的に指定しています。この場合、30.0 秒となります。
このコードは、ゲーム内で使用されるデバイスを定義しています。
具体的には、ボタンデバイス、ゲーム終了デバイス、カウントダウンタイマーを作成しています。

button_deviceクラスの詳細
クリックすると開きます。
button_device
クラスは、ユーザーアクションに応じて他のデバイスをトリガーできるボタンを作成するために使用されるクラスです。
以下に、button_device
クラスの詳細な解説を提供します。
【継承関係】
button_device
クラスは、creative_device_base
クラスから派生しています。creative_device_base
クラスは、creative_object
クラスから派生しています。
【データメンバー】
InteractedWithEvent: listenable(payload)
:- ボタンが GetInteractionTime 秒間の間にエージェントとのインタラクションを正常に行った場合にシグナルが送られます。
- このメンバーにはエージェントの情報が含まれます。
【関数】
Disable
:- このデバイスを無効化します。
Enable
:- このデバイスを有効化します。
GetInteractionTime
:- このデバイスをアクティベートするために必要なインタラクションの期間(秒単位)を返します。
GetMaxTriggerCount
:- このボタンをインタラクションできる最大回数を返します。0から10の範囲で値を持ちます。
- 0 の場合、トリガーカウントに制限はありません。
GetTransform
:- cm 単位で
creative_object
のトランスフォーム(位置と回転情報)を返します。 - 使用前に
creative_object.IsValid
をチェックする必要があります。
- cm 単位で
GetTriggerCountRemaining
:- このボタンが無効化される前にまだインタラクションできる回数を返します。
GetMaxTriggerCount
が無制限の場合、0 を返します。
SetInteractionText
:- ボタンに近づいて注視したときに表示されるテキストを設定します。
- テキストは最大64文字までです。
SetInteractionTime
:- このデバイスをアクティベートするために必要なインタラクションの期間(秒単位)を設定します。
SetMaxTriggerCount
:- このボタンをインタラクションできる最大回数を設定します
MaxCount
は 0 から 10 の範囲内で指定する必要があります。- 0 の場合、トリガーカウントに制限はありません。
button_device
クラスは、エージェントとのインタラクションに応じて動作するボタンデバイスを作成するために使用されます。
このクラスの関数を使用して、ボタンの挙動や制約を設定することができます。
詳しくは公式ドキュメントを参考にしてください。
end_game_deviceクラスの詳細
クリックすると開きます。
end_game_deviceクラスは、現在のラウンドまたはゲームを終了するためのルールを構成するために使用されるクラスです。
詳細は以下のとおり。
■ 使用例:
using { /Fortnite.com/Devices }
EndGameDeviceExample := class(creative_device_base):
OnActivate<override>(Activator):void =
# Activate関数をオーバーライドし、Activatorを引数として受け取ります。
if: Activator.IsValid() then:
# もしActivatorが有効な場合、以下のブロックのコードを実行します。
EndGame(Message := "Game Over")
# EndGame関数を呼び出してゲームを終了します。メッセージ "Game Over" を指定しています。
■ 継承関係:
- creative_object クラスから派生しています。
- creative_device_base クラスから派生しています。
creative_device_base は creative_device から派生しており、creative_object も creative_device_base を継承しています。

■ メンバー:
このクラスには、関数がありますが、データメンバーはありません。
■ 関数:
- Activate関数:
- ラウンドまたはゲームを終了します。
- Activatorのチームを使用して、有効化されたチームが指定されている場合にラウンドまたはゲームが終了するかどうかを判断します。
- Disable関数:
- このデバイスを無効にします。
- Enable関数:
- このデバイスを有効にします。
- GetTransform関数:
- cm単位でcreative_objectの変換行列を返します。
- creative_objectが破棄または破壊されている可能性がある場合は、creative_object.IsValidをチェックした後で呼び出す必要があります。
- そうしないと、実行時エラーが発生します。
OnBegin() : void =~Print("Can't find player")までの詳細
クリックすると開きます。
下記のコードは、OnBegin
関数をオーバーライドしています。
詳細は以下のとおり。
OnBegin<override>()<suspends> : void =
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
else:
Print("Can't find player")
このコードは、ゲームの開始時に実行される処理を定義しています。
まず、以下の条件分岐が行われます。
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
Self.GetPlayspace().GetPlayers()[0]
は、現在のプレイスペースから最初のプレイヤーを取得します。GetPlayers()
関数は、プレイスペース内の全てのプレイヤーを返すリストを取得します。[0]
は最初のプレイヤーを示します。
GetPlayerUI[player[FirstPlayer]]
は、最初のプレイヤーに関連付けられたプレイヤーUIを取得します。
次に、条件分岐の結果によって処理が分岐します。
条件分岐の結果が真(then
)の場合は、以下の処理が実行されます。
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
countdown_timer
は、カウントダウンタイマーを作成するためのクラスです。CountdownTimer
オブジェクトを作成し、MaybePlayerUI
パラメータにはオプションとしてPlayerUI
を設定し、RemainingTime
パラメータには初期のカウントダウン時間を設定します。CountdownTimer.StartCountdown()
は、カウントダウンタイマーを開始します。
条件分岐の結果が偽(else
)の場合は、"Can't find player"
というメッセージが表示されます。
PlayerUI := GetPlayerUI[player[FirstPlayer]]の詳細
クリックすると開きます。
このコードでは、PlayerUI := GetPlayerUI[player[FirstPlayer]]
という行があります。これは、GetPlayerUI
関数を使用してFirstPlayer
という変数に代入された最初のプレイヤーのプレーヤーUIを取得し、PlayerUI
という変数に格納しています。
GetPlayerUI
関数は、プレイヤーに関連付けられたプレーヤーUIを取得するための関数です。
player
という辞書(ディクショナリ)オブジェクトのインデックスとしてFirstPlayer
を使用しています。
この行の目的は、最初のプレイヤーのプレーヤーUIを取得し、それをPlayerUI
という変数に割り当てることです。
プレーヤーUIは、ゲーム内のプレーヤーが情報を表示したり、対話したりするためのインターフェースです。
このコードでは、特定のプレイヤーのプレーヤーUIを取得しているため、そのプレーヤーに対してタイマー情報を表示するために使用される可能性があります。
この行は最初のプレイヤーのプレーヤーUIを取得して、PlayerUI
という変数に保存しています。

PlayerUI := GetPlayerUI[player[FirstPlayer]]
の計算について説明します。
この計算は以下の手順で行われます。
FirstPlayer
という変数からプレイヤーオブジェクトを取得します。GetPlayerUI
関数に取得したプレイヤーオブジェクトを引数として渡します。GetPlayerUI
関数は渡されたプレイヤーオブジェクトに関連付けられたplayer_ui
コンポーネントを返します。- 返された
player_ui
コンポーネントをPlayerUI
という変数に代入します。
要するに、PlayerUI
変数にはプレイヤーオブジェクトの関連付けられたplayer_ui
コンポーネントが代入されます。
このようにすることで、PlayerUI
変数を介してプレイヤーオブジェクトのUI情報にアクセスできます。
各役割は以下のとおりです。
PlayerUI
:- これは変数の名前であり、プレイヤーのユーザーインターフェース(UI)情報を格納するための変数です。
- ユーザーインターフェースは、ゲームやアプリケーションなどのユーザーとの対話や情報の表示を担当します。
:=
:- これは代入演算子です。
- 変数に値を代入するために使用されます。
- この場合、右側の式の値を左側の変数に代入します。
GetPlayerUI
:- これは関数の名前です。
- 関数は特定の処理を実行するためのブロックであり、引数(ここでは
player[FirstPlayer]
)を受け取って結果を返します。 GetPlayerUI
関数は、プレイヤーのUI情報を取得するために使用されます。
player
:- これは変数やオブジェクトの名前です。
- ここでは、プレイヤーオブジェクトを参照するための変数または識別子として使用されています。
[FirstPlayer]
:- これはプレイヤーオブジェクトにアクセスするための参照や識別子です。
FirstPlayer
が特定のプレイヤーオブジェクトを指し示す場合、そのオブジェクトにアクセスするための参照として使用されます。
全体として、このコードは特定のプレイヤーオブジェクトのUI情報を取得し、それをPlayerUI
という変数に代入しています。
これにより、プレイヤーのUI情報にアクセスし、必要に応じて表示や操作を行うことができます。
GetPlayerUIの詳細
クリックすると開きます。
GetPlayerUI
関数は、与えられたプレイヤーオブジェクトに関連付けられたplayer_ui
コンポーネントを返します。
もしプレイヤーに関連付けられたplayer_ui
が存在しない場合は失敗します。
関数のシグネチャは以下のようになります。
GetPlayerUI(Player: player) : player_ui
この関数はPlayer
という引数を受け取り、関連付けられたplayer_ui
コンポーネントを返します。
関数に関する属性と効果についての詳細は以下のとおり。
native
:- この指定子は、要素の定義の詳細がC++で実装されていることを示します。
native
指定子を持つVerseの定義は、開発者がC++の実装を補完することができるC++の定義が自動生成されます。- この指定子はクラス、インターフェース、列挙型、メソッド、データに使用することができます。
public
:- 識別子は一般にアクセス可能です。
- モジュール、クラス、インターフェース、構造体、列挙型、メソッド、データに使用できます。
decides
:- この効果は、関数が失敗する可能性があり、関数呼び出し自体が失敗する可能性があることを示します。
decides
効果を持つ関数定義は、transacts
効果を持たなければなりません。transacts
効果は、関数内のどこかで失敗があった場合、実行されたアクションがロールバック(まるでアクションが行われなかったかのように)できることを意味します。
varies
:- この効果は、同じ入力に対して常に同じ出力が得られるわけではないことを示します。
- また、関数の動作はパッケージの新しいバージョンで変更される可能性があることも示します。
transacts
:- この効果は、関数によって実行されるアクションがロールバックできることを示します。
transacts
効果は、変更可能な変数(var
)が書き込まれる場合に必要です。- コードをコンパイルする際に、ロールバックができない関数に
transacts
効果が追加されたことを通知されます(チェックされます)。 - ただし、このチェックは
native
指定子を持つ関数には行われません。
初心者の方にわかりやすく説明すると、GetPlayerUI
関数は指定されたプレイヤーオブジェクトに関連付けられたplayer_ui
コンポーネントを取得します。
もし関連付けられたplayer_ui
が存在しない場合、この関数は失敗します。
この関数を使用することで、プレイヤーオブジェクトに関連付けられたUI情報にアクセスできます。
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]のSelfの詳細
クリックすると開きます。
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
の部分は以下のように解釈できます。
Self
:Self
は現在のクラスのインスタンスを指します。- つまり、
countdown_timer_example
クラスのインスタンスを指します。
GetPlayspace()
:GetPlayspace
は、現在のインスタンスが所属しているプレイスペース(ゲーム内の領域)を取得する関数です。
Self.GetPlayspace()
:Self
が所属しているプレイスペースを取得します。
.GetPlayers()
:GetPlayers()
は、指定されたプレイスペース内のプレイヤーのリストを取得する関数です。
Self.GetPlayspace().GetPlayers()
:Self
が所属しているプレイスペース内のプレイヤーリストを取得します。
[0]
:- 取得したプレイヤーリストの最初の要素を取得します。
- インデックスは0から始まるため、最初の要素はインデックス0です。
FirstPlayer :=
:FirstPlayer
という変数を宣言し、その右側の値を代入します。- つまり、
FirstPlayer
には最初のプレイヤーが代入されます。
これにより、FirstPlayer
にはcountdown_timer_example
のインスタンスが所属するプレイスペースの最初のプレイヤーが代入されます。
この値は後続のコードで利用され、ゲームのロジックに影響を与える可能性があります。
前提の確認:4つのインスタンスcountdown_timer_example
クラスのインスタンスAddMoreTimeButton
クラスのインスタンスEndGame
クラスのインスタンスCountdownTimer
クラスのインスタンス
【countdown_timer_example 】
countdown_timer_example
クラスのインスタンスは、コードの冒頭で作成されています。
このインスタンスは、countdown_timer_example
クラスのすべての属性とメソッドを保持しています。
【AddMoreTimeButton】
AddMoreTimeButton
クラスのインスタンスと EndGame
クラスのインスタンスも、コードの冒頭で作成されています。
これらのインスタンスは、それぞれ AddMoreTimeButton
クラスと EndGame
クラスのすべての属性とメソッドを保持しています。
【CountdownTimer】
CountdownTimer
クラスのインスタンスは、OnBegin
メソッドで作成されています。
このインスタンスは、CountdownTimer
クラスのすべての属性とメソッドを保持しています。
【AddRemainingTime】
上記のコードでは、CountdownTimer
クラスのインスタンスに対して AddRemainingTime
メソッドが呼び出されています。
このメソッドは、CountdownTimer
クラスのインスタンスによって保持されている RemainingTime
属性の値を増加させます。
また、上記のコードでは、CountdownTimer
クラスのインスタンスに対して CountdownEndedEvent
イベントが待機されています。
このイベントは、CountdownTimer
クラスのインスタンスによって保持されている RemainingTime
属性の値が 0 になったときに発生します。
このイベントが発生すると、EndGame
クラスのインスタンスに対して Activate
メソッドが呼び出されます。
このメソッドは、EndGame
クラスのインスタンスによって保持されているプレイヤーをゲームから終了させます。
@editable
AddMoreTimeButton : button_device = button_device{}
例えば、上記のコードの場合、button_deviceがクラスで、AddMoreTimeButtonはクラスのインスタンスを意味します。

【重要】:PlayerUI := GetPlayerUI[player[FirstPlayer]]のマップについて徹底解説
クリックすると開きます。
PlayerUI := GetPlayerUI[player[FirstPlayer]]
は、PlayerUI
という変数に、FirstPlayer
に関連するプレイヤー UI (User Interface) を取得して代入するコードです。
GetPlayerUI()
メソッドは、プレイヤー UI の辞書を取得します。
player[FirstPlayer]
は、FirstPlayer
に対応するプレイヤーオブジェクトを取得します。
したがって、PlayerUI := GetPlayerUI[player[FirstPlayer]]
は、PlayerUI
という変数に、FirstPlayer
に関連するプレイヤー UI を取得して代入するコードです。
具体的には、PlayerUI
という変数には、FirstPlayer
が操作しているプレイヤーの UI が代入されます。
上記のコードにおける player
は、プレイヤーの辞書を表しています。
player
辞書には、各プレイヤーの ID とプレイヤーオブジェクトのペアが格納されています。
player[FirstPlayer]
は、FirstPlayer
に対応するプレイヤーオブジェクトを取得します。
player[FirstPlayer]
だけで値を取得することはできません。
GetPlayerUI()
メソッドが存在するからです。
GetPlayerUI()
メソッドは、プレイヤー UI の辞書を取得します。
そのため、player[FirstPlayer] は、GetPlayerUI() メソッドによって取得されたプレイヤー UI の辞書から、FirstPlayer に対応する値を取得します。

GetPlayerUI()
関数は、Player に関連付けられた player_ui コンポーネントを取得します。
Player に関連付けられた player_ui が存在しない場合は失敗します。
詳しくは以下の記事をご参照ください。
thenブロックの詳細
クリックすると開きます。

thenブロックに機能性はあるのでしょうか?
はい、then
ブロックは機能的な意味を持ちます。
if
文の条件が真の場合にのみ then
ブロックが実行されます。つまり、条件が満たされた場合に実行すべき処理を then
ブロック内に記述します。
then
ブロックの役割は、条件の成立に応じた処理を明示的に示すことです。
条件が真の場合に実行される処理を then
ブロックに記述することで、コードの可読性やメンテナンス性が向上します。
また、then
ブロックがない場合、条件が真の場合に何も実行しないため、意図せぬバグやエラーの原因となる可能性があります。then
ブロックを明示的に指定することで、条件が真の場合の処理を明確にすることができるのです。
そのため、then
ブロックは条件分岐の一部として重要な役割を果たし、プログラムの意図を明らかにするために利用されます。
はい、一般的には、then
ブロックの代わりに true
を使用することができます。
if
文の構文では、then
ブロックを省略し、代わりに条件式が真の場合に実行される文を改行して書くこともできます。
例としてthenの使用がどのように変わるのか比較してみました。
【then使用時】
var PlayerFallHeight : float = CalculatePlayerFallHeight()
if:
PlayerFallHeight < 3.0
JumpMeter = 100
then:
# ダブルジャンプを実行
ActivateDoubleJump()
# プレイヤーの落下高さをリセット
ZeroPlayerFallHeight()
else:
# プレイヤーにダブルジャンプができないことを示すためにキャラクターの腕を羽ばたかせるアニメーションを実行
ActivateFlapArmsAnimation()
# ダブルジャンプのクールダウンを設定して、Jumpボタンを連打した場合に「腕を羽ばたかせる」アニメーションが不適切に再生されないようにする
SetDoubleJumpCooldown()
【then未使用時】
var PlayerFallHeight : float = CalculatePlayerFallHeight()
if PlayerFallHeight < 3.0:
JumpMeter = 100
ActivateDoubleJump()
ZeroPlayerFallHeight()
else:
ActivateFlapArmsAnimation()
SetDoubleJumpCooldown()
このように、条件式を明示的に改行して表現することで、条件が真の場合に実行される文を一連のブロックとして示すことができます。
ただし、一貫性や可読性の観点から、then
ブロックを使用する方が一般的です。
then
を使うことで、条件式と実行文が明確に区別され、コードの意味をより明確に表現することができます。
また、then
ブロックを使用することで、条件分岐内のコードブロックが視覚的にグループ化されているため、可読性や保守性の向上にも寄与します。
set Countd~downTime}の詳細
クリックすると開きます。
このコードは、新しい CountdownTimer
変数を定義し、countdown_timer
のインスタンスを生成してその変数に代入するものです。
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
# CountdownTimer変数に、countdown_timerのインスタンスを生成し、MaybePlayerUIとRemainingTimeのパラメーターにそれぞれPlayerUIとInitialCountdownTimeを指定して代入します。
CountdownTimer
変数を定義します。
set CountdownTimer =
set
キーワードを使用して CountdownTimer
変数を定義しています。
countdown_timer
のインスタンスを生成します。
countdown_timer{ ... }
countdown_timer
のインスタンスを生成するために、countdown_timer
キーワードを使用しています。
{}
内にインスタンスのパラメーターを指定することができます。
- インスタンスのパラメーターを指定します。
MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime
countdown_timer
のインスタンスのパラメーターを指定しています。インスタンスのパラメーターは、変数名 := 値
の形式で指定されます。
このコードでは以下の2つのパラメーターが指定されています:
MaybePlayerUI := option{PlayerUI}
:MaybePlayerUI
というパラメーターには、option
型でPlayerUI
を値として指定しています。option
型は、値が存在する場合と存在しない場合の2つの状態を持つデータ型です。PlayerUI
はMaybePlayerUI
の値として指定されています。
RemainingTime := InitialCountdownTime
:RemainingTime
というパラメーターには、InitialCountdownTime
の値が指定されています。- おそらく、
InitialCountdownTime
は数値型の変数で、カウントダウンの初期時間を表していると考えられます。
最終的に、生成された countdown_timer
のインスタンスが CountdownTimer
変数に代入されます。
このコードは、新しい CountdownTimer
変数を生成し、countdown_timer
のインスタンスを使ってカウントダウンのタイマーを作成していることを意味します。
インスタンスのパラメーターである MaybePlayerUI
と RemainingTime
には、それぞれ PlayerUI
と InitialCountdownTime
の値が設定されています。
RemainingTime := InitialCountdownTime
の部分は、countdown_timer
のインスタンスのパラメーターを指定しています。
以下に詳しい解説をします。
RemainingTime
は、カウントダウンの残り時間を表すパラメーターです。:=
は、パラメーターへの代入を示す演算子です。InitialCountdownTime
は、変数や定数であることを想定しています。その名前から察すると、初期のカウントダウン時間を表す値であると考えられます。
つまり、RemainingTime
パラメーターには、InitialCountdownTime
の値が代入されています。これにより、カウントダウンのタイマーの初期残り時間が設定されます。
例えば、もし InitialCountdownTime
の値が 10
であれば、RemainingTime
パラメーターには 10
が代入され、カウントダウンの初期残り時間は 10
秒となります。
このように、countdown_timer
のインスタンスを生成する際に、RemainingTime
パラメーターを使用して初期の残り時間を指定することで、カウントダウンタイマーの動作をカスタマイズすることができます。
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
# CountdownTimer変数に、countdown_timerのインスタンスを生成し、MaybePlayerUIとRemainingTimeのパラメーターにそれぞれPlayerUIとInitialCountdownTimeを指定して代入します。
このコードは、新しい CountdownTimer
という変数を作成し、countdown_timer
というオブジェクト(もしくはクラス)のインスタンスを生成して、そのインスタンスを CountdownTimer
変数に代入しています。
具体的には、以下のような処理を行っています。
CountdownTimer
変数を定義します。countdown_timer
オブジェクトのインスタンスを生成します。- 生成されたインスタンスのパラメーター(設定値)を指定します。
MaybePlayerUI
は、選択肢(option
)型のパラメーターで、PlayerUI
の値を持ちます。- これはおそらく、プレイヤーのインターフェースを指定するものです。
RemainingTime
は、残り時間を表すパラメーターで、InitialCountdownTime
の値を持ちます。InitialCountdownTime
は、カウントダウンの初期時間を指定する変数(もしくは定数)です。
つまり、このコードは、countdown_timer
のインスタンスを生成して、プレイヤーのインターフェースと初期残り時間を指定しています。そして、生成されたインスタンスを CountdownTimer
変数に代入しています。
このように、CountdownTimer
変数を使用することで、カウントダウンタイマーの設定値や操作を管理することができるようになります。例えば、CountdownTimer
変数のメソッドを呼び出してタイマーを開始したり、プレイヤーのインターフェースを変更したりすることができます。
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
は、CountdownTimer という変数に countdown_timer オブジェクトのインスタンスが生成されて代入されるコードです。
具体的には、以下のようなことが起こります。
- CountdownTimer という新しい変数が作成されます。
- countdown_timer オブジェクトのインスタンスが生成されます。
- PlayerUI という値が含まれる option 型のオブジェクトが生成され、そのオブジェクトが MaybePlayerUI パラメーターに設定されます。
- InitialCountdownTime の値が取得され、その値が RemainingTime パラメーターに設定されます。
- 上記の設定が反映された countdown_timer オブジェクトのインスタンスが CountdownTimer 変数に代入されます。
すなわち、CountdownTimer 変数には、指定したプレイヤーのインターフェースと初期残り時間が設定されたカウントダウンタイマーのインスタンスが格納されます。
カウントダウンタイマーのインターフェースとは、プレイヤーにカウントダウンタイマーの状態を表示するためのものです。
例えば、残り時間やカウントダウンタイマーの状態(カウントダウン中、終了、中止)などを表示することができます。
カウントダウンタイマーの初期残り時間とは、カウントダウンタイマーが開始されたときに設定される残り時間です。
CountdownTimer 変数には、指定したプレイヤーのインターフェースと初期残り時間が設定されたカウントダウンタイマーのインスタンスが格納されているため、プログラムの他の部分で CountdownTimer 変数を使用して、カウントダウンタイマーの操作や情報を取得することができます。
例えば、プレイヤーインターフェースの表示や残り時間の更新などを行うことができます。
プログラミング初心者向けにわかりやすく解説すると、CountdownTimer 変数は、カウントダウンタイマーの状態や操作を保存しておく箱のようなものです。
CountdownTimer 変数にカウントダウンタイマーの状態や操作を保存しておくことで、プログラムの他の部分からカウントダウンタイマーの状態や操作を取得することができます。
CountdownTimer 変数は、カウントダウンタイマーを操作するための重要な役割を果たしています。
CountdownTimer.StartCountdown()の詳細
クリックすると開きます。
CountdownTimer.StartCountdown()
# CountdownTimerのStartCountdown関数を呼び出してカウントダウンを開始します。
このコードは、CountdownTimer
変数に格納されているカウントダウンタイマーのインスタンスに対して、StartCountdown()
関数を呼び出してカウントダウンを開始するものです。
具体的には、以下のようなことが行われます。
CountdownTimer
変数には、既に生成されたカウントダウンタイマーのインスタンスが格納されています。StartCountdown()
関数は、カウントダウンを開始するためのメソッド(関数)です。CountdownTimer.StartCountdown()
を呼び出すことで、CountdownTimer
変数に格納されているカウントダウンタイマーのインスタンスに対してStartCountdown()
関数が実行されます。
この結果、カウントダウンタイマーが開始され、指定した時間間隔で残り時間が更新されるようになります。
プログラムの他の部分で、カウントダウンタイマーの開始や停止、時間の取得などを行うことができます。
この例では、StartCountdown()
関数を呼び出すことでカウントダウンを開始していますが、他の関数やメソッドを使用して、そのタイマーの動作を制御することも可能です。
else: Print("Can't find player")の詳細
クリックすると開きます。
else:
# 前の条件がfalseの場合に実行されるブロックです。
Print("Can't find player")
# メッセージ "Can't find player" を表示します。
このコードは、条件分岐構造の中の else
ブロックに該当します。条件が前の部分で false
と評価された場合に実行されるブロックです。
具体的には、以下のようなことが行われます。
- 前の条件が
false
と評価された場合、プログラムはelse
ブロックに進みます。 Print("Can't find player")
は、指定したメッセージを表示するためのコードです。- プログラムの実行時に、条件が満たされず
else
ブロックが実行された場合、"Can't find player" というメッセージが出力されます。
このように、else
ブロックは条件が true
でも false
でもない場合に実行される部分です。
プログラムの実行時に特定の条件が満たされていない場合にエラーメッセージを表示するなどの処理を行う際に使用されます。
UIに残り時間が表示されるための関数
▼ このコードは、カウントダウンタイマーの開始時に UI(ユーザーインターフェース)を更新して、画面に残り時間を表示するための関数を提供しています。
以下にコードの解説を行います。
StartCountdown() : void =
Print("Starting countdown")
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
UpdateUI() : void =
if (IntTime := Int[RemainingTime]):
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
StartCountdown() : void =
# カウントダウンの開始メッセージを表示します
Print("Starting countdown")
# プレイヤーのUIが存在する場合には、UIにウィジェットを追加します
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# UIを更新して、画面に残り時間の初期値を表示します
UpdateUI()
UpdateUI() : void =
# 残り時間を整数値に変換します
if (IntTime := Int[RemainingTime]):
# RemainingTimeWidgetに整数値をテキストとしてセットします
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
クリックすると開きます。
StartCountdown() : void =
Print("Starting countdown")
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
StartCountdown()
関数は、カウントダウンの開始時に実行される関数です。"Starting countdown"
というメッセージが表示されます(具体的な動作はメッセージの表示のため、ここでは省略します)。- 次に、
MaybePlayerUI
変数が存在しているかを確認します。 :=
演算子を使用して、MaybePlayerUI
変数をPlayerUI
変数に代入します。PlayerUI
が存在する場合、PlayerUI.AddWidget(Canvas)
を呼び出して、UI にウィジェット(表示要素)を追加します。- さらに、
UpdateUI()
関数を呼び出して、UI を更新し、初期の残り時間を表示します。
UpdateUI() : void =
if (IntTime := Int[RemainingTime]):
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
UpdateUI()
関数は、UI を更新するための関数です。IntTime := Int[RemainingTime]
という行は、RemainingTime
の値を整数に変換し、IntTime
変数に代入することを意味します。if
文によって、IntTime
の値が存在するかどうかをチェックします。RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
は、UI 上の特定のウィジェットのテキストをIntTime
の値に更新するためのコードです。
これらの関数は、カウントダウンタイマーの開始時に UI を更新して、現在の残り時間を表示するために使用されます。
例えば、StartCountdown()
を呼び出すことでカウントダウンが開始され、関数内部で UpdateUI()
が呼び出されて現在の残り時間が UI 上に表示されます。
このように、UI を管理するための関数を用意することで、プログラムの実行時にユーザーにわかりやすく情報を表示したり、状態を更新したりすることができます。
if (PlayerUI :~UpdateUI()の詳細
クリックすると開きます。
# プレイヤーのUIが存在する場合には、UIにウィジェットを追加します
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# UIを更新して、画面に残り時間の初期値を表示します
UpdateUI()
このコードの目的は、プレイヤーのUIが存在する場合にUIにウィジェットを追加し、その後UIを更新して画面上に残り時間の初期値を表示することです。
if (PlayerUI := MaybePlayerUI?):
は、MaybePlayerUI
が存在する場合にPlayerUI
にその値を代入し、プレイヤーのUIが存在することを判定しています。
MaybePlayerUI
はUIの存在をチェックするための変数または関数であると推測されます。
- もしプレイヤーのUIが存在する場合(
PlayerUI
が非null値の場合)は、以下の処理が実行されます。
PlayerUI.AddWidget(Canvas)
は、プレイヤーのUI(PlayerUI
)にウィジェット(Canvas
)を追加することを意味します。Canvas
はUIに表示するためのウィジェットであると推測されます。
UpdateUI()
関数を呼び出すことで、UIを更新して画面上に残り時間の初期値を表示します。UpdateUI()
関数の中身は別途定義されているものと仮定されます。
このコードの意義は、プレイヤーのUIが存在する場合にカウントダウンのタイマーの初期値を画面上に表示することです。
プレイヤーがゲーム内でカウントダウンを開始した場合、このコードを使用してUIを準備し、タイマーの初期値を表示します。
UpdateUI() : void =の詳細
クリックすると開きます。
UpdateUI() : void =
# 残り時間を整数値に変換します
if (IntTime := Int[RemainingTime]):
# RemainingTimeWidgetに整数値をテキストとしてセットします
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
UpdateUI()
は、カウントダウンタイマーのUIを更新するための関数です。以下に解説します。
if (IntTime := Int[RemainingTime]):
Int[RemainingTime]
は、RemainingTime
を整数型に変換する処理です。IntTime := Int[RemainingTime]
という書き方は、Int[RemainingTime]
の結果をIntTime
という変数に代入する意味です。- もし
RemainingTime
が整数に変換可能な値であれば、条件はTrue
となり、以下のコードブロック内の処理が実行されます。
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
RemainingTimeWidget
という表示オブジェクト(ウィジェット)のテキストを設定します。IntTime
を文字列に変換したものを、RemainingTimeWidget
のテキストとして設定します。RemainingTimeWidget.SetText(...)
は、RemainingTimeWidget
のテキストを指定した値に設定するためのメソッドです。
つまり、UpdateUI()
関数では、以下の処理が行われます。
RemainingTime
の値を整数型に変換し、変換後の値をIntTime
という変数に代入します。RemainingTimeWidget
という表示オブジェクトのテキストを、整数値IntTime
を文字列に変換したものに設定します。
結果として、この関数の実行により、カウントダウンタイマーのUIには整数型の残り時間が表示されます。
if (IntTime := Int[RemainingTime]):について
クリックすると開きます。
if (IntTime := Int[RemainingTime]):
は、一連の処理を行うための条件式です。
Int[RemainingTime]
は、RemainingTime
を整数型(整数値)に変換する処理です。- この処理は言語によって異なる場合がありますが、
RemainingTime
の値を整数に変換する役割を果たします。
- この処理は言語によって異なる場合がありますが、
IntTime := Int[RemainingTime]
は、Int[RemainingTime]
の結果をIntTime
という変数に代入する文です。:=
は、変数IntTime
を新たな値で初期化する操作を表します。
if (IntTime := Int[RemainingTime]):
は、IntTime
にInt[RemainingTime]
の結果を代入し、その結果が真(True)または非ゼロの場合に条件が成立するという意味です。
例えば、RemainingTime
が文字列型の変数であり、その値が"10"であったとします。
この場合、Int[RemainingTime]
は文字列の"10"を整数値10に変換します。そして、IntTime
には整数値10が代入されます。
次に、if (IntTime := Int[RemainingTime]):
では、IntTime
に代入された整数値10が条件判定に使われます。
整数値10は真(True)または非ゼロのため、条件は成立することになります。条件が成立すると、その後のコードブロックが実行されます。
一方、Int[RemainingTime]
が整数に変換できない場合、例えばRemainingTime
が文字列型の変数であり、値が"abc"であったとします。
この場合、Int[RemainingTime]
の結果は整数に変換できないため、IntTime
に代入される値はなくなります。
その結果、if (IntTime := Int[RemainingTime]):
条件は偽(False)となり、条件式の中のコードブロックはスキップされます。
要するに、この条件式は、RemainingTime
を整数に変換して、変換結果をIntTime
に代入し、その結果が真または非ゼロであるかどうかを判定するものです。
真であれば条件が成立し、偽であれば条件が成立しないという性質を持っています。
Int[RemainingTime]は、RemainingTimeを整数型(整数値)に変換する理由
クリックすると開きます。
Int[RemainingTime]
は、RemainingTime
を整数型に変換するための操作です。
コードの背景として、おそらくRemainingTime
はカウントダウンの残り時間を表す変数であると推測されます。残り時間をカウントダウンするためには、数値として計算や比較が行える整数型のデータが必要です。
しかし、一部のプログラミング言語では、変数には異なる型(例:文字列、浮動小数点数など)の値を格納することができます。
そのため、RemainingTime
が元々整数型でない場合や、外部からの入力値などで文字列や浮動小数点数になっている可能性があります。
このような場合、カウントダウン処理や比較などの数値操作を正しく行うために、RemainingTime
を整数型に変換する必要があります。
Int[RemainingTime]
を使用することで、RemainingTime
を整数型に変換し、それを後続の処理で利用することができます。
したがって、Int[RemainingTime]
の変換操作は、カウントダウン処理や比較などの数値操作を行うために、RemainingTime
を整数型に変換するために行われるものです。
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))についての詳細
クリックすると開きます。
下記のコードは、RemainingTimeWidget
というウィジェットに整数値をテキストとしてセットするための操作です。
# RemainingTimeWidgetに整数値をテキストとしてセットします
RemainingTimeWidget.SetText(RemainingTimeText(IntTime))
RemainingTimeWidget
は、おそらくカウントダウンの残り時間を表示するためのテキストウィジェットを指します。
このウィジェットに、整数値をテキストとしてセットするために、SetText
というメソッド(関数)が呼ばれています。
RemainingTimeText
は、整数値をテキストに変換するための関数(もしくはメソッド)を表しています。
ここでは、その関数にIntTime
という整数値が渡されており、関数がその値をテキストに変換します。
このコードの意義と記述理由は以下の通りです:
- 残り時間を整数値としてカウントダウンしているため、その値をテキストとして表示する必要があります。
RemainingTimeWidget.SetText
は、ウィジェットにテキストをセットするための操作です。
RemainingTimeText
関数は、整数値をテキストに変換するために使用されます。- 整数値は計算や比較が容易なので、カウントダウンの残り時間を整数値として扱っていることがわかります。
RemainingTimeText
関数には、IntTime
という整数値が渡されます。- この整数値は、
Int[RemainingTime]
の結果として得られた変換後の値です。 RemainingTimeText
関数は、整数値をテキストに変換する処理を行い、その結果をRemainingTimeWidget.SetText
に渡します。
- この整数値は、
つまり、このコードの目的は、整数値をテキストに変換し、そのテキストをRemainingTimeWidget
に表示することです。
これにより、カウントダウンの残り時間がウィジェットに正しく表示されます。
SetText関数について
クリックすると開きます。
SetText
関数は、ウィジェットに表示されるテキストを設定するための関数です。以下に徹底的に解説します。
SetText<message>:void
SetText
関数は、引数としてmessage
というパラメータを取ります。message
は表示するテキストの内容を指定するための引数です。
void
は、SetText
関数が何も返さないことを意味します。つまり、この関数の呼び出しは単にテキストを設定するだけで、戻り値はありません。
このコードの技術的な詳細は以下の通りです:
SetText
関数は、UEFNSetText
という関数の一部であり、Unreal Engineというゲームエンジンの一部です。SetText
関数は、引数のmessage
に指定されたテキストを、関連するウィジェットに表示します。message
は、表示したいテキストの内容を指定するための引数であり、関数呼び出し時に渡す必要があります。void
は、戻り値の型で、何も返さないことを示します。つまり、この関数は単にテキストを設定するだけで、返り値はありません。
つまり、このコードの目的は、SetText
関数を使用して、引数として指定されたテキストをウィジェットに表示することです。
これにより、テキストがウィジェット上に表示されます。プログラミング初心者の方にとっては、この関数を使ってテキストをセットすることで、ユーザーインターフェースの表示を制御することができます。
▼ このコードは、UIの更新頻度を設定するために、TimerTickPeriod
という名前の変数を追加する手順です。
TimerTickPeriod : float = 1.0
# タイマーの「精度」を表し、ティックの頻度を秒単位で表します。
クリックすると開きます。
TimerTickPeriod
は、UIの更新頻度を秒単位で表すための変数です。この例では、値を1.0に設定しています。つまり、UIは1秒ごとに更新されるようになります。
float
は浮動小数点数を表すデータ型です。ここでは、TimerTickPeriod
変数の型を指定するために使用されています。
=
は代入演算子であり、TimerTickPeriod
変数に右辺の値を代入します。定数値の1.0がTimerTickPeriod
に代入されます。
このコードの意義と記述理由は以下の通りです:
- カウントダウンのUIを毎秒ごとに更新するためには、UIの更新間隔を設定する必要があります。
TimerTickPeriod
変数の導入により、更新頻度を秒単位で指定することが可能になります。
- UIの更新頻度は、カウントダウンの処理が1秒ごとに行われるようにするために重要です。
- ユーザーが残り時間の変化を正確に確認できるようにするため、適切な更新頻度を設定する必要があります。
1.0
という値は、秒単位の更新頻度を表しています。- この例では、毎秒UIを更新するために1.0秒が設定されています。
- この値を調整することで、更新頻度を変更することができます。
つまり、このコードの目的は、UIの更新頻度を設定するために、TimerTickPeriod
という変数を導入し、毎秒ごとにUIが更新されるようにすることです。
これにより、カウントダウンの表示が正常に行われ、ユーザーがリアルタイムで残り時間の変化を観察できるようになります。
▼ このコードは、RunCountdown()
という名前のsuspend
指定子を持つ関数を作成し、カウントダウンの実行とUIの更新を制御するために使用します。
StartCountdown() : void =
Print("Starting countdown")
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
spawn:
RunCountdown()
RunCountdown()<suspend> : void =
loop:
Sleep(TimerTickPeriod)
set RemainingTime -= TimerTickPeriod
UpdateUI()
# タイマーの終了
if (RemainingTime <= 0.0):
if (PlayerUI := MaybePlayerUI?):
PlayerUI.RemoveWidget(Canvas)
break
StartCountdown() : void =
カウントダウンを開始する関数 'StartCountdown' の定義
Print("Starting countdown")
# Starting countdown というメッセージを表示する
if (PlayerUI := MaybePlayerUI?):
# もしMaybePlayerUIが存在する場合、それを PlayerUI として代入する
PlayerUI.AddWidget(Canvas)
# PlayerUI にウィジェット(Canvas)を追加する
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
# UI を更新するための関数 UpdateUI を呼び出す
spawn:
# 新しい非同期タスクを作成する
RunCountdown()
# RunCountdown 関数を実行する
RunCountdown() : void =
バックグラウンドでカウントダウンを実行する RunCountdown 関数の定義
loop:
# 無限ループを開始する
Sleep(TimerTickPeriod)
# TimerTickPeriod 分だけ実行を一時停止する
set RemainingTime -= TimerTickPeriod
# RemainingTime から TimerTickPeriod を引いて、残り時間を更新する
UpdateUI()
# UI を更新するための関数 UpdateUI を呼び出す
if (RemainingTime <= 0.0):
# もし残り時間が 0.0 以下になった場合
if (PlayerUI := MaybePlayerUI?):
# もし MaybePlayerUI が存在する場合、それを PlayerUI として代入する
PlayerUI.RemoveWidget(Canvas)
# PlayerUI からウィジェット(Canvas)を削除する
break
# ループから抜ける(カウントダウン終了)
クリックすると開きます。
StartCountdown(): void =
Print("Starting countdown")
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
UpdateUI()
spawn:
RunCountdown()
RunCountdown()<suspend>: void =
loop:
Sleep(TimerTickPeriod)
set RemainingTime -= TimerTickPeriod
UpdateUI()
if (RemainingTime <= 0.0):
if (PlayerUI := MaybePlayerUI?):
PlayerUI.RemoveWidget(Canvas)
break
詳細は以下のとおりです。
StartCountdown()
関数は、カウントダウンのタイマーを開始し初期化するために使用されます。StartCountdown()
関数では、カウントダウンが開始されたことを示すメッセージを表示します(例:Print("Starting countdown")
)。MaybePlayerUI
という変数が存在する場合にのみ、PlayerUI(プレイヤーのユーザーインターフェース)にウィジェットを追加します。PlayerUI.AddWidget(Canvas)
のように、ウィジェットをUIに追加することで、カウントダウンの表示を行います。
UpdateUI()
関数は、UIの状態を更新し、現在の残り時間を表示することで、ユーザーインターフェースに変更を反映します。spawn:
キーワードは、新しい非同期タスクを作成します。- これにより、
RunCountdown()
関数がバックグラウンドで実行され、カウントダウンとUIの更新が同時に行われます。
- これにより、
RunCountdown()
関数では、loop:
キーワードによって無限ループが開始されます。- カウントダウンのために定期的な待機(
Sleep(TimerTickPeriod)
)と残り時間の更新(set RemainingTime -= TimerTickPeriod
)が行われます。
- カウントダウンのために定期的な待機(
UpdateUI()
関数は、UIを更新し、残り時間を表示するために呼び出されます。if (RemainingTime <= 0.0)
条件は、残り時間が0.0以下になった場合に実行されます。- これはカウントダウンが終了したことを意味し、UIからカウントダウンが消えるようになります。
PlayerUI.RemoveWidget(Canvas)
は、PlayerUIからカウントダウンのUI要素(Canvas)を削除するために使用されます。break
ステートメントは、ループを終了させます。- カウントダウンが終了した後にループを抜けることで、タスクの実行が停止します。
つまり、このコードの目的は、カウントダウンの開始、タイマーの更新、UIの制御を行うためにsuspend
指定子を持つsuspend
関数(RunCountdown()
)を作成し、StartCountdown()
から呼び出すことです。
これにより、カウントダウンの実行とUIの表示を管理し、カウントダウンが0.0に達した際にUIからカウントダウンを消去します。
StartCountdown~untdown")の詳細
クリックすると開きます。
StartCountdown() : void =
Print("Starting countdown")
このコードは、StartCountdown
という関数を定義しています。関数の定義では、void
という型が指定されています。void
型は何も返さないことを表します。
関数の中で、Print
関数が実行されています。この関数は、「Starting countdown」というメッセージをコンソールやデバッグログに表示します。
このメッセージの目的は、カウントダウンが開始されたことをユーザーや開発者にフィードバックするためです。
Print
文は、プログラミングにおいてデバッグやユーザーとの対話のためにメッセージや情報を表示する際に使われます。
要するに、このコードは、「Starting countdown」というメッセージを表示することで、カウントダウンを開始することを知らせるものです。
if (PlayerUI := MaybePlayerUI?):~UpdateUI()までの詳細
クリックすると開きます。
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
詳細は以下のとおりです。
MaybePlayerUI
をPlayerUI
として取得します。:=
は、代入演算子と呼ばれる機能で、新たな変数への値の代入と同時にその値を参照することができます。
PlayerUI
に対してAddWidget(Canvas)
の処理を行います。AddWidget(Canvas)
では、Canvas
というウィジェットをPlayerUI
に追加します。- ウィジェットは、グラフィカルな要素や表示領域の一部を指すものです。
UpdateUI()
の呼び出しを行います。- これはUI(ユーザーインターフェース)を更新するための関数です。
- タイマーの開始時にUIを更新し、画面に
RemainingTime
(残り時間)の初期値を表示するために使われます。
意義と記述理由は以下のとおりです。
MaybePlayerUI
が存在する場合、つまりゲームやアプリケーションのUIの一部であるPlayerUI
が利用可能な場合に、そのUIにCanvas
ウィジェットを追加します。- これにより、UIにカウントダウンの描画や表示のための要素が追加されます。
- また、
UpdateUI()
の呼び出しによってUIを更新することで、ユーザーにタイマーの初期値(RemainingTime
)を表示します。- これにより、ユーザーはタイマーの開始時に正しい初期値を目視で確認できます。
これによって、ゲームやアプリケーションのUIを適切に設定し、タイマーの開始時に初期値を表示することができます。
AddWidgetについての詳細
クリックすると開きます。
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
PlayerUI.AddWidget(Canvas)
のコードは、PlayerUI
ウィジェットに Canvas
ウィジェットを追加します。
PlayerUI
ウィジェットは、ユーザーインターフェイスの要素を表すウィジェットです。Canvas
ウィジェットは、キャンバスを表すウィジェットです。
AddWidget
メソッドは、ウィジェットをウィジェットツリーに追加します。
ウィジェットツリーは、ウィジェットを階層的に管理するデータ構造です。
ウィジェットツリーは、ウィジェットを画面に表示するために使用されます。
AddWidget
メソッドの引数は、追加するウィジェットです。この場合、Canvas
ウィジェットが引数として渡されています。
AddWidget
メソッドは、ウィジェットをウィジェットツリーに追加し、ウィジェットを画面に表示します。
UpdateUI()~タイマーの終了までの詳細
クリックすると開きます。
UpdateUI()
spawn:
RunCountdown()
RunCountdown()<suspend> : void =
loop:
Sleep(TimerTickPeriod)
set RemainingTime -= TimerTickPeriod
UpdateUI()
# タイマーの終了
コードの解説は以下のとおりです。
このコードは、タイマーを実行するための処理を示しています。
UpdateUI()
:- UIを更新するための関数を呼び出します。
- これは、タイマーの進行状況や残り時間をUI上で表示するために使用されます。
spawn
:- 非同期の実行コンテキストを作成します。
- これは、タイマーを実行するための並列処理を開始するために使用されます。
RunCountdown()<suspend> : void
:RunCountdown
という関数を定義します。<suspend>
は、関数が一時停止可能であることを示すアノテーションです。void
は、この関数が何も返さないことを示します。
loop
:無限ループを開始します。- 以下の処理は、このループ内で繰り返し実行されます。
Sleep(TimerTickPeriod)
:- 指定された時間(
TimerTickPeriod
)だけ待機します。 - これは、一定の時間ごとにタイマーを進めるために使用されます。
- 指定された時間(
set RemainingTime -= TimerTickPeriod
:RemainingTime
変数からTimerTickPeriod
の値を減算し、新しい値をRemainingTime
に設定します。- これにより、タイマーの残り時間が更新されます。
UpdateUI()
:- タイマーの進行状況が更新された後、UIを更新するための関数を呼び出します。
- これにより、最新のタイマー情報をユーザーに表示することができます。
# タイマーの終了
:- このコメントは、タイマーが終了したことを示すものです。
- 実際のコードは省略されていますが、ここにはタイマーの終了処理を記述することができます。
意義と記述理由は以下のとおり。
UpdateUI()
関数の呼び出しによって、タイマーの進行状況や残り時間をUI上で表示し、ユーザーにリアルタイムの情報を提供します。spawn
キーワードによって、RunCountdown()
関数を非同期で実行します。- これにより、タイマー処理がメインのプログラムの実行をブロックせずにバックグラウンドで行われます。
RunCountdown()
関数内のループにより、一定の時間ごとにタイマーを進めることができます。- また、ループ内で
UpdateUI()
関数が呼ばれることで、タイマーの進行状況がUI上で表示されます。
- また、ループ内で
このようにして、タイマーの実行とUIの更新を並列して行うことができます。
減算代入(-=)演算子
クリックすると開きます。
減算代入(-=
)演算子を使用すると、変数の値から指定された値を引いて、その結果を元の変数に再代入することができます。
例えば、以下のコードを考えてみましょう。
set VariableName -= Value
set
:- このキーワードは、変数に新しい値を代入することを示します。
VariableName
:- 値を更新する変数の名前です。
- この変数の現在の値から減算されます。
-=
:- 減算代入演算子です。
- これは、変数の値から右側の値を引いた結果を左側の変数に再代入します。
Value
:- 変数から引かれる値です。
減算代入の動作を理解するために、以下の例を考えてみましょう。
set num -= 7
もしnum
の初期値が10だった場合、set num -= 7
を実行すると、num
の値は3に更新されます。これは、num
の現在の値10から右側の値7を引いた結果を再代入するためです。
つまり、減算代入演算子を利用することで、変数の値から特定の値を引いた結果を取得し、元の変数に再代入できます。
プログラミングにおいて、減算代入演算子はコードをより短く、効率的に書くための方法です。一度に1つの演算を行い、その結果を変数に再代入します。
set RemainingTime~rTickPeriodまでの詳細
クリックすると開きます。
下記のコードは、残り時間 (RemainingTime
) から時間の単位を示す値 (TimerTickPeriod
) を引いて、残り時間を更新するためのコードです。
set RemainingTime -= TimerTickPeriod
# RemainingTime から TimerTickPeriod を引いて、残り時間を更新する
意義・記述理由について以下のとおり。
このコードの意義は、カウントダウンタイマーゲームにおいて時間の経過を表現するために使用されます。
ゲーム内のカウントダウンタイマーでは、一定の時間ごとに残り時間を減らし、プレーヤーに時間制限を与えます。

このコードはその時間の経過を表現するための一部分です。
具体的に解説すると↓
RemainingTime
は、残り時間を表す変数です。- 初期値はあらかじめ設定されています。
TimerTickPeriod
は、時間の単位を示す定数です。- 例えば、1秒ごとに時間を更新する場合、
TimerTickPeriod
は1となります。
- 例えば、1秒ごとに時間を更新する場合、
-=
は、減算代入演算子(minus equals)です。- この演算子を使用することで、変数の値を更新します。
RemainingTime -= TimerTickPeriod
は、RemainingTime
の値からTimerTickPeriod
を引いて、その結果を再びRemainingTime
に代入するという操作を行います。
- この操作により、時間経過後の残り時間が計算されます。
このコードはゲームのメインループなど、定期的に時間を更新する処理内で使用されます。例えば、1秒ごとにタイマーを更新するために、1秒ごとにこの操作が行われます。
RemainingTime から TimerTickPeriod を引くことで、タイマーの残り時間が 1 秒ずつ短くなっていきます。
たとえば、RemainingTime が 10 秒で、TimerTickPeriod が 1 秒の場合、タイマーは 1 秒ごとに 1 秒ずつ減少し、10 秒後にタイマーが切れます。

UpdateUI()の詳細
クリックすると開きます。
下記のコードは、UI(ユーザーインターフェース)を更新するために UpdateUI()
という関数を呼び出すためのコードです。
UpdateUI()
# UI を更新するための関数 UpdateUI を呼び出す
意義・記述理由については以下のとおり。
このコードの意義は、UIの更新を実現するために別途定義された UpdateUI()
関数を呼び出すことです。プログラムの実行中には、データの変化やユーザーの入力に応じて、UIを更新する必要があります。このコードはそのための一部分です。
具体的に解説すると。
UpdateUI()
は、UIを更新するために定義された関数です。- 関数内では、UI要素の表示や値の更新などを行います。
- この関数はプログラムの他の部分とは独立して動作し、UIの更新に関するロジックを集約しています。
UpdateUI()
関数が呼び出されることにより、UIが現在の状態に合わせて更新されます。- 例えば、ゲーム内でスコアやタイマーを表示するために、
UpdateUI()
関数を呼び出すことでスコアやタイマーの値を最新の状態に更新することができます。
- 例えば、ゲーム内でスコアやタイマーを表示するために、
このコードは通常、データの変更や状態の変化に応じて定期的に実行されるメインループ内などで使用されます。
UIの更新が必要な箇所で適切なタイミングで UpdateUI()
関数を呼び出すことで、ユーザーに最新の情報や視覚的なフィードバックを提供することができます。
どうしてspawnを実行する必要があるのか。
クリックすると開きます。
spawn:
RunCountdown()
上記のコードでは、タイマーのカウントダウンを表示するために、非同期処理を使用しています。これは、タイマーのカウントダウンは、ユーザーの操作とは関係なく、独立して実行されるためです。
タイマーのカウントダウンを表示するために、同期処理を使用すると、タイマーのカウントダウンを表示する処理が、ユーザーの操作を待ってしまうことになります。そのため、ユーザーが操作を行ったとしても、タイマーのカウントダウンは表示されないことになります。
非同期処理を使用すると、タイマーのカウントダウンを表示する処理と、ユーザーの操作を処理する処理を並行して実行することができます。そのため、ユーザーが操作を行ったとしても、タイマーのカウントダウンは表示されます。
ループを終了させる
▼ 以下のコードは、残り時間が0以下になった場合に、もし MaybePlayerUI が存在する場合には PlayerUI に代入し、PlayerUI から特定のウィジェットを削除してからループを終了するためのコードです。
if (RemainingTime <= 0.0):
# もし残り時間が 0.0 以下になった場合
if (PlayerUI := MaybePlayerUI?):
# もし MaybePlayerUI が存在する場合、それを PlayerUI として代入する
PlayerUI.RemoveWidget(Canvas)
# PlayerUI からウィジェット(Canvas)を削除する
break
# ループから抜ける(カウントダウン終了)
クリックすると開きます。
if (RemainingTime <= 0.0):
# もし残り時間が 0.0 以下になった場合
if (PlayerUI := MaybePlayerUI?):
# もし MaybePlayerUI が存在する場合、それを PlayerUI として代入する
PlayerUI.RemoveWidget(Canvas)
# PlayerUI からウィジェット(Canvas)を削除する
break
# ループから抜ける(カウントダウン終了)
意義・記述理由は以下のとおり。
このコードの意義は、残り時間が0以下になった時点で、プレーヤーの操作可能なUIを変更するための処理を行うことです。例えば、ゲームのカウントダウンが終了したときに、プレーヤーへの入力を停止するなどの処理を行います。
具体的に解説すると。
if (RemainingTime <= 0.0):
は、残り時間が0以下になった場合の条件文です。- この条件が成立すると、そのブロック内の処理が実行されます。
if (PlayerUI := MaybePlayerUI?):
は、MaybePlayerUI
が存在する場合に、その値をPlayerUI
に代入するためのコードです。:=
は代入演算子であり、変数への代入と同時に値の存在を確認しています。
PlayerUI.RemoveWidget(Canvas)
は、PlayerUI
オブジェクトからCanvas
という特定のウィジェットを削除するためのコードです。- この処理により、UIから不要な要素を取り除きます。
break
は、ループから抜けるためのキーワードです。- カウントダウンが終了し、必要な処理が完了したら、ループを終了します。
このコードは、主にゲームやアプリケーションのカウントダウン機能で使用されることがあります。カウントダウンにおいて、残り時間が0になった時点でUIの変更や処理の終了を行うために、このようなコードが使用されます。
以下(<=)演算子
クリックすると開きます。
「以下」(<=)演算子は、比較演算子の一つであり、左側の値が右側の値以下であるかどうかを判定するために使用されます。
具体的な解説は以下のとおり。
例えば、以下のコードを考えましょう。
MyScore = 4
HighScore = 10
if MyScore <= HighScore:
print("私のスコアはハイスコア以下です!")
このコードでは、MyScore
が HighScore
以下であるかどうかを判定しています。
解説すると↓
<=
演算子は、左側の被演算子(MyScore
)が右側の被演算子(HighScore
)より小さいか、右側と等しい場合に条件が成立します。- つまり、
MyScore
の値がHighScore
の値以下である場合は、条件が真(True)となります。
- つまり、
MyScore
の値は4であり、HighScore
の値は10です。4
は10
以下であるため、条件が成立し、if
文のブロック内の処理が実行されます。
- 上記の場合、条件が成立し「私のスコアはハイスコア以下です!」というメッセージが出力されます。
つまり、<=
演算子は、左側の値が右側の値以下であるかどうかを判定するために使用されるのです。プログラミングで条件分岐や比較演算を行う際に、この演算子が使用されることがよくあります。
if (PlayerUI := MaybePlayerUI?):が必要な理由
クリックすると開きます。
if (PlayerUI := MaybePlayerUI?):
# もし MaybePlayerUI が存在する場合、それを PlayerUI として代入する
if (PlayerUI := MaybePlayerUI?)
の部分は、MaybePlayerUI
がnullでない場合、PlayerUI
に代入する処理です。
MaybePlayerUI
は、nullかもしれない値を表す型です。nullかもしれない値をそのまま処理すると、エラーが発生する可能性があります。そのため、MaybePlayerUI
がnullでない場合、PlayerUI
に代入して、nullチェックを行ったうえで処理を行う必要があります。
具体的には、if (PlayerUI := MaybePlayerUI?)
の処理が実行されると、PlayerUI
にMaybePlayerUI
の値が代入されます。PlayerUI
がnullでなければ、PlayerUI.RemoveWidget(Canvas)
の処理が実行されます。PlayerUI
がnullであれば、何も実行されません。
この処理をすることで、MaybePlayerUI
がnullであっても、エラーが発生することなく処理を実行することができます。

PlayerUI.RemoveWidget(Canvas)についての詳細
クリックすると開きます。
下記のコードは、PlayerUI
というオブジェクトから特定のウィジェット(Canvas
)を削除するための処理です。
具体的な解説をします。
PlayerUI.RemoveWidget(Canvas)
# PlayerUI からウィジェット(Canvas)を削除する
このコードでは、PlayerUI
オブジェクトから Canvas
という特定のウィジェットを削除しています。
解説すると↓
PlayerUI
は、プレーヤーのインターフェース(UI)を管理するオブジェクトを表しています。- UIは画面に表示される要素(ボタン、テキスト、画像など)のことで、ゲームやアプリケーションの操作や表示を行うために重要な役割を果たします。
RemoveWidget()
は、PlayerUI
オブジェクトが持つメソッド(処理)であり、引数に削除する対象のウィジェットを指定します。- この場合、
Canvas
という特定のウィジェットを削除するために使用されています。
- この場合、
このようなコードは、UIの動的な変更や要素の管理が必要な場合に使用されます。ゲームで特定の状況が発生した場合に特定のボタンを非表示にする、アプリケーションで特定の画面に遷移したらメニューを非表示にするなど、UIの操作に用いられます。
具体的に下記のコードの「PlayerUI.RemoveWidget(Canvas)」部分は、カウントダウンが0.0になったときにUIからカウントダウンを消すために使用される関数呼び出しです。
具体的な解説は以下のとおり。
if (PlayerUI := MaybePlayerUI?):
# もし MaybePlayerUI が存在する場合、それを PlayerUI として代入する
PlayerUI.RemoveWidget(Canvas)
# PlayerUI からウィジェット(Canvas)を削除する
このコードは、条件を満たす場合に PlayerUI
オブジェクトの RemoveWidget()
メソッドを呼び出して、Canvas
という特定のウィジェットをUIから削除します。
解説すると↓
PlayerUI
は、プレーヤーのインターフェース(UI)を管理するオブジェクトを参照する変数です。MaybePlayerUI?
は、MaybePlayerUI
というオプション型の変数を指します。オプション型は存在しない場合にはNone
またはNull
となり、実際に値が存在する場合にはその値を保持します。- ここでは、
PlayerUI
の存在を確認するために使用されています。
- ここでは、
PlayerUI
オブジェクトが存在する場合(None
やNull
ではない場合)、RemoveWidget()
メソッドが実行されます。- このメソッドは、
PlayerUI
オブジェクトが持つウィジェットのうち、Canvas
という特定のウィジェットをUIから削除します。
- このメソッドは、
- これにより、カウントダウンが0.0になったとき、必要なUIの変更が行われます。
- 具体的には、
Canvas
を表示している部分がUIから消えます。
- 具体的には、
「意義・記述理由」に関しては、カウントダウンが0.0になった時点で、ユーザーにカウントダウンを表示しないようにするために使用されます。
カウントダウンが終了した後は、ユーザーにはそれ以上のカウントダウン情報を提供する必要がないため、該当するUI要素を削除することが効果的です。
RemoveWidget関数についての詳細
クリックすると開きます。
「RemoveWidget」関数は、指定されたウィジェットをプレーヤーのユーザーインターフェース(UI)から削除するための関数です。
詳細は以下のとおり。
- 関数の名前:
- RemoveWidget
- 関数の種類:
- ネイティブ関数 (Unreal Engine で実装された関数)
- アクセス修飾子:
- パブリック (どこからでもアクセス可能)
- パラメータ:
- Widget (ウィジェット): 削除する対象のウィジェットの参照を受け取るパラメータ
- タイプ: ウィジェット (対象のウィジェットの種類やクラスに応じて異なる)
- 説明: 削除する対象のウィジェットを指定します
この関数は、指定されたウィジェットをプレーヤーのUIから削除するために使用されます。プログラム内でこの関数を呼び出すと、パラメータとして指定したウィジェットがプレーヤーのUIから削除されます。
削除するウィジェットは、アプリケーションやゲームによって異なります。ウィジェットは、ボタン、テキストフィールド、イメージなどのユーザーインターフェースの要素を表すものです。RemoveWidget関数は、特定のウィジェットを取り除くために、そのウィジェットの参照をパラメータとして受け取ります。
この関数の利点は、ユーザーインターフェースを動的に変更する場合に非常に便利です。例えば、特定のイベントが発生した時にボタンを非表示にする、メッセージを更新して表示するなど、ユーザーに対してインタラクティブなUIエクスペリエンスを提供するために使用できます。
breakについての詳細
クリックすると開きます。
「break」とは、制御フローを途中で中断し、ループやスイッチ文などのブロックから抜け出すためのキーワードです。「break」を使用することで、ループの実行を終了することができます。
詳細は以下のとおり。
- 「break」はループやスイッチ文内で使用され、ブロックから抜け出します。
- ループ内で「break」が実行されると、それ以降のループの本体や条件式は無視され、ループからすぐに抜け出します。
- ループ内で「break」が実行されると、次の文またはブロックが実行されます。
- これにより、ループの実行を途中で中断し、特定の条件が満たされた場合や処理が不要になった場合などにループから抜け出すことができます。
以下は、「break」が使用される具体的な例です:
loop:
# ループの本体
expression1
expression2
if (test-arg-block): # 条件が真である場合
break # ループから抜け出す
expression3
expression4
上記のコードでは、ループの本体(expression1、expression2)が実行され、条件が評価されます。
もし条件が真(true)である場合、それ以降の式(expression3、expression4)は実行されずに、ループから抜け出します。条件が偽(false)であれば、次のループのイテレーションが行われます。
「break」を使用することで、特定の条件が満たされた場合にループを終了できるため、プログラムの制御フローを柔軟に制御することができます。

さらに時間を表示させる

このカウントダウン タイマーにさらに時間を追加し、追加した時間をコールアウトとして表示するカスタム仕様の方法を追加したいと思います。
この例では、カウントダウンにさらに時間を追加する方法と、プレイヤーが ボタン の仕掛けとやり取りした際に、追加時間を表示する方法を示します。
公式ドキュメント
次の手順に従って、プレイヤーがボタンの仕掛けとインタラクトしたときにカウントダウン タイマーにさらに時間を追加します。
カウントダウンタイマーに時間を追加する
▼ 「AddRemainingTime」という名前の新しい関数は、カウントダウンタイマーにさらに時間を追加するための関数です。
この関数は以下の手順に従って動作します:
AddRemainingTime(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
UpdateUI()
# 残り時間に指定された時間を追加するための関数
AddRemainingTime(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
UpdateUI()
クリックすると開きます。
- 関数の宣言とパラメータの設定:
AddRemainingTime(Time: float): void
- 「AddRemainingTime」は関数の名前で、カウントダウンタイマーに時間を追加するために使用されます。
- 「Time」は関数に渡される float 型のパラメータです。
- このパラメータは追加する時間の量を指定します。
- RemainingTime の更新:
set RemainingTime += Time
- 「RemainingTime」は、現在の残り時間を表す変数です。
- この行のコードは、現在の残り時間に「Time」の値を加算して更新します。
- つまり、指定された時間だけ残り時間が増えます。
- UI の更新:
UpdateUI()
- 「UpdateUI()」は、UI(ユーザーインターフェース)を更新するための関数です。
- カウントダウンタイマーの表示を即座に新しい残り時間に変更するために呼び出されます。
意義と記述理由は以下のとおり。
この「AddRemainingTime」関数は、ゲーム内のカウントダウンタイマーにさらに時間を追加するために作成されました。
プレイヤーが特定のアクション(ボタンを押すなど)を実行した場合に、「AddRemainingTime」関数を呼び出すことにより、残り時間を増やすことができます。
これは、プレイヤーにゲームの進行をサポートするための追加の時間を提供する一つの方法となります。
関数内のコードでは、まず「RemainingTime」変数に「Time」の値を加算しています。
これにより、指定された時間だけ残り時間が増えます。
次に、「UpdateUI」関数が呼び出されます。
これにより、UIが即座に更新され、プレイヤーに新しい残り時間が表示されます。
UIの更新は、プレイヤーにタイマーの状態が明確に伝わり、ゲームの進行に対するフィードバックが向上します。
計算式の論理set RemainingTime += Time
この式は、RemainingTime
の値にTime
を加算して、その結果をRemainingTime
に代入するという意味です。
具体的には、RemainingTime += Time
はRemainingTime = RemainingTime + Time
と同じ意味です。
つまり、RemainingTime
の現在の値にTime
の値を加えて、その結果をRemainingTime
に再代入することで、RemainingTime
の値が更新されます。
例えば、RemainingTime
の初期値が10で、Time
に5が渡された場合、計算後の結果は15になります。そして、この新しい値が再びRemainingTime
に代入されることにより、RemainingTime
の値が更新されることになります。
この計算式を使用することで、AddRemainingTime
関数が呼び出された際に、指定された時間(Time
)が現在の残り時間(RemainingTime
)に追加されることが実現されます。
加算代入演算子についての詳細
クリックすると開きます。
加算代入演算子 +=
は、変数の値に他の値を加えて、その結果を同じ変数に代入するための演算子です。
VariableName += Value
この式は、VariableName
の値に Value
を加えて、その結果を再び VariableName
に代入します。
例えば、VariableName
の初期値が 10 で、Value
に 5 が渡された場合、VariableName += Value
の計算結果は、VariableName = VariableName + Value
と同じです。
つまり、VariableName
の現在の値(10)に Value
の値(5)を加えて、その結果(15)を再び VariableName
に代入することで、VariableName
の値が更新されます。
加算代入演算子は、定数や変数との演算結果を元の変数に保存する際に便利です。これにより、値の更新を簡潔かつ効果的に行うことができます。
加算代入演算子 +=
の利点は、同じ変数に対する複合的な演算をシンプルに表現できることです。また、他の代入演算子(減算代入、乗算代入、除算代入など)も同様の構文で使用できます。
UpdateUI()関数:UIを更新するための関数
クリックすると開きます。
AddRemainingTime(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
UpdateUI()
UpdateUI()
関数は、UIを更新するための関数です。
カウントダウンタイマーの表示を即座に新しい残り時間に変更するために呼び出されます。
UIの更新は、プレイヤーにタイマーの状態が明確に伝わり、ゲームの進行に対するフィードバックが向上します。
UpdateUI()
関数は、UIを更新する関数です。UIとは、ユーザーインターフェースのことで、ゲーム画面に表示されるテキスト、画像、ボタンなどです。
UpdateUI()
関数は、カウントダウンタイマーの残り時間を表示するUIを更新します。残り時間が変更された際に、UIを即座に更新することで、プレイヤーはタイマーの状態を正確に把握することができます。
たとえば、カウントダウンタイマーの残り時間が10秒になったときに、UpdateUI()
関数が呼び出されると、UIは10秒に変更されます。これにより、プレイヤーはタイマーが10秒になったことをすぐに確認することができます。
UpdateUI()
関数は、ゲームの進行に対するフィードバックにも役立ちます。たとえば、カウントダウンタイマーが終了したときに、UpdateUI()
関数が呼び出されると、UIはゲームオーバー画面に変更されます。
これにより、プレイヤーはゲームオーバーしたことをすぐに確認することができます。
このように、UpdateUI()
関数は、UIを更新することによって、プレイヤーにタイマーの状態とゲームの進行状況を正確に伝えることができます。
InteractedWithEventをサブスクライブし、AddRemainingTime() を呼び出す
▼ 「countdown_timer_example.verse」内でボタンの仕掛けの InteractedWithEvent
をサブスクライブし、プレイヤーがボタンの仕掛けとやり取りした際に AddRemainingTime()
を呼び出します。
カウントダウンタイマーの例を示しています。デバイスが起動し、ボタンが押されるとカウントダウンが始まります。ボタンが押されるたびに指定された時間がカウントダウンに追加されます。また、最初のプレイヤーが見つかった場合にのみカウントダウンが開始されます。
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
countdown_timer_example := class(creative_device):
@editable
AddMoreTimeButton : button_device = button_device{}
@editable
EndGame : end_game_device = end_game_device{}
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
OnBegin<override>()<suspends> : void =
AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
else:
Print("Can't find player")
OnButtonInteractedWith(Agent : agent) : void =
TimeToAdd : float = 20.0
CountdownTimer.AddRemainingTime(TimeToAdd)
# カウントダウンタイマーの例を示すコード
using { /Verse.org/Simulation }
# Verse.org.Simulation モジュールを使用する
using { /Fortnite.com/Devices }
# Fortnite.com.Devices モジュールを使用する
countdown_timer_example := class(creative_device):
# creative_device クラスを継承した countdown_timer_example クラスを定義する
@editable
AddMoreTimeButton : button_device = button_device{}
# 編集可能なプロパティとして AddMoreTimeButton ボタンデバイスを定義する
@editable
EndGame : end_game_device = end_game_device{}
# 編集可能なプロパティとして EndGame 終了ゲームデバイスを定義する
var CountdownTimer : countdown_timer = countdown_timer{}
# カウントダウンタイマーのインスタンス CountdownTimer を定義する
InitialCountdownTime : float = 30.0
# 初期のカウントダウン時間を定義する
OnBegin<override>()<suspends> : void =
# デバイスが始動した際に実行されるメソッド OnBegin を定義する
AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
# AddMoreTimeButton ボタンが押されたときに OnButtonInteractedWith メソッドを呼び出すイベントをサブスクライブする
if:
# 条件文の開始
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
# 最初のプレイヤーを取得する
PlayerUI := GetPlayerUI[player[FirstPlayer]]
# プレイヤーのUIを取得する
then:
# 条件が真の場合の処理
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
# カウントダウンタイマーを準備し初期カウントダウン時間を設定する
CountdownTimer.StartCountdown()
# カウントダウンを開始する
else:
# 条件が偽の場合の処理
Print("Can't find player")
# "Can't find player" というメッセージを表示する
OnButtonInteractedWith(Agent : agent) : void =
# ボタンが押されたときに実行されるメソッド OnButtonInteractedWith を定義する
TimeToAdd : float = 20.0
# 追加する時間を定義する
CountdownTimer.AddRemainingTime(TimeToAdd)
# 追加する時間をカウントダウンタイマーに追加する
クリックすると開きます。
下記のコードは、「countdown_timer_example.verse」というファイル内での動作を示しています。
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
これらは、使用する命名空間(namespace)を定義しています。
Verse.org.Simulation
と Fortnite.com.Devices
の命名空間を使用することを宣言しています。
このコードでは、これらの命名空間内に定義されたクラスやオブジェクトを使用します。
countdown_timer_example := class(creative_device):
countdown_timer_example
というクラスを定義しています。
このクラスは creative_device
クラスを継承しています。creative_device
クラスは、フォートナイト内での創造的な要素を管理するデバイスを表します。
@editable
AddMoreTimeButton : button_device = button_device{}
AddMoreTimeButton
というボタンデバイスのインスタンスを定義しています。
editable
デコレーターを使用して編集可能なプロパティとしてマークしています。
@editable
EndGame : end_game_device = end_game_device{}
EndGame
という終了ゲームデバイスのインスタンスを定義しています。
同様に、編集可能なプロパティとしてマークしています。
var CountdownTimer : countdown_timer = countdown_timer{}
InitialCountdownTime : float = 30.0
CountdownTimer
というカウントダウンタイマーのインスタンスと、InitialCountdownTime
という初期のカウントダウン時間を定義しています。
OnBegin<override>()<suspends> : void =
AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
if:
FirstPlayer := Self.GetPlayspace().GetPlayers()[0]
PlayerUI := GetPlayerUI[player[FirstPlayer]]
then:
set CountdownTimer = countdown_timer{MaybePlayerUI := option{PlayerUI}, RemainingTime := InitialCountdownTime}
CountdownTimer.StartCountdown()
else:
Print("Can't find player")
OnBegin
というオーバーライドされたメソッドが定義されています。
このメソッドは、デバイスが始動した際に実行される処理を定義します。
まず、AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
という行は、AddMoreTimeButton
のボタンが押された時に OnButtonInteractedWith
を呼び出すイベントをサブスクライブしています。
つまり、プレイヤーがボタンを押すと OnButtonInteractedWith
メソッドが実行されます。
次に、if
文が使われています。Self.GetPlayspace().GetPlayers()[0]
によって最初のプレイヤーが取得され、GetPlayerUI[player[FirstPlayer]]
によってそのプレイヤーのUIが取得されます。
プレイヤーが見つかった場合は、カウントダウンタイマーを準備し、カウントダウンを開始します。
プレイヤーが見つからない場合は、「Can't find player」というメッセージが表示されます。
OnButtonInteractedWith(Agent : agent) : void =
TimeToAdd : float = 20.0
CountdownTimer.AddRemainingTime(TimeToAdd)
OnButtonInteractedWith
というメソッドが定義されています。
このメソッドは、ボタンが押されたときに実行され、指定された時間をカウントダウンタイマーに追加する役割を果たします。
TimeToAdd
という変数に20.0という値を代入し、それを CountdownTimer.AddRemainingTime(TimeToAdd)
でカウントダウンタイマーに追加することで、残り時間が増えます。
このコードは、カウントダウンタイマーの例を示しています。プレイヤーがボタンを押すことで時間が追加され、カウントダウンタイマーが更新される仕組みになっています。

AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)の詳細
クリックすると開きます。
下記のコードは、特定のデバイスが始動したときに実行される OnBegin
メソッドを定義しています。
このメソッドは、ゲームプレイ中にカウントダウンタイマーの振る舞いを制御するために使用されます。
OnBegin<override>()<suspends> : void =
AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
詳細は以下のとおりです。
OnBegin<override>()<suspends> : void =
:OnBegin
メソッドの定義を開始します。<override>
は、親クラスからのメソッドをオーバーライドしていることを示します。
<suspends>
は、このメソッドが一時停止可能 (suspensible) であることを示します。- つまり、他のアクションやイベントを待機している間に一時停止できることを意味します。
: void
は、このメソッドが戻り値を返さないことを示します。AddMoreTimeButton.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
:AddMoreTimeButton
ボタンのInteractedWithEvent
イベントにOnButtonInteractedWith
メソッドをサブスクライブ (登録) します。- つまり、
AddMoreTimeButton
ボタンが押された時点でOnButtonInteractedWith
メソッドが呼び出されるようになります。
このコードの目的は、ゲームプレイ中にカウントダウンタイマーに追加の時間を提供するためのボタンイベントを設定することです。
OnButtonInteractedWith
メソッドは、ボタンが押されるたびに実行され、カウントダウンタイマーに追加の時間を指定します。
このように、OnBegin
メソッドとイベントのサブスクライブを組み合わせることで、ボタンのインタラクションに反応してゲームプレイ中のカウントダウンタイマーを制御することができます。
OnButtonInteractedWith(Agent : agent) : void =についての詳細
クリックすると開きます。
OnButtonInteractedWith(Agent : agent) : void =
のコードは、ボタンが押されたときに実行される処理を定義しています。
具体的には、追加の時間をカウントダウンタイマーに提供するための処理が記述されています。このコードブロックは、ボタンのイベントハンドラとして動作し、ボタンが押されるたびにその内容が実行されます。
下に記載されているコードとの関係性はあります。
下に記載されているコードブロックは、OnButtonInteractedWith
メソッドの中に含まれているため、ボタンが押されたときに実行される処理の一部です。
具体的には、追加する時間量 (TimeToAdd
) を CountdownTimer.AddRemainingTime
メソッドに渡すことによってカウントダウンタイマーに時間を追加します。
コードの詳細は以下のとおり。
TimeToAdd : float = 20.0
:TimeToAdd
という名前の変数を宣言し、float
型の値 20.0 を割り当てます。TimeToAdd
変数は、追加する時間の量を示します。ここでは 20.0 秒が追加されます。
CountdownTimer.AddRemainingTime(TimeToAdd)
:CountdownTimer
というオブジェクト (おそらくタイマーを管理するクラス) のAddRemainingTime
メソッドを呼び出します。AddRemainingTime
メソッドは、引数として追加する時間の量 (TimeToAdd
変数) を受け取ります。- この処理によって、カウントダウンタイマーに指定された時間が追加されます。
つまり、OnButtonInteractedWith
メソッドは、ボタンが押されたときに時間の追加処理を行います。
追加する時間量 (TimeToAdd
) を指定し、それをカウントダウンタイマーに追加することで、ゲーム内の時間制限を延長することができます。

AddRemainingTimeメソッドの詳細
クリックすると開きます。
AddRemainingTime<public>(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
このメソッドは、タイマーに時間を追加します。引数で指定された時間がタイマーに追加されます。メソッドが終了すると、タイマーの残り時間は、追加された時間だけ長くなります。
たとえば、タイマーの残り時間が10秒で、AddRemainingTimeメソッドに5秒を渡すと、タイマーの残り時間は15秒になります。
このメソッドは、タイマーの残り時間を表示するUIを更新します。更新されたUIは、タイマーの残り時間を正しく表示します。
わかりやすくいうと、AddRemainingTimeメソッドは、タイマーに時間を追加し、タイマーの残り時間を表示するUIを更新するメソッドです。

using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Simulation }
using { /Fortnite.com/UI }
MakeCountdownTimer<constructor><public>(MaxTime : float, InPlayer : agent) := countdown_timer:
RemainingTime := MaxTime
MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}
countdown_timer := class:
<# このブロックは、countdown_timer class のインスタンスごとに実行されます。
ここに到達した際にキャンバスを設定できます。#>
block:
set Canvas = canvas:
Slots := array:
canvas_slot:
Anchors := anchors:
Minimum := vector2{X := 0.4, Y := 0.3}
Maximum := vector2{X := 0.6, Y := 0.3}
Alignment := vector2{X := 0.5, Y := 0.5 }
Offsets := margin{Top := 0.0, Left := 0.0, Bottom := 0.0, Right := 0.0}
SizeToContent := true
Widget := RemainingTimeTextBlock
canvas_slot:
Anchors := anchors:
Minimum := vector2{X := 0.4, Y := 0.3}
Maximum := vector2{X := 0.6, Y := 0.3}
Alignment := vector2{X := 0.0, Y := 1.0}
Offsets := margin{Top := 0.0, Right := 0.0}
SizeToContent := true
Widget := AddedTimeTextBlock
CountdownEndedEvent<public> : event(float) = event(float){}
StartCountdown<public>() : void =
if (PlayerUI := MaybePlayerUI?):
PlayerUI.AddWidget(Canvas)
# タイマーの開始時に UI を更新して、画面に RemainingTime の初期値を表示します
UpdateUI()
spawn:
RunCountdown()
AddRemainingTime<public>(Time : float) : void =
set RemainingTime += Time
# 時間が追加された際に UI を即座に更新して、より優れたプレイヤー フィードバックを実現します。
UpdateUI()
# シンプルなコールアウトを起動して、追加される時間を表示します。
spawn:
AddedTimeCallout(Time)
MaybePlayerUI<internal> : ?player_ui = false
var RemainingTime<internal> : float = 0.0
RemainingTimeTextBlock<private> : text_block = text_block{}
AddedTimeTextBlock<private> : text_block = text_block{}
RemainingTimeText<localizes><private>(CurrentRemainingTime : int) : message = "{CurrentRemainingTime}"
AddedTimeText<localizes><private>(AddedTime : int) : message = " +{AddedTime}!"
var Canvas<private> : canvas = canvas{}
var TotalTime<private> : float = 0.0
# タイマーの「精度」を表し、ティックの頻度を秒単位で表します。
TimerTickPeriod<private> : float = 1.0
RunCountdown<private>()<suspends> : void =
# TimerTickPeriod を使ってループします。
# UI も毎回更新されます。
loop:
Sleep(TimerTickPeriod)
set TotalTime += TimerTickPeriod
set RemainingTime -= TimerTickPeriod
UpdateUI()
# タイマーの終了
if (RemainingTime <= 0.0):
Canvas.RemoveWidget(RemainingTimeTextBlock)
if (UI := MaybePlayerUI?):
UI.RemoveWidget(Canvas)
CountdownEndedEvent.Signal(TotalTime)
break
AddedTimeCallout<private>(Time : float)<suspends> : void =
if:
PlayerUI := MaybePlayerUI?
IntTime := Int[Time]
then:
AddedTimeTextBlock.SetVisibility(widget_visibility.Visible)
AddedTimeTextBlock.SetText(AddedTimeText(IntTime))
Sleep(2.0)
AddedTimeTextBlock.SetVisibility(widget_visibility.Hidden)
UpdateUI<private>() : void =
if (IntTime := Int[RemainingTime]):
RemainingTimeTextBlock.SetText(RemainingTimeText(IntTime))
追加時間のコールアウト
▼ AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
は、カウントダウンタイマーに追加される時間を表示するためのテキストウィジェットを定義しています。
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
# ウィジェットのテキストブロックを設定する
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
# AddedTimeText関数を定義し、メッセージを生成する
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
クリックすると開きます。
前提として、ウィジェットとは、グラフィカルな要素や表示領域を表すプログラムの部品のことです。
この場合、テキストを表示するためのウィジェットが作成されています。
AddedTimeWidget : text_block
:AddedTimeWidget
は変数名で、テキスト表示に使用されるウィジェットを示しています。text_block
はテキストを表示するための特定のタイプのウィジェットです。= text_block{DefaultTextColor := NamedColors.White}
:=
は右辺の値を左辺に代入する演算子です。text_block{DefaultTextColor := NamedColors.White}
は、text_block
ウィジェットを作成し、そのデフォルトのテキストカラーを白に設定しています。- 外見上の目的で、テキストの色を白に指定しています。
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
は、追加された時間を表示するためのテキストメッセージを定義しています。
AddedTimeText<localizes>
:AddedTimeText
はメッセージ名です。<localizes>
はローカル化 (言語や地域に合わせた対応) をサポートするためのマーカーです。(AddedTime : int)
:(AddedTime : int)
は引数の宣言で、AddedTime
という名前の整数型の引数を示しています。- 引数はメッセージに渡す変数やデータです。
: message = " +{AddedTime}!"
:: message
はメッセージのタイプを示しています。= " +{AddedTime}!"
は、メッセージの実際の内容を示しています。" +{AddedTime}!"
は、追加された時間 (AddedTime
) を表示するためのテキストメッセージです。{ } で囲まれた部分は、変数の値を埋め込むためのプレースホルダーです。
以上が、AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
および AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
の徹底解説です。
AddedTimeWidget
はカウントダウンタイマーに表示するためのテキストウィジェットであり、AddedTimeText
は追加した時間を表示するためのテキストメッセージです。
これにより、プレイヤーがボタンを押したときに追加された時間が表示されます。
もっとわかりやすくコードの1行目で、追加した時間のテキスト ブロックを定義しています。2行目で、追加した時間のテキストを定義しています。そのため、追加した時間はテキスト ブロックに表示されます。
具体的には、コードの1行目で、テキスト ブロックを定義しています。テキスト ブロックは、テキストを表示する UI 要素です。テキスト ブロックの属性である DefaultTextColor は、テキストの色を指定しています。コードでは、テキストの色を白に設定しています。
コードの2行目で、追加した時間のテキストを定義しています。テキストは、プレースホルダーの AddedTime を使用しています。プレースホルダーは、実行時に値が埋め込まれる文字列です。コードでは、プレースホルダーに追加した時間が埋め込まれます。
text_blockについての詳細
クリックすると開きます。
text_blockクラスは、テキストをユーザーに表示するためのウィジェットです。テキストブロックは、表示されるテキストの内容や書式を設定し、ユーザーが閲覧できるようにします。
このクラスは、UE4(Unreal Engine 4)のUIフレームワークの一部であり、ゲームやアプリケーションのユーザーインターフェースにテキストを表示するために使用されます。
text_blockクラスは、widgetクラス(UI要素を描画するための基本クラス)から派生しています。また、text_baseクラス(テキストウィジェットのための基本クラス)を起点としています。
text_blockクラスには、データメンバと関数の両方が存在します。
データメンバ:
- テキストの内容:
- ユーザーに表示するテキストの実際の内容を保持します。
- 書式設定:
- テキストの書式(フォント、サイズ、色など)を指定するための情報が含まれます。
関数:
- テキストの設定:
- テキストブロックに表示するテキストの内容を設定します。
- 書式設定の変更:
- テキストの書式設定(フォントの変更、色の変更など)を行います。
- テキストの取得:
- 表示されているテキストの内容を取得します。
- テキストの表示/非表示の切り替え:
- テキストブロックの表示・非表示を切り替えます。
テキストブロックは、ユーザーに表示する情報を提供するための重要なUI要素です。プログラムやゲームでの情報の表示や、メッセージの表示、ガイドの表示など、様々な場面で利用されます。
text_blockクラスを使うことで、プログラミング初心者でもテキスト情報を簡単に表示することができます。テキストブロックを使用して重要な情報をユーザーに伝えることで、使いやすいインターフェースを作成することができます。
詳しくは以下の記事にて解説しています。
>> 【UEFN】text_block classとは?メンバーやデータ・機能など解説
また、公式ドキュメントはこちらです↓
NamedColorsの詳細
クリックすると開きます。
NamedColorsモジュールは、CSS Color Module 3に基づいたカラープリセットを提供するモジュールです。このモジュールは、特定の名前で識別される色の値を定義しています。
NamedColorsモジュールは、ゲームやアプリケーションの開発において、特定の色を使用する際に便利です。代わりにRGB値やHEX値などを直接指定する代わりに、識別可能な名前を使用して色を指定することができます。
これにより、プログラムコードがわかりやすくなり、色の変更や管理が容易になります。
モジュール名:NamedColors
パス:/Verse.org/Colors/NamedColors
このモジュールは、カラープリセットを提供するための有用な関数や定数を含んでいます。
例えば、「red」や「blue」などの名前で色を指定することができます。これらの名前は、CSS Color Module 3に基づいて定義されており、一般的なカラーネームキーワードが含まれています。
主な意義や利点は以下のとおり。
- カラープリセットの使用:
- NamedColorsモジュールを使用することで、予め定義されたカラープリセットを利用することができます。
- これにより、各種の色を再利用可能で整合性のある方法で管理できます。
- 読みやすいコード:
- 色を名前で指定することにより、プログラムコードが読みやすくなります。
- RGB値やHEX値がコードに直接埋め込まれている場合よりもわかりやすくなります。
- 変更の容易性:
- 色の変更が必要な場合、NamedColorsモジュール内の名前の定義を修正するだけで済みます。
- これにより、色の使用箇所を個別に変更する必要がなくなります。
NamedColorsモジュールを使用することで、プログラミング初心者でも簡単に色を指定および管理することができます。
定義済みのカラーネームキーワードを利用することで、使いやすく保守性の高いプログラムを作成することができます。
詳しくは以下の公式サイトをご参照ください。
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}の詳細
クリックすると開きます。
このコードは、カウントダウンに追加された時間を表示するためのテキストブロックウィジェットの設定を行っています。
text_block{DefaultTextColor := NamedColors.White}
AddedTimeWidget
:- 追加した時間を表示するためのテキストブロックウィジェットの名前です。
- このウィジェットは対話型のプレイヤーインターフェース(UI)上に表示されます。
text_block
:- テキストを表示するためのブロック要素を作成します。
DefaultTextColor := NamedColors.White
:- テキストのデフォルトの文字色を白に設定します。
このウィジェットの目的は、プレイヤーがボタンを操作してカウントダウンに時間を追加したときに、追加された時間を視覚的に表示することです。
テキストブロックウィジェットを使用すると、テキストを表示するための専用の領域が作成され、追加された時間を表示することができます。
NamedColors.White
は、事前に定義されたカラーの一つで、文字色を白に設定することを示しています。
このように設定することで、テキストの視認性を高めることができます。
このコードにより、表示用のテキストブロックウィジェットが作成され、追加時間が表示される準備が整います。
計算式の論理AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
このコードは、テキストブロックウィジェットを作成し、デフォルトの文字色を白に設定しています。
詳細は以下のとおり。
AddedTimeWidget : text_block
:AddedTimeWidget
という名前の変数を作成し、テキストブロックウィジェットのインスタンスを代入しています。
text_block{DefaultTextColor := NamedColors.White}
:- テキストブロックウィジェットのインスタンスを作成しています。
- 中括弧
{}
内には、ウィジェットのプロパティを設定するためのパラメータが記述されます。
DefaultTextColor := NamedColors.White
:DefaultTextColor
というプロパティを設定しています。- このプロパティは、テキストのデフォルトの文字色を指定します。
NamedColors.White
:NamedColors
という事前に定義されたカラーの一部であるWhite
を指定しています。- これは、文字色を白に設定することを意味します。
したがって、この計算式は、AddedTimeWidget
というテキストブロックウィジェットを作成し、そのデフォルトの文字色を白に設定するという意味を持ちます。
このウィジェットは、追加された時間を表示する際に使用されます。
このような設定を行うことで、プレイヤーインターフェース(UI)上に追加時間をわかりやすく表示するための準備が整います。
まとめると変数:型(クラス)=クラス(インスタンスを作成){プロパティ := 値}
変数の宣言と同時にクラス(または型)のインスタンスを代入し、そのインスタンスのプロパティを指定した値と共に初期化しています。
具体的な解釈は次のとおりです。
- 変数(
AddedTimeWidget
)は、特定の型(クラスのインスタンス)であるテキストブロックウィジェットを宣言しています。 text_block
は、テキストブロックウィジェットのクラスまたは型を指定しています。text_block{DefaultTextColor := NamedColors.White}
は、text_block
クラス(または型)のインスタンスを作成し、そのインスタンスのプロパティであるDefaultTextColor
をNamedColors.White
という値で初期化しています。
このようにして、変数AddedTimeWidget
には、テキストブロックウィジェットのインスタンスが割り当てられ、そのプロパティも初期化されます。
text_block{}の役割
クリックすると開きます。
text_block
は、その名前が示す通り、テキストを表示するためのブロック要素を作成するための特定の型やクラスの名前です。
この名前は、プログラミングの文脈で「テキストブロック」という概念を表しています。
テキストブロックは、プログラム内で文字列を表示するための専用の領域や要素を指します。
その他の要素との区別やスタイルを適用するための設定なども行えます。
上記のコードでは、text_block
を使用してテキストブロックウィジェットのインスタンスを作成し、そのプロパティであるDefaultTextColor
を設定しています。
言い換えると、text_block
はテキストブロックウィジェットを作成するための要素や型の名前を指しています。
このウィジェットは、指定したプロパティやデザインに従って、テキストを表示するためのエリアを提供します。
AddedTimeText<localizes>(AddedTime: int): message = " +{AddedTime}!"の詳細
クリックすると開きます。
AddedTimeText<localizes>(AddedTime: int): message = " +{AddedTime}!"
AddedTimeText
は関数の名前です。- この関数は引数として
AddedTime
(整数)を受け取ります。
- この関数は引数として
: message
は関数の戻り値の型を指定しています。- この場合、戻り値は
message
という型です。 - ただし、
message
の具体的な定義は提供されていません。
- この場合、戻り値は
意義と記述理由は以下のとおりです。
このコードは、AddedTimeText
という関数を定義しています。この関数は、引数として受け取ったAddedTime
を使用してメッセージを生成します。
{AddedTime}
は、値がAddedTime
で置き換えられるプレースホルダーです。{}
内に記述された変数や式が、文字列中で評価されて挿入されます。
" +{AddedTime}!"
は、生成されるメッセージのテンプレートです。{AddedTime}
の部分が、AddedTime
引数の値に置き換わります。- 例えば、
AddedTime
が3の場合、メッセージは"+3!"となります。
書かれたコードは、渡されたAddedTime
値に基づいて特定のフォーマットのメッセージを生成するためのシンプルな関数です。
このような関数を使用することで、メッセージの生成を自動化し、再利用性と保守性を高めることができます。
また、ソフトウェアの多言語サポートやカスタマイズの容易さを実現するために、ジェネリックパラメータ<localizes>
が使用されています。
localizesの詳細
クリックすると開きます。
AddedTimeText<localizes>(AddedTime: int): message = " +{AddedTime}!"
<localizes>はテキストのローカリゼーション(地域化)を意味します。
テキストのローカリゼーション(地域化)は、アプリケーションやソフトウェアの文言やメッセージを、特定の地域や言語に合わせて変更するプロセスです。
このプロセスによって、ユーザーが自分の言語や文化に適したインターフェースを体験できます。例えば、英語を話すユーザーには英語のメッセージが表示され、日本語を話すユーザーには日本語のメッセージが表示されるようになります。
タグ <localizes>
は、プログラムの特定の部分をローカリゼーションの対象としてマークするために使用されます。このマークを使うことで、開発者は文言やメッセージを将来的に翻訳やローカリゼーションのプロセスに組み込むことができます。
具体的には、ソフトウェア開発では、<localizes>
タグに囲まれたテキストを、翻訳者やローカリゼーションツールによって抽出し、別の言語に翻訳するためのリソースファイルなどに収集することがあります。これによって、異なる言語での表示やローカリゼーションの変更が容易になります。
要約すると、<localizes>
タグは、テキストのローカリゼーション(地域化)の対象として特定の部分をマークするために使用されるものです。このマークがあると、将来的にテキストを翻訳したり、異なる地域や言語に合わせて表示を変更したりすることが容易になります。
messageの詳細
クリックすると開きます。
メッセージクラス
UEFNmessage class
ローカライズ可能なテキストメッセージ。
ステートメントを使用した節 using { /Verse.org/Verse }.
メンバー
このクラスにはメンバーはいない。
公式ドキュメントを見たい方は以下の記事を参考にしてください。
【重要】AddedTimeWidgetとAddedTimeTextに関する詳細まとめ
クリックすると開きます。
提供いただいたコードは、ボタンの仕掛けとやり取りした際に、追加された時間を表示するためのウィジェットを追加するものです。
以下にコードの解説と意義・記述理由を示します。
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
この行は、追加された時間を表示するためのウィジェットであるAddedTimeWidget
を定義しています。
text_block
はテキストを表示するためのUI要素であり、DefaultTextColor := NamedColors.White
はデフォルトのテキストの色を白に設定しています。
つまり、このウィジェットは白いテキストで追加された時間を表示するためのものです。
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
この行は、AddedTime
という引数を受け取り、それをテキストに表示するための関数AddedTimeText
を定義しています。
AddedTimeText
関数はmessage
という出力パラメータを持ち、" +{AddedTime}!"
というテキストを表示するように設定されています。
{AddedTime}
はプレースホルダーとして機能し、実行時にAddedTime
の値が代入されます。つまり、このテキストは「プラス記号(+)とAddedTime
の値」で構成され、追加された時間が表示されるようになります。
「{AddedTime}」はプログラムで使用されるプレースホルダーであり、実行時に「AddedTime」に対応する値が代入されます。これにより、テキスト内に「プラス記号(+)とAddedTimeの値」を含めることができます。
例えば、+10分みたいな感じで表示させれるわけですね。

例えば、あるプログラムで以下のようなテキストを出力したい場合を考えましょう。
「10分後に処理が完了しました。」
この場合、テキスト内に「10分後」という特定の時間を表示したいですね。
そこで、テキスト内に「{AddedTime}分後に処理が完了しました。」というような形式を使います。
プログラムを実行する際に、「AddedTime」に10という値が代入されれば、実行結果は「10分後に処理が完了しました。」となります。
もし「AddedTime」に他の値(例えば5や30)が代入される場合は、それに応じて「5分後に処理が完了しました。」や「30分後に処理が完了しました。」と表示されることになります。
このように、「{AddedTime}」というプレースホルダーを使うことで、実行時に特定の値が代入されることによって、柔軟にテキストを組み立てることができます。プログラミング初心者の方でも、この仕組みを使って動的なテキストを生成することができます。
このコードの意義と記述理由は以下のとおり。
- 追加された時間をユーザーに視覚的に伝えるためにウィジェットを追加しています。
- 追加される時間を直接表示することで、ユーザーが追加の効果を明確に理解できます。
AddedTimeWidget
はテキストを表示するためのUI要素です。- 白いテキストを使用することで、視認性を高めるとともに、デザインに適切な色を選択しています。
AddedTimeText
関数を使用することで、時間の値をテキストに埋め込むことができます。- テキストの可読性を向上させるために、プラス記号と値の組み合わせを表示します。
これらの要素を組み合わせることで、プレイヤーがボタンの仕掛けとやり取りしたときに、追加された時間がわかりやすく表示されます。
プレースホルダーの詳細
クリックすると開きます。
プレースホルダーは、プログラム内で特別な文字列として使用されます。プレースホルダーは、値が代入されるため、テキスト内に変数や関数の結果を動的に埋め込むことができます。
例えば、次のコードを考えてみましょう。
AddedTimeText(AddedTime: int) -> message:
return " +{AddedTime}!"
このコードでは、{AddedTime}
がプレースホルダーとして機能しています。AddedTime
という変数の値が、実行時にプレースホルダーに代入されます。結果として、テキストは「プラス記号(+)とAddedTimeの値」で構成されるメッセージが生成されます。
たとえば、AddedTime
の値が10の場合、生成されるメッセージは「+10!」になります。
プレースホルダーは、コードを短く簡潔に記述したり、再利用したりする上で便利です。特定の値が代入される箇所をプレースホルダーで表現することで、同じ構造のメッセージを複数回使用したり、値を簡単に置き換えたりできます。
プレースホルダーは値や関数の結果をテキストとして表示できます。

続きは以下の記事にて解説しています。
-
-
【UEFN】カスタム仕様のカウントダウンタイマー(2)【Verse】
続きを見る
よくある質問
カスタム仕様のカウントダウンタイマーの作成に関するよくある質問をまとめてみました。
上記をクリックすると該当箇所にジャンプします。
ウィジェットとは
クリックすると開きます。
プログラミングにおけるウィジェットとは、ユーザーインターフェイス(UI)の要素のことです。
ウィジェットは、ユーザーがアプリケーションとやり取りする際に使用される小さなコンポーネントです。
ウィジェットは、ボタン、テキストボックス、リストボックス、カレンダーなど、さまざまな種類があります。
アプリケーションの機能をユーザーにとってわかりやすく、使いやすくするために使用されます。
アプリケーションのデザインに統一感を与えるためにも使用されます。
ウィジェットは、アプリケーションのUIを向上させるために非常に効果的なツールです。
ウィジェットとパラメータの違い
クリックすると開きます。
ウィジェットとパラメータは、ソフトウェア開発において異なる概念です。
詳細は以下のとおり。
- ウィジェット(Widget):
- ウィジェットは、ユーザーインターフェース(UI)の要素やコンポーネントを表します。
- これは、ユーザーがアプリケーションとやり取りするために使用される相互作用可能なオブジェクトです。
- 例としては、ボタン、テキストボックス、画像表示エリアなどがあります。
- ウィジェットは、デザインや機能を持ち、ユーザーとの対話を可能にする役割があります。
- パラメータ(Parameter):
- パラメータは、関数やメソッド、クラスなどの概念に関連しています。
- パラメータは、これらの要素に渡される値を表します。
- 関数におけるパラメータは引数とも呼ばれることがあります。
- パラメータは、関数やメソッドの実行時に必要な情報や設定を提供するために使用されます。
ウィジェットはUIの要素であり、パラメータは関数やメソッドなどの要素に関連して使用される値を表すものです。
ウィジェットは、ユーザーに情報を表示したり、入力を受け付けたりするために使用されるのに対して、パラメータは機能や振る舞いを制御するために使用されます。
例えば、ウェブアプリケーションにおいて、ボタン(ウィジェット)を作成する際には、ボタンのテキストや色(パラメータ)を指定することができます。
ボタンのウィジェットは、そのパラメータに基づいて表示や振る舞いが決まります。
つまり、ウィジェットはUIを構成する要素自体であり、パラメータはそれらの要素の設定や制御に関わる値や情報を表します。

コンポーネントとは、プログラムの部品や成分、構成要素などの意味を持つ英単語です。
ITの分野では、ソフトウェアやシステムを構成する部品のことを指します。
ソフトウェア開発では、機能を部品化して開発することがよくあります。
Unreal Engineにおいては、コンポーネントはアクタに追加することができる機能の構成要素であり、アクタはコンポーネントが提供する機能を使用できます。
コンポーネントは一般的に、所有するアクタの特定の動作や機能を変更するために、簡単に取り替え可能なパーツが必要な場合に使用されます。
Unreal Engine 5.0ドキュメントによると、さまざまなタイプのジオメトリに複数のサブクラスがありますが、最も一般的なのは、Box コンポーネント、Capsule コンポーネント、Static Mesh コンポーネント、および Skeletal Mesh コンポーネント です。
変数と関数の違いは?
クリックすると開きます。
変数と関数は、プログラミングにおいて異なる役割を果たす要素です。
以下に詳しく解説します。
変数(Variables):
変数は、データを格納するためのコンテナです。
例えば、数字やテキスト、オブジェクトなどの値を変数に代入することができます。
変数には名前が付けられ、その名前を通じて値にアクセスできます。
変数はプログラム内で情報を保持するために使用され、値はプログラムの実行中に変化することがあります。
例えば、以下のようなコードでは、変数 message
に文字列 "Hello, World!" が代入されています。
message = "Hello, World!"
関数(Functions):
関数は、特定の動作や処理を実行するためのブロックです。
関数には名前があり、必要に応じて入力(引数)を受け取り、結果を返すことができます。
関数は複数の文や手続きをまとめ、再利用可能なコードブロックとして組織化することができます。
関数は、与えられた入力に対して特定の処理を実行し、その結果を返すことが主な目的です。
例えば、以下のようなコードでは、greet()
という名前の関数が定義されており、引数 name
に渡された値を使って挨拶のメッセージを生成し、結果を返します。
def greet(name):
message = "Hello, " + name + "!"
return message
この関数を呼び出すことで、異なる名前に対して挨拶のメッセージを生成することができます。
greeting = greet("John")
print(greeting) # 結果: "Hello, John!"
まとめると、変数は値を格納するためのものであり、関数は特定の処理を実行して結果を返すものです。

変数と関数はプログラミングにおいて基本的な要素であり、プログラムの動作を制御するために頻繁に使用されます。
クラスのインスタンスとは?
クリックすると開きます。
クラスのインスタンス内とは、クラスのオブジェクトのことです。クラスのオブジェクトとは、クラスの定義に基づいて作成されたオブジェクトです。
オブジェクトには、クラスの定義で定義された属性やメソッドが含まれます。
例えば、Personクラスがあるとします。Personクラスには、name、age、addressなどの属性が定義されています。
Personクラスのオブジェクトを作成すると、これらの属性に値を設定することができます。
Personクラスのオブジェクトは、クラスのインスタンス内にあります。
つまり、Personクラスのオブジェクトは、Personクラスの定義に基づいて作成され、Personクラスの属性やメソッドが含まれます。


インスタンスは、クラスという設計図を実際に作ったものですよね🌸
.の意味は?
クリックすると開きます。
.
は、オブジェクトのプロパティやメソッドにアクセスするために使用されます。
上記のコードでは、CountdownTimer 変数に格納されているカウントダウンタイマーのインスタンスに対して、StartCountdown() プロパティにアクセスしています。
StartCountdown() プロパティは、カウントダウンを開始するメソッドです。このメソッドを呼び出すことで、カウントダウンを開始することができます。

.はアクセスするために使用される。
覚えました🌸
クラスを継承するの意味
クリックすると開きます。
クラスを継承するとは、親クラスの機能を子クラスに引き継ぐことです。
子クラスは、親クラスのメソッドやプロパティをそのまま使用することができます。また、子クラスでは、親クラスのメソッドやプロパティをオーバーライドして、独自の機能を追加することができます。
クラスの継承は、コードの再利用と保守性を向上させるために使用されます。
親クラスの機能が子クラスでも必要であれば、子クラスは親クラスを継承することで、親クラスの機能をそのまま使用することができます。
これにより、コードの重複を削減し、保守性を向上させることができます。
クラスの継承は、オブジェクト指向プログラミングの重要な概念です。
オブジェクト指向プログラミングでは、オブジェクトをクラスで定義します。
クラスを継承することで、オブジェクトの機能を再利用し、保守性を向上させることができます。

親クラスは、親です。子クラスは、子供です。
親は、子供に自分の能力や知識を教えてくれます。子供は、親から学んだことを自分のものにして、成長します。
クラスの継承も、親クラスと子クラスの関係と同じです。親クラスは、子クラスに自分の機能を教えてくれます。子クラスは、親から学んだ機能を自分のものにして、独自の機能を追加することができます。
たとえば、動物クラスを親クラスとし、犬クラスと猫クラスを子クラスとすると、動物クラスは、歩く、走る、食べるなどの機能を持っています。犬クラスは、動物クラスから歩く、走る、食べるなどの機能を継承し、さらに吠える機能を追加することができます。
猫クラスは、動物クラスから歩く、走る、食べるなどの機能を継承し、さらに鳴く機能を追加することができます。
このように、クラスの継承は、コードの再利用と保守性を向上させるために使用されます。
モジュールとは
クリックすると開きます。
プログラミングにおけるモジュールは、関連する機能やデータをグループ化して管理するための仕組みです。
モジュールは、プログラム内で再利用可能なコードの独立した部分です。モジュールは、プログラムの柔軟性、再利用性、メンテナンス性を向上させるために使用されます。
特徴は以下のとおり。
- 機能のカプセル化:
- モジュールには、関連する機能やデータが含まれています。
- モジュール内の要素は他の部分から隠蔽され、モジュールと外部のコードとの間で明確なインターフェースを提供します。
- これにより、モジュールを独立して保守でき、コードの可読性と保守性が向上します。
- 再利用可能なコード:
- モジュールは、同じ機能を別の場所で再利用するために使用できます。
- 関連するコードをモジュールにまとめると、他のプログラムやプロジェクトで同じ機能を利用する際に簡単に組み込むことができます。
- これにより、開発の効率が向上し、コードの重複を防ぐことができます。
- 名前空間の管理:
- モジュールは、コードを名前空間として分離することができます。
- 名前空間は、コード内の識別子(変数、関数、クラスなど)の一意性を保証します。
- 複数のモジュールがある場合、同じ名前を使用しても名前空間が異なるため、競合や衝突を回避することができます。
- モジュール間の依存関係:
- 複雑なプログラムでは、さまざまなモジュール間でデータや機能を共有する必要があります。
- モジュールは、他のモジュールとの依存関係を明確化することで、必要な情報を適切に共有します。
- これにより、コードの組織化と保守が容易になります。
プログラミング初心者にとって、モジュールはコードの構造化と組織化に役立ちます。
コードベースを小さな部分に分割し、関連する要素をまとめることで、コードの理解とメンテナンスが容易になります。また、再利用可能なコードを作成することにより、開発の効率を向上させることも可能です。
つまり、モジュールとはグループ化みたいなものです。

「=」と「:=」の違いは?
クリックすると開きます。
「=」は、「等号」と呼ばれ、比較演算子の一種です。これは通常、左側と右側の値が等しい場合に式が真(成功)となり、等しくない場合には偽(失敗)となります。
例えば、5 = 5
は真(真)、5 = 10
は偽(偽)と評価されます。
一方、「:=」は「コロンイコール」と呼ばれ、変数や定数の初期化に使用されます。これは、右側の値を左側の変数や定数に割り当てるために使われます。
例えば、MyScore := HighScore
は、HighScore
の値を MyScore
に割り当てるという意味です。
具体的には、以下の2つの点を覚えておきましょう:
- 「=」は等号演算子であり、左右の値を比較します。
例:5 = 5
(真)、5 = 10
(偽)。 - 「:=」はコロンイコールであり、右の値を左の変数や定数に割り当てます。
例:MyScore := HighScore
(HighScore
の値をMyScore
に代入)。
定数は型を省略できて、変数はできない理由は何ですか?
クリックすると開きます。
変数では型を省略することはできません。変数は、プログラムの実行中に値を変更することができるため、型を明示的に指定する必要があります。
型が省略された場合、プログラムは変数の型を推測することができず、エラーが発生します。
型を省略できるのは、次の条件のときです。
型を省略できる条件- 定数が関数で宣言されている場合
- 定数の型が定数の初期化で使用された式から推測できる場合
たとえば、次のコードは、text_block
という名前の定数を宣言し、その値をtext_block{DefaultTextColor := NamedColors.White}
に設定しています。
この場合、定数の型は、text_block
という名前の型から推測されます。
text_block := text_block{DefaultTextColor := NamedColors.White}
一方、次のコードは、text_block
という名前の定数を宣言し、その値を10
に設定しています。
この場合、定数の型は、int
型から推測されます。
text_block := 10
型を省略できるのは、ローカル定数のみです。モジュールの定数は、それを含むモジュールのインターフェースの一部を構成します。
型がない場合、そのインターフェースは明白ではありません。
プロパティの概要と種類を教えて!
クリックすると開きます。
プロパティとは、クラスや構造体のインスタンスに関連付けられた値です。プロパティは、インスタンスの状態を保存するために使用されます。
プロパティには、次の2種類があります。
- インスタンスプロパティ
- クラスプロパティ
インスタンスプロパティは、インスタンスごとに異なる値を持ちます。クラスプロパティは、クラス全体で同じ値を持ちます。
プロパティは、次の2種類の方法で宣言することができます。
- 変数プロパティ
- 定数プロパティ
変数プロパティは、値を変更することができます。定数プロパティは、値を変更することができません。
プロパティの宣言には、次の構文を使用します。
var propertyName: PropertyType
let constantPropertyName: PropertyType
たとえば、次のコードは、name
という名前の変数プロパティと、age
という名前の定数プロパティを宣言しています。
var name: String
let age: Int
プロパティの値を設定するには、次の構文を使用します。
instance.propertyName = value
たとえば、次のコードは、name
プロパティに John Doe
という値を設定しています。
instance.name = "John Doe"
プロパティの値を取得するには、次の構文を使用します。
value = instance.propertyName
たとえば、次のコードは、name
プロパティの値を value
という変数に代入しています。
value = instance.name
プロパティは、オブジェクトの状態を保存するために使用されます。プロパティを使用して、オブジェクトの状態を変更したり、オブジェクトの状態を取得したりすることができます。
変数か関数かを見分けるポイントはある?
クリックすると開きます。
変数と関数を区別するためには、それぞれの役割や目的を理解することが重要です。以下に、変数と関数の基本的な特徴と見極めるためのヒントをいくつかご紹介します。
■ 変数の特徴と見極めるためのヒント
- 変数は値を格納するために使用されます。
- 例えば、数値、文字列、真偽値などの情報を保持します。
- 変数は一時的なデータを扱うことが多いです。
- プログラムの実行中に変数の値が変わることが一般的です。
- 変数は単一の値を保持します。
- そのため、単一の変数名で参照できます。
■ 関数の特徴と見極めるためのヒント
- 関数は処理や操作を実行するために使用されます。
- 複数のステートメントやアルゴリズムをまとめて実行します。
- 関数は再利用可能で、プログラム内の複数の場所で呼び出すことができます。
- 関数はパラメータを受け取り、処理を行った結果を返すことができます。
■ 見極めるためのいくつかのヒント
- 名前の付け方:
- 変数は一般的に「名詞」のような名前が使われます(例:
count
、name
)。 - 一方、関数は一般的に「動詞」のような名前が付けられます(例:
calculateTotal
、printMessage
)。
- 変数は一般的に「名詞」のような名前が使われます(例:
- 機能の視点:
- コードの行動や処理の流れを考えるとき、特定の値の保存や操作が必要な場合は変数を使用し、一連の処理やアルゴリズムが必要な場合は関数を使用することが多いです。
- プログラムの設計:
- 大規模なプログラムでは、機能やデータの組織化が重要です。
- 関数はモジュールやクラスのメソッドなどの形で使用され、その機能をまとめます。
- 変数は関数内部やスコープ内で使用され、データの一時的な保存や共有に使われることが一般的です。
以上のヒントを参考にしながら、コード内の要素が変数か関数かを判断することができます。ただし、実際のコーディングでは、変数と関数の役割を明確にするために適切な命名規則を使用することも重要です。
具体例# ウィジェットのテキストブロックを設定する
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
# AddedTimeText関数を定義し、メッセージを生成する
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
まず、オブジェクトと関数の見分け方は、言語や文脈によって異なる場合がありますが、一般的な特徴を以下に示します。
- オブジェクトは、通常はプロパティやメソッドを持つデータ構造です。オブジェクトには状態や動作が関連付けられています。
- オブジェクトは通常、変数名などによって参照され、そのプロパティやメソッドにアクセスされます。
- 関数は、指定されたタスクや処理を実行する一連のステートメントです。関数は通常、データを受け取って処理し、結果を返す場合があります。
- 関数は一般的に、呼び出し元によって関数名と引数を指定することで実行されます。
上記のコードに基づいて、オブジェクトと関数の見分け方を説明します。
AddedTimeWidget : text_block = text_block{DefaultTextColor := NamedColors.White}
この行は、オブジェクトのコードを示しています。AddedTimeWidget
という名前のオブジェクトが定義されており、text_block
というプロパティが初期化されています。
オブジェクトの定義は通常、プロパティ(変数)と値のペアで構成されます。
AddedTimeText<localizes>(AddedTime : int) : message = " +{AddedTime}!"
この行は、関数のコードを示しています。AddedTimeText
という名前の関数が定義されており、AddedTime
という引数があります。
関数は引数と結果のデータを処理し、メッセージを生成します。
関数定義は通常、関数名、引数、返り値の型(この場合はmessage
)で構成されます。
パラメータと引数の違いはなに?
クリックすると開きます。
パラメータ(Parameters)と引数(Arguments)は、プログラムで関数を定義したり呼び出したりする際に使用される用語です。
パラメータ(Parameters)
パラメータは、関数の定義時に関数が受け取るべき情報やデータの型や順序を示す変数のことです。
関数がどのようなデータを必要とするかを指定し、関数内でそのデータを使用するためにパラメータを使用します。
パラメータは関数の宣言部分で指定されます。
具体例を見てみましょう。
以下の関数greet
は、名前を受け取り、その名前で挨拶文を生成して表示する関数です。ここでのname
がパラメータです。
def greet(name):
print("Hello, " + name + "!")
greet("Alice")
この例では、greet
関数のパラメータname
は入力として名前を受け取ります。
関数内で受け取った名前を使って、挨拶文を生成して表示します。
引数(Arguments)
引数は、関数を呼び出す際に渡される実際の値やデータのことです。関数呼び出しの際に引数を指定することで、その関数が期待するデータを渡すことができます。
先ほどの例を使って引数について説明します。
以下のコードでは、greet
関数を呼び出す際に引数として"Alice"
を渡しています。
greet("Alice")
ここでの"Alice"
が引数です。プログラムは引数を関数に渡すことで、関数内のパラメータにその値を代入し、処理を実行します。
関数呼び出しにおいては、関数のパラメータと引数が一致する必要があります。上記の例では、greet
関数のパラメータname
に対して引数として"Alice"
を渡しています。そのため、関数の実行結果として「Hello, Alice!」が表示されます。
まとめると、パラメータは関数の定義時に指定される変数で、関数が必要とするデータの型や順序を示します。引数は関数を呼び出す際に実際に渡される値やデータで、関数の実行に必要な情報を提供します。
詳細引数とパラメータは、どちらも関数に値を渡すための手段ですが、その性質は異なります。
- 引数は、関数を呼び出す際に、関数に渡す値です。
- パラメーターは、関数を定義する際に、関数に渡される値の名前です。
たとえば、次のコードでは、関数add()
に2つの引数x
とy
が渡されています。
function add(x: int, y: int): int {
return x + y;
}
関数add()
のパラメーターはx
とy
です。パラメーターは、関数を呼び出す際に、引数として渡される値と対応しています。
引数とパラメーターは、関数を呼び出す際に、引数として渡される値と、関数を定義する際に、関数に渡される値の名前を一致させることで、関数が正しく動作するようにしています。
【引数とパラメーターの違いをわかりやすく説明するために、次の例を考えてみましょう。】
引数(Arguments)とは、関数(メソッド)を呼び出す際に、その関数に渡す値のことです。
引数は関数呼び出しの際に実際の値を指定する必要があります。
例えば、以下の関数を考えてみましょう:
def say_hello(name):
print("Hello, " + name + "!")
この関数では、name
というパラメータがあります。このパラメータは、関数が呼び出された際に受け取る値を格納する変数です。
関数を呼び出す際に引数を指定してみましょう。
say_hello("Alice")
この場合、引数として文字列 "Alice"
を指定しています。関数が実行されると、name
パラメータに渡された引数の値が格納され、"Hello, Alice!"
という結果が表示されます。
同様に、別の引数を指定して関数を呼び出せば、異なる結果が得られます:
say_hello("Bob")
この場合、name
パラメータには引数 "Bob"
の値が渡され、"Hello, Bob!"
という結果が表示されます。
簡単に言えば、引数は関数を呼び出す際に渡す値のことです。

一方、パラメータ(Parameters)は、関数が定義される際に宣言される変数です。パラメータは関数内で利用される変数であり、関数が実行される際に受け取った引数の値が格納されます。
引数とパラメータはセットで考えることが重要です。
関数を定義する時にパラメータを指定し、関数を呼び出す際に引数として実際の値を渡します。
パラメータに引数が代入される?はい、パラメーターに引数が代入されます。
たとえば、次のコードでは、関数say_hello
にname
というパラメーターが定義されています。
def say_hello(name):
print("Hello, " + name + "!")
関数say_hello
を呼び出す際には、name
という引数を渡す必要があります。たとえば、次のコードでは、name
という引数にJohn Doe
という値を渡しています。
say_hello("John Doe")
この場合、関数say_hello
は、name
というパラメーターにJohn Doe
という値を受け取ります。そして、print("Hello, " + name + "!"
というメッセージを出力します。
つまり、パラメーターは、関数の呼び出し時に、引数から値を受け取ります。

パラメータとプロパティの違いは?
クリックすると開きます。
まず、プロパティ(Properties)はオブジェクトが持つ特定の値や設定を表現します。
例えば、Alignment := vector2{X := 0.5, Y := 0.5}
という行では、Alignment
というプロパティにvector2{X := 0.5, Y := 0.5}
という値が設定されています。
このプロパティはキャンバススロットの配置を決めるために使用されています。
一方、パラメータ(Parameters)は関数やメソッドに渡される値を表します。
例えば、MakeCountdownTimer<constructor><public>(MaxTime : float, InPlayer : agent) := countdown_timer:
という行では、MaxTime
とInPlayer
という2つのパラメータが宣言されています。
これらのパラメータは、MakeCountdownTimer
というコンストラクタ(クラスのインスタンスを生成する特殊な関数)に渡される値を指定します。
また、コード内ではプロパティとパラメータがオブジェクトや関数の設定や動作に関与しています。
例えば、RemainingTimeTextBlock.SetText(RemainingTimeText(IntTime))
という行では、RemainingTimeTextBlock
というプロパティに、RemainingTimeText
という関数に渡される値(IntTime
)を設定しています。
これにより、テキストブロックの表示テキストが更新されます。
簡単にまとめると、プロパティはオブジェクトが持つ値や設定を表し、パラメータは関数やメソッドに渡される値を表します。
プロパティはオブジェクトの一部として設定され、パラメータは関数やメソッドの呼び出し時に値を指定して使用されます。
具体的に解説パラメータとプロパティは使い方と役割が異なります。
パラメータは関数(メソッド)の定義時に使用され、関数が実行される際に引数として値を渡すための変数です。パラメータは関数内でのみ使用され、関数の実行に必要なデータを受け取るために利用されます。パラメータは関数が呼び出されるたびに値が異なることが一般的です。
一方、プロパティはオブジェクトの特定の値や設定を表現するために使用されます。オブジェクト(クラスのインスタンス)が持つデータや状態を保持しています。プロパティはオブジェクトの一部であり、オブジェクトの状態や動作を制御するために使用されます。プロパティはオブジェクトが存在する間は値が維持されます。
具体例を見てみましょう。例えば、車(Car)クラスがあるとしましょう。
- パラメータの例:
drive(speed: float)
という関数(メソッド)を定義する際に、speed
パラメータを使用して車を指定の速度で運転します。この関数が呼び出されるたびに、異なる速度が渡されます。 - プロパティの例:
color
というプロパティを持ち、車の色を表します。このプロパティは車オブジェクト自体が持っており、車の色がオブジェクトの一部として保持されます。
パラメータは関数呼び出しのたびに新しい値を渡すために使用され、プロパティはオブジェクトの特定の状態や設定を保持するために使用されます。
配列の長さ Lengthとは?
クリックすると開きます。
配列の要素数を取得する場面は、以下のような場合によく使われます。
- ループ処理:
- 配列内の全ての要素に対して処理を行う際に、ループの終了条件として配列の要素数を取得することがあります。
- ループのカウンター変数を使用して、配列のインデックス範囲内で要素にアクセスします。
- 要素の初期化や再確保:
- 新しい配列を作成する場合や既存の配列の要素数を変更する場合に、要素数を取得する必要があります。
- 配列の要素数に基づいて、適切なサイズの新しい配列を作成するために使用されます。
- 配列の操作:
- 配列の要素を追加、削除、検索などの操作を行う場合に、要素数を考慮する必要があります。
- 要素数を取得することで、配列内での操作の範囲を制御できます。
- データのバリデーション:
- 配列にデータを追加する前に、既存の要素数を確認して制約を適用したり、処理を行ったりする場合に使用されます。
要素数を取得することで、配列がどれだけの要素を含んでいるかを把握し、適切な操作や処理を行うことができます。配列の要素数は、配列のサイズを動的に確認するための重要な情報です。
文字数の取得はい、文字列の場合も文字数を取得するために長さ(Length)が使用されます。
文字列を構成する文字の数を知る必要がある場合、string.Length
プロパティを使用して文字列の長さを取得します。
string text = "Hello, World!";
int length = text.Length;
Console.WriteLine(length); // 出力: 13
文字列の場合、Length
プロパティは文字数(Unicodeの文字数)を返します。
文字列の長さを知ることで、文字列の操作やバリデーションなどをより正確に行うことができます。
まとめ

今回は、カスタム仕様のカウントダウンタイマーを解説しました。
続きは以下のサイトにて解説していますので、参考にしてください。
>> 【UEFN】カスタム仕様のカウントダウンタイマー(2)【Verse】
-
-
【UEFN】カスタム仕様のカウントダウンタイマー(2)【Verse】
続きを見る
本日もお疲れさまでした🍵