NarraLeaf

アプリケーション

Surface のナビゲーション、アプリケーションウィンドウ、そして Page が自分自身について知っていること

App ノードは、ブループリントが自身の実行先であるアプリケーションに手を伸ばす場所です——Surface を開く、その上に重ねる、ウィンドウのサイズを変える、リンクをたどる、終了する。Surface モデルそのもの——スタック、レイヤー、ゲームステージ——はSurfacesで説明されています。

規約

  • このページのノードはすべてeventmacro専用です。例外はIs Layer Mountedのみで、これは純粋であり、functionグラフと Blueprint Value の内部でも実行できます。このカテゴリの他のノードにはそれがありません。
  • そのうち2つは末端ノードです。 Go PageQuit Applicationにはnextピンがまったく存在しません。その後に続くのは別の Surface か、あるいはアプリケーションそのものが存在しない状態であり——このグラフに実行すべきものは何も残っていません。
  • 型 id はすべてがappを名乗っているわけではありません。 このグループは、ウィンドウ、レイヤー、アプリケーションのノードが増える前は Page と呼ばれていました。id はドキュメントに保存されるものであるため、リネームされたことは一度もありません——blueprint.page.*blueprint.frame.*blueprint.layer.*blueprint.app.*はすべてこの1つのカテゴリに属します。
  • オーナー。 Get Page Propsと3つのIs Surface …読み取りノードは Surface、ウィジェット、Blueprint Value のブループリントに存在します。Get Page ParamEmit Page Eventは Surface とウィジェットのブループリントに存在します。いずれもグローバルブループリントには存在しません——グローバルブループリントには問い合わせる対象の現在の Page が存在しないためです。ナビゲーション、レイヤー、ウィンドウ、ポインタ、リンクの各ノードにはオーナーの制限がありません。
  • エディタのキャンバスには対話できるアプリケーションが存在しません。 作成時のキャンバス上では、副作用のあるノードはすべてHost API unavailable (use Dev Mode)で失敗します。純粋な読み取りはその代わりに静かに縮退し、Get Page Props{}を、3つのIs Surface …読み取りはfalseを返します。ストーリーエディタの Game UI プレビューでは、ナビゲーションと終了はスタブに届いて何もせず、2つのフルスクリーンノードはそこでは利用できないと報告します。これらはすべて Dev Mode で確認してください。

Go Page

blueprint.page.go · Latent

Go Page(ページへ移動)は、カード上で選択された Surface を開きます。これはランタイムがあらゆる Page 切り替えで使うのと同じナビゲーション経路です——同じ入退場アニメーション、同じ Surface ライフサイクル、同じウィジェットブループリント。代わりにNoneを選ぶと、現在の最上位 Page レイヤーを閉じます。

Go Pageはプレイヤーが見ているものを置き換えます。現在のページの上にページを重ねてハンドルを受け取りたい場合は、Show Layerを使ってください。ページを閉じるにはGo backを優先してください——ナビゲーションはスタックであるため、プレイヤーが来たページに対してGo Pageを行うと、そこへ戻るのではなく、すでにある2つのページの上に3つ目のページを積み重ねることになります。Noneを伴うGo Pageは現在の最上位 Page レイヤーを閉じます。

ピン方向備考
inin · exec
surfaceIdin · datastring任意。配線すると実行時に対象を選択できます。未配線のときはカードのPageフィールドが使われます。
propsin · datajson対象の Page へ Page props として渡され、そこでGet Page Propsが読み取ります。任意——未配線の場合は{}

カード上のフィールド

フィールド内容
Page開く Surface。プロジェクトの app Surface から選択します。Noneは代わりに現在の最上位 Page レイヤーを閉じます。

ゲームが実行中になると、Page スタックはステージの下に隠れます。この状態でGo Pageは対象をステージのに UI レイヤーとして開き、Noneはそのレイヤーを閉じて再びステージを表します。ゲーム自体を離れるには、GameQuit Gameを使ってください——これは戻り先の Page を指定します。

Go back

blueprint.page.back · Latent

最上位の Page レイヤーをポップし、その下のレイヤーに戻ります。

実行中のストーリーの上でゲームが開くページ——セーブ、ロード、設定、バックログ——にはすべて出口が必要であり、Go Pageはそれにはなりません。ナビゲーションはスタックであるため、「来たページへ戻る」は、すでにある2つのページの上に3つ目のページを積み重ねるだけで、ゲームは依然として埋もれたままになります。

残っている最後のページを閉じようとした場合は、エラーではなく no-op になります。タイトル画面から到達したページはスタックの最下部であり、そこでエラーになる戻るボタンは、プレイヤーがどのように到達したかによって同じ画面上で使えたり使えなかったりしてしまいます。

ピン方向備考
inin · exec
nextout · exec

Clear Page

blueprint.page.clear · Latent

実行中のゲームがまとっているすべてのページを取り除き、ステージを何もない状態にします——グラフがプレイヤーの深さを知る必要なしに、どのページ上でも Escape が成立します。

この3つの「閉じる」は互いに置き換えられません。Go backはちょうど1つだけポップするため、2ページ分深いゲームの上で Escape を押すと、その下のページに着地します。Noneを伴うGo Pageはスタックを空にするため、タイトル画面ではタイトルそのものを閉じてしまいます。Clear Pageは、あるゲームセッションが積み上げたオーバーレイページだけを消し、ゲームの外では何もしません——これによってClear Page → Go backは、「ゲームの中にいるならゲームを離れ、そうでなければ1つ戻る」と読める単一の Escape ハンドラになります。

ピン方向備考
inin · exec
nextout · exec

Show Layer

blueprint.layer.show · Latent

画面上にあるものを置き換えるのではなく、その上にページを重ね、その1回の表示を指名するハンドルを返します。

レイヤーの深さはいかなる意味でもアドレス指定できません。重なり順はマウント順であり、レイヤーを指名できるのはハンドルだけです——それを渡されていないグラフにとっては無意味です。これは意図的なものです——画面が「上から3番目に位置する」ことに依存するように作られることはあり得ません。そのため、ポーズメニューの上にもう1枚レイヤーを重ねたい最初のプロジェクトが、この合成全体を番号付けの仕組みに変えてしまうこともありません。

ピン方向備考
inin · exec
nextout · exec
propsin · datajsonそのレイヤーの Page props。内部でGet Page Propsが読み取ります。任意。
modalin · databoolean下にあるものとの操作をブロックします。カード上のリテラルを受け付けます。未配線はfalseとして扱われます。
dismissiblein · databooleanプレイヤーがグラフの助けなしにこれを閉じられるかどうかです。カード上のリテラルを受け付けます。未配線はtrueとして扱われます——プレイヤーが抜け出せないレイヤーというのは1つの判断であり、手を付けていないピンがそれを決めるべきではありません。
groupin · datastring任意。同じグループを指定したレイヤーは、重なるのではなく互いに列を作って待機します。カード上のリテラルを受け付けます。
layerout · datastringハンドル。Hide LayerWait For LayerIs Layer Mountedに渡します。

カード上のフィールド

フィールド内容
Page表示する Surface。Go Pageが選択するのと同じリストから選びます。レイヤーはページそのものです——2つの異なるリストがあると、そうではないかのように見えてしまいます。

プロジェクトが保持していない Page を指定すると、このノード上でホスト自身の文言により失敗します。そのため失敗は、あなたが修正できる行の上に現れます。

Hide Layer

blueprint.layer.hide · Latent

ハンドルが指名するレイヤーを閉じます。

ピン方向備考
inin · exec
nextout · exec
layerin · datastringShow Layerから得たハンドル。

何も指名していないハンドル——一度も設定されていない、あるいはすでに閉じられている——は、エラーではなく no-op になります。これはGo backがスタックの底で結んでいるのと同じ約束です——レイヤーがすでに消えていること自体が、このノードに求められていた結果なのです。

Wait For Layer

blueprint.layer.wait · Latent

そのレイヤーが閉じるまで一時停止し、その後、閉じたときに渡された内容とともに続行します。

ピン方向備考
inin · exec
nextout · exec
layerin · datastringShow Layerから得たハンドル。
resultout · datajsonClose This Layerに渡された内容。プレイヤーによって閉じられたレイヤー、または何も渡さずに閉じられたレイヤーの場合はnull

Close This Layer

blueprint.layer.closeSelf · Latent

実行中のブループリントが内部にあるレイヤーを閉じ、任意でそれを待っている相手への答えを添えることができます。これはWait For Layerのもう半分です——表示されていたページが、開いた側が手を伸ばして読み取るのではなく、自分自身で結果を報告します。

ピン方向備考
inin · exec
nextout · exec
resultin · datajson任意。未配線の場合、レイヤーはnullで閉じます。

Is Layer Mounted

blueprint.layer.isMounted · Pure

ハンドルが指名するレイヤーがまだ画面上にあるかどうかです。このカテゴリで唯一の純粋なノードであり、そのため Blueprint Value を支えられる唯一のノードでもあります——自分自身のメニューが開いている間だけ無効になるポーズボタンなど。

ピン方向備考
layerin · datastringShow Layerから得たハンドル。
mountedout · databoolean空のハンドル、または未知のハンドルの場合はfalse

Show Confirm

blueprint.layer.confirm · Latent

自分で用意した Page 上で質問をし、プレイヤーが押したボタンから抜けます。

この裏側に「確認」専用の仕組みは存在しません。このノードは、選択した Page をconfirmグループのモーダルかつ閉じられるレイヤーとして表示します——そのため2つ目の質問は、1つ目の上に重なるのではなく、その後ろに列を作ります——そして、通常の Page props を通じて質問を渡します。message、そして List にバインドできる{ id, text, index, disabled }形式のbuttonsです。Show Layerを使って手作業で組んだページも、まったく同じ props を読み取ります。

ピン方向備考
inin · exec
messagein · datastring質問文。カード上のリテラルを受け付けます。
tagin · datastring任意。ページへそのまま渡されます。1つのページが複数の質問に答える場合に使います。カード上のリテラルを受け付けます。
datain · datajson任意。ページへそのまま渡されます。
dismissedout · execプレイヤーが答えずに質問を閉じたときに通ります。
indexout · dataintegerボタンの位置。dismissedの場合は-1
labelout · datastringボタンのテキスト。dismissedの場合は""

カード上のフィールド

フィールド内容
Page質問を描画する Surface。

Add Buttonstring型の入力button_N_labelと、それに対応する実行出力button_N_pressedを追加し、固定のdismissedの直前に挿入します。組は位置ではなく id で対応付けられるため、途中のボタンを1つ削除しても番号が振り直されることも、経路を取り違えることもありません。ページはClose This Layerで自身を閉じることで答えを報告します——単なるインデックス、またはindexフィールドを持つオブジェクトを渡します。それ以外のもの——何も渡さずに閉じるページを含む——はすべてdismissedから抜けます。

Keep Window Open

blueprint.app.keepWindowOpen

現在のウィンドウ閉じるリクエストを保留し、ウィンドウが勝手に閉じてしまうのではなく、ゲーム側が判断できるようにします。「本当に終了しますか」と尋ねたいゲームは、まずこれを実行してから独自の質問を表示し、プレイヤーが「はい」と答えたらQuit Applicationを呼び出します。

これはそれ以外の何も止めません。キー入力を飲み込んだり、ページを閉じたり、要素のイベントが届かないようにしたりする手段ではありません——そして、閉じるリクエストの外側では作用する対象が何もないため、それは静かな no-op ではなく実行エラーになります。そこにこのノードを置いているグラフは、与えられていない保証を要求しているためです。

グローバルグラフと Surface グラフでのみ利用できます。

ピン方向備考
inin · exec
nextout · exec

Quit Application

blueprint.page.quit · Latent

Quit Application(アプリケーションの終了)は、プロセスを強制終了させるのではなく、ランタイムに対してアプリケーションをクリーンに終了するよう要求します——状態の保存やクラッシュレポートのための余地を残すためです。Dev Mode では、現在の Dev Mode セッションを終了して Studio に戻します。Studio 自体は閉じません。

ピン方向備考
inin · exec

これはランタイム側が発端の終了であるため、意図的にOn Window Close Requestedを発火しません。そのイベントはプレイヤーがウィンドウを閉じるために存在するものであり、それに付随する確認ハンドラは、すでに終了を決定したノードによって発火されてはなりません。

Set Fullscreen

blueprint.app.setFullscreen · Latent

Set Fullscreen(フルスクリーンの設定)は、アプリケーションウィンドウをフルスクリーンにする、またはフルスクリーンから解除します。

ピン方向備考
inin · exec
nextout · exec

カード上のフィールド

フィールド内容
ModeEnter FullscreenExit FullscreenToggle Fullscreenのいずれかです。ドロップダウンが未設定の場合は toggle として動作します——フルスクリーンボタンにとって有用な既定値です。

Toggle Fullscreenはまず現在のウィンドウ状態を読み取り、それを反転させます。そのため、状態を自分で追跡しなくても、1つのボタンで両方向をカバーできます。

Get Fullscreen

blueprint.app.getFullscreen · Latent

Get Fullscreen(フルスクリーン状態の取得)は、アプリケーションウィンドウが現在フルスクリーンかどうかを読み取ります。

ピン方向備考
inin · exec
nextout · exec
isFullscreenout · databoolean

答えがグラフではなくウィンドウから来るため、これは純粋ではなく latent です——これは同時に、Blueprint Value を支えられないことも意味します。フルスクリーン表示インジケータは、代わりに event グラフから駆動してください。

Get Window Size

blueprint.app.getWindowSize · Latent

Get Window Size(ウィンドウサイズの取得)は、ウィンドウが現在どのような状態にあっても、ステージの現在のピクセル単位のサイズを返します。

ピン方向備考
inin · exec
nextout · exec
widthout · datafloat
heightout · datafloat

Set Window Size

blueprint.app.setWindowSize · Latent

Set Window Size(ウィンドウサイズの設定)は、ステージをピクセル単位で指定したサイズにリサイズします。

Project → App → Windowに用意されているサイズは、設定画面を組み立てるためのものであり、グラフが要求できるサイズの上限ではありません。サイズがそれ以外のどこかから来るゲーム——記憶していた値、計測したディスプレイ、プレイヤーが入力した数値——は、ここでそれを伝えれば構いません。できないのは画面からはみ出すことです。サイズはディスプレイの作業領域とウィンドウ自身の最小サイズに収まるよう調整されます。デスクトップより大きいウィンドウは誰にも使えないからです。

フルスクリーンと最大化は、Set Window Scaleがそれらを最初に解除するのと同じ理由で、最初に解除されます——両者は同じ問いへの答えであり、そのどちらかの下でサイズを変えても、プレイヤーがそこから離れた瞬間に元へ跳ね戻ってしまうためです。

ピン方向備考
inin · exec
nextout · exec
widthin · datafloat
heightin · datafloat

Get Window Scale

blueprint.app.getWindowScale · Latent

Get Window Scale(ウィンドウ倍率の取得)は、ウィンドウの現在のサイズを、ゲームのデザインサイズに対する倍数として返します。

ピン方向備考
inin · exec
nextout · exec
scaleout · datafloat1がデザインサイズ、0.5はその半分です。

Set Window Scale

blueprint.app.setWindowScale · Latent

Set Window Scale(ウィンドウ倍率の設定)は、ウィンドウをデザインサイズの倍数にリサイズします。

プロジェクトが用意していない倍率を指定した場合は、拒否されるのではなく、用意されている中で最も近い値が採用されます——その段階のはしごは作者のものであり、0.8を計算したグラフは、失敗するのではなくウィンドウを動かすべきだからです。フルスクリーンと最大化は最初に解除されます。

ピン方向備考
inin · exec
nextout · exec
scalein · datafloat正の数でない値は1にフォールバックします。

Get Window Scale Options

blueprint.app.getWindowScaleOptions · Latent

Get Window Scale Options(ウィンドウ倍率選択肢の取得)は、作者がProject → App → Windowに書いた、設定画面が提示できるサイズを返します。List をこれにバインドすれば、提示されるサイズはグラフに直接入力した数値ではなく、プロジェクトから得られます。

ピン方向備考
inin · exec
nextout · exec
scalesout · dataarrayデザインサイズの倍数。

空であることは答えであり、失敗ではありません。 サイズを変更できる自前のウィンドウを持たないシェル——Web エクスポート、Dev Mode、ストーリープレビュー——では、ここで何も返りません。そこから組み立てた行も、そこでは何も描画しません。それが狙いです——ウィンドウを動かせないサイズコントロールは、コントロールが存在しないよりも悪いのです。

blueprint.app.openExternal · Latent

Open Link(リンクを開く)は、プレイヤーがすでに使っているブラウザにアドレスを渡します——ストアページ、パッチノート、サポートフォームなど。

他のどこかで宣言すべきことは何もありません。グラフを書いたのは作者であり、その中のアドレスは作者の判断です。シェルが確認するのは——ページを開くことになるプロセスの側であり、レンダラー側では決してありません——スキームであり、到達できるのはhttp:https:mailto:のみです。これは既知の有害なものを禁止するリストではなく、許可リストです。shell.openExternalはアドレスをオペレーティングシステムがそのために登録した先へ渡すものであり、プレイヤーがインストールする任意のソフトウェアが新しいスキームを登録しうります。この集合の外にあるスキーム——よく話題になるのはsteam:です——には、プラグインを経由して到達します。そちらの経路ではパターンがマニフェストに名指しされ、インストール時に名前で承認されます。

ピン方向備考
inin · exec
urlin · datastring配線がカードより優先されます。空のアドレスは実行エラーになります。
nextout · execページを引き渡せたときに通ります。
failedout · exec
errorout · datastringどの拒否であったか。

カード上のフィールド

フィールド内容
URL入力されたアドレス。urlピンが未配線のときに使われます。

failedは、このノードが開かないスキームと、ブラウザがページを開かなかった場合の両方をカバーします。両者が1つのピンを共有しているのは、作者にとってどちらへの対応も同じだからです——プレイヤーはそのページを得られなかったので、代わりに何か別のものを見せます。

これはネットワーク権限ではありません。リクエストは発行されず、バイトがゲームに戻ってくることもありません。そのため、プロジェクトのネットワーク設定によってゲートされることはなく、ネットワークをオフにしても無効化されません。Securityを参照してください。

Move Mouse To

blueprint.app.movePointerTo · Latent

Move Mouse To(マウスの移動)は、プレイヤーの実際のカーソルを Surface 上のある点に置きます。これは Windows の「既定のボタンにポインタを自動移動する」がオンのときに行っているのと同じ動作であり、コントローラーに配慮したメニューが必要とし、マウス専用のメニューでは再現できないものです。

座標は Surface のデザイン座標です——Get Measured RectGet Bounds、そしてあらゆるマウスイベントのx / yと同じ座標系です。作者はウィンドウを目にすることはなく、目にする必要もありません。

ピン方向備考
inin · exec
pointin · dataVector2DDataMake Vector2Dで作成します。
nextout · exec
failedout · exec
errorout · datastring

カード上のフィールド

フィールド内容
Duration (s)0はカーソルを即座にそこへ置きます。正の値を指定すると移動させます。
EasinglineareaseIneaseOuteaseInOutのいずれかです。

デスクトップビルドと Dev Mode でのみ利用できます。 Web エクスポートはシステムポインタを配置できないため、そこではノードはfailedを報告します。また、このノードを含むプロジェクトが非デスクトップ向けにエクスポートされる際には、ビルドコンソールが警告を出します——作者はこれをプレイヤーからではなくビルドから知るべきだからです。

Move Mouse To Element

blueprint.app.movePointerToElement · Latent

Move Mouse To Element(要素へマウスを移動)は、同じ動作をウィジェットの中心に対して行います。ただしその中心はドキュメントから計算するのではなく、計測したものです。

これはGet Element Measured RectMove Mouse Toに配線したものではなく、独立したノードになっています。ウィジェットが実際にどの Surface に描画されたかについて、両者が一致していなければならないためです。コンポーネントインスタンスは配置された場所でその内容を描画するため、それは必ずしも要素が作成された Surface とは限りません。

ピン方向備考
inin · exec
elementin · dataelement
nextout · exec
failedout · exec
errorout · datastring

カード上のフィールド

フィールド内容
Duration (s)上記と同じ。
Easing上記と同じ。

Get Page Props

blueprint.page.getProps · Pure

Get Page Props(ページ props の取得)は、このブループリントが実行されている Page の props オブジェクト全体を読み取ります。Go Pageで開かれた Page は、そのノードのprops入力を読み取ります。nl.frameに埋め込まれた Page は、Frame のparamsを読み取ります。値がnullになることは決してありません——何も渡さずに開かれた Page は{}を読み取ります。

ピン方向備考
propsout · datajson

単一のフィールドを取り出すには、DataGet JSON Fieldを使ってください。これはドット区切りのパスを受け取ります。

Get Page Param

blueprint.frame.getParam · Pure

Get Page Param(ページパラメータの取得)は、現在の Page props の1つのフィールドを名前で読み取ります。

このノードはパレットに存在しません。 追加することはできません。ここに記載しているのは、旧いドキュメントに今も存在し、今も実行できるためです。これはGet Page Propsに続けてGet JSON Fieldを使う方法に置き換えられました。こちらは1つの平坦なキーではなく、ネストしたパスを読み取れます。

ピン方向備考
keyin · datastringカード上のリテラルを受け付けます。
valueout · datajson存在しないフィールドはnullとして読み取られます。

Emit Page Event

blueprint.frame.emit · Latent

Emit Page Event(ページイベントの発行)は、埋め込まれた Page から、それを埋め込んでいるnl.frame要素へイベントを送ります。Frame 自身のブループリントは、EventsにあるPage Eventヘッドを通じてこれを受け取り、同じ名前とペイロードをそのまま受け渡します。

ピン方向備考
inin · exec
nextout · exec
eventin · datastringイベント名。カード上のリテラルを受け付けます。
datain · datajsonハンドラに渡されるペイロード。

トップレベルの Page には親の Frame が存在しません。それでもこのノードは完了し、実行はnextから続行します——ただそのイベントには届く相手がおらず、それを知らせるものも何もありません。空のイベント名はその逆です——それは静かな no-op ではなく、実行エラーになります。

Is Surface Entering

blueprint.page.isSurfaceEntering · Pure

Is Surface Entering(Surface が入場中かどうか)は、この Surface のランタイムスコープがマウントされた瞬間から、その入場アニメーションが完了するまでの間、true になります。

ピン方向備考
isEnteringout · databoolean

このフラグはAfter Surface Enterが発火するにクリアされるため、そのイベントの中でこれを読み取るとfalseになります。これは意図的なものです——そのイベントが実行される時点で、Surface はすでに入場を終えているためです。

Is Surface Exiting

blueprint.page.isSurfaceExiting · Pure

Is Surface Exiting(Surface が退場中かどうか)は、Before Surface Exitが発火して退場アニメーションが始まった瞬間から、Surface がアンマウントされるまでの間、true になります。すでに離脱しつつある画面上での入力を拒否するために使います。

ピン方向備考
isExitingout · databoolean

Is Surface Transitioning

blueprint.page.isSurfaceTransitioning · Pure

Is Surface Transitioning(Surface が遷移中かどうか)は、上記2つのいずれかが true である間、true になります——「この画面はまだ落ち着いていない」を1回の読み取りで答えるためのものです。

ピン方向備考
isTransitioningout · databoolean

このページの目次