本文へスキップ
SheetForge

Data Studio — オーサリングサーフェス

Data Studio は、あらゆる操作を一つのウィンドウで行えるようにします: 参照、検索、セル編集、行/列/タブのオーサリング、シートの作成と削除、そしてレコードが何から構成されているかを示すレコードキャンバス。

その根底にあるルールはただ一つです——シートが正規です。Studio は ソース(ローカルファイル / Googleシート)に書き込むのであって、SO に書き込むことは決してなく、すべての変更を自動的な再インポートで確認します。

Tools ▸ SheetForge ▸ Data Studio で開きます——メニュー上の唯一のオーサリング入口です。プラグインは不要です: 以下のすべてはコアの組み込み型だけで機能し、プラグインはその上に形状と読み取り専用のキー空間を追加します(プラグインの有無 を参照)。

オーサリングウィンドウは、これ一つだけです。より古い ワークベンチ——もともとの IMGUI ウィンドウ——は 削除されました。それができたことはすべて、いまは Studio が行います。アップグレードする場合は ワークベンチはどうなったか を参照してください。

画面に表示されるもの

トップバー

  • アクティブなソースを示すチップがプロバイダー名を表示します。設定がアクティブでないときは淡色表示になります。
  • ↓ Pull from source はインポートを実行します。
  • ↑ Push to source には、保留中の変更数を示すピルが付きます。
  • その隣にある Discard ボタンは、ウィンドウ内にステージングされたすべての変更を破棄します。件数を明示する確認の後、一つの Ctrl+Z ステップとして実行されるため、誤って破棄してもステージングは復元できます。ソースには一切触れません。
  • isolated / draft バッジ。
  • ⛔/⚠ のカウンター。カウンターをクリックすると最初のエラー/警告にジャンプします。
  • エクスポートを実行Googleシートへプッシュ翻訳をエクスポート…翻訳をインポート…ヘルスチェックローカライズレポートを開くテーマ設定… を収めた の overflow メニュー。Google API ソース以外では、Google へのプッシュの行は表示されたまま無効化され、ラベルに理由が添えられます。プロジェクトにローカライズシートが一つもない場合、二つの翻訳の行も同じように振る舞います。

サイドバー

  • サイドバーの一番上には All エントリがあります——タブ横断検索です(詳細は下記)。
  • その次に、すべてのシートが、行数・色のドット、そして保留中の変更を持つシートには マーカーとともに表示されます。トップバーのピルは合計件数を示し、こちらは どの シートに由来するかを示します。
  • シートは、シート自身の @style グループラベルによってセクションにグループ化されます。右クリック ▸ Group & color ✎ で設定します。ラベルのないシートはデフォルトのセクションにとどまります。
  • シート一覧の下には、プラグインが登録したコードレジストリを列挙する READ-ONLY グループがあります。
  • ここにも正直なバッジが表示されます: プレビューに存在しないタブには parse failed、コードレジストリが実在のシート名を主張している場合は name clash、そして下記の quarantine 通知です。
  • 現在ブロックされている右クリック項目も、その理由を添えたまま表示され続けます。

テーブル

  • 四行分の見出しが常に固定表示されます: 生の @name / @type / @desc セルの上に重なる ソースシートの列記号。列 A はマーカー用なので、データは B から始まります。
  • 実際のシート行番号 を示すガターと、行ごとの参照チップがあります。この行を二つ以上のレコードが指している場合は shared N、ちょうど一つの場合は ↩ 1、どちらでもなければ何も表示されません。
  • 列記号と行番号は、エラーレポートが表示するのと同じ座標なので、「行 5、列 C」を直接指し示せます。 これらをクリックすると、複数対象への操作やドラッグ移動のためにその列や行が 選択されます ——下記の 行と列を選択する を参照してください。
  • 列記号は列ではなく に属します。列を移動すると、反映後にその列が収まる位置の記号が表示されます。追加したがまだプッシュしていない列にも、これから割り当てられる記号が同じルールで表示されます。
  • 構造編集は 右クリックメニュー にあります。列ヘッダーはプロパティ・移動・両側への挿入・削除を提供し、行番号のガターは上へ移動・下へ移動・削除を提供します。ブロックされている項目も、その理由を添えたまま表示され続けます。
  • 列ヘッダーには この列まで固定 もあり、その列とその左側にあるすべての列を、水平スクロールの外側にある専用ペインに固定します(下記参照)。
  • 列メニューの残り——列の幅、幅を自動調整、非表示、フィルタ、列のデータをクリア、そして並べ替え項目——については、下記の 列の幅・非表示・列ごとのフィルタ で説明します。サイズ変更用のドラッグハンドルは、各列記号セルの右端にあります。
  • 参照セルの内部では、壊れている リストの断片だけがハイライトされます。

キャンバス

  • 行をアクティブにすると、テーブルの下に開きます。
  • 開いたレコードは 中央 に置かれます: それが消費するものは から流れ込み、それを消費するものは に並びます。キャンバス上部のセグメントコントロールで、それぞれの方向にどこまで広げるかを選べます。
  • グリップをドラッグしてサイズを変更でき、Esc で閉じます。
  • 各ノードカードは、参照 ポート と、編集可能な値の行としての通常列の両方を表示するため、キャンバスは単なる絵ではなく、もう一つの編集場所です(下記の キャンバス上での編集 を参照)。

ノードインスペクター

キャンバスの右下にあります。次を含みます:

  • ノードのセルアドレス(クリックするとグリッド内のそのセルにフォーカスします)
  • 「共有レコード」/「このキーは存在しません」/「このレコードは新規です」という注記
  • Used by リスト(項目をクリックするとそこへ移動します)
  • 組み込みの Go to this sheet アクション
  • 該当する場合の Duplicate and split / Cancel new row

Problems

下部のパネルには、インポートが生成するのと同じ診断結果が、同じレポートレンダラーによって描画されます。パイプラインが信頼できる情報源であり、ウィンドウが独自のメッセージを作り出すことは決してありません。行をクリックすると、問題のあるセルにフォーカスし、そのキャンバスを開きます。

ドメインパネル

プラグインが登録したパネルごとに一つのセグメントを持つ、右側のペインです。折りたたみ可能で、どれを開いていたかを記憶します。これはプラグインがパネルを登録した場合にのみ描画されます——何も登録されていなければ、空の箱は表示されません。空の箱は、何かが欠けていることを主張してしまうからです。

Push モーダル

書き込み前の差分です: 保留中のすべての変更について、タブ・行のキー・フィールド・旧値 → 新値を示し、一部の編集が isolated である場合はその注記も添えます。Addressables セクションには、この反映が行うすべてのアセット登録(追加・移動・グループ作成 — セルを編集する を参照)が一覧表示されます。Cancel すれば何も書き込まれません。

セルを編集する

  • ウィジェットは @type に従います。読み取られる @type は画面上のものなので、追加または型変更したもののまだプッシュしていない列にも、すでにその型に対応したウィジェットが表示されます。
    • 必須の bool はトグルです。任意の bool は enum セルと同じピッカーを開きます——三つの状態を持つためです。
    • Enum<T> は値と ▾ として表示され、参照セルが使うのと同じ検索可能なピッカーウィンドウ を開きます。未知の値は、サイレントに書き換えられるのではなく、リストの先頭にとどまります。enum がシートで定義されている場合、ピッカーの末尾には 「Add a new member…」 が表示されます。空の任意セルには 、または — (default) と表示されます。
    • RecordId@Tab 列には 参照ドロップダウン(下記)が付きます。
    • AssetRef@Group 列には アセットピッカー(ドロップ対応)(下記)が付きます。
    • Color / AnimationCurve / Gradient 列には Unity 自身の カラー・カーブ・グラデーションフィールド(下記)が付きます。
    • それ以外——数値、文字列、キー、参照ではない List<>、ラッパー、カスタム型——はすべて正規の生テキストです。そのテキストこそがパーサーがラウンドトリップする対象だからです。
  • 参照セルには、常にドロップダウンがあります。 RecordId@Tab セルは、テキストボックス に加えて ▾ ボタンを持ちます。キーを手入力することも引き続き可能です。このボタンは、対象シートが現在候補を一つも提示できない場合でも表示されます——その状態は通常、いま何かが壊れていることを意味し、まさにそういうときにこそこのツールが必要になるため、ピッカーはその旨を伝え、空のリストを開く代わりに作成を提案します。
    • List<RecordId@Tab> セルには +▾ が付きます。ピッカーは開いたままになり、各行が チェックボックス になるため、三件のレコードにチェックを入れるのも一回の操作で済みます。チェックを入れると追加、外すとその要素を削除し、各チェックはそれぞれ独立した undo ステップです。
    • 要素の 順序 はドロップダウンが答えるものではありません。要素の並べ替えはキャンバスから行います(リストの各要素はそれぞれ独自の ▲▼ 行を持ちます)。
    • スカラーセルは値を置き換えると閉じ、セル内にすでにあるキーにはマークが付くため、二度選ぶことはできません。
  • 任意列は、空に戻すこともできます。 列が ? または =default を宣言している場合、ピッカー——参照・enum・任意の真偽値のどれでも同じく——には、セルがフォールバックする値をラベルにした 空にする 行が用意されます。必須列にはこの行がありません。そこでは空のセルがエラーになるためです。
  • 足りないレコードを、そのセルから作成できます。 欲しいキーが存在しない場合は、ピッカーの + Create a new … record を押してください: 検索ボックスが、シートの共通プレフィックスをあらかじめ入力したキーボックスに変わります。名前を入力して Enter を押すと、行が作成され、同時に このセルにも書き込まれます——これは一つの Ctrl+Z ステップです。
    • うまくいかない場合にはこの行自体が提供されません。コードが所有するキー空間には追加できず、ピッカーがその旨を一文で伝えます。読み取り専用のソース、実行中のパイプライン、xlsx 由来のシートは、キャンバスと同じゲートでこれをブロックします。
  • アセットセルにはピッカーがあり、ドロップも受け付けます。 AssetRef@Group セルは、テキストボックス に加えて ボタンを持ちます——Unity のオブジェクトフィールドと同じ考え方です。アセットがどちらの経路で来ても、ルールは同じです。
    • は SheetForge のアセットピッカーを開きます: そのグループにすでにあるアドレス——列に <Type> があればそれに絞り込まれ、サブアセットは親の後ろに parent[sub] として一覧表示されます——を、検索ボックスと現在値のマークとともに示します。一覧の下にある ⊙ プロジェクトを参照… の行は、そのタイプでフィルタリングされた Unity 自身のオブジェクトピッカーを開きます。
    • Project ウィンドウからセルへアセットをドラッグする こともできます: スカラー列には一つのアセットを、List<> には任意の数のアセットを(順番に追記されます。セルにすでにあるキーはスキップされます)。
    • そのグループにすでに登録されているアセットは、既存のアドレスをそのまま使います。まだアドレス指定可能になっていないアセットは 登録がステージングされます: セルには拡張子なしのファイル名がそのアドレスとして即座に入りますが、グループエントリ(まだグループ自体が存在しない場合はグループそのものも)が作成されるのは 反映を行ったとき ——シートの書き込みが成功した後——です。それまではプロジェクト内は何も変わらず、ステージングを破棄しても何も変化しません。
    • 別の グループに登録済みのアセットの場合は、先に確認されます——二つのグループの名前と、旧グループを通じてそのアセットを参照している他のセルの数を示すダイアログが表示され——その後 移動 としてステージングされます。
    • 次の場合は却下され、理由を告げるトーストが表示されます: シーンオブジェクト、フォルダー、スカラーセルに複数のアセットをドロップした場合、列のタイプを満たさないアセット、そしてそのグループ内ですでに別のアセットが使っているアドレス。
    • ステージングされた登録は、push モーダルの Addressables の下に表示され、トップバーのピルにもカウントされます。Ctrl+Z はセルの値と登録を一緒に取り消します。セルを再入力してそのアドレスを参照するものがなくなった場合も、同じステップで登録が取り消されるため、古い登録だけが単独で残ることはありません。
    • すべてのアセットセルには、右端に常設の ボタンもあります: 押すと Project ウィンドウがそのアセットをピン表示して選択します——リストセルの場合はそれが保持するすべてのアセットを選択し、最初のものをピン表示します。parent[sub] アドレスの場合は、そのサブオブジェクト自体をピン表示します。セルを Ctrl+クリック(macOS では Cmd+クリック)しても同じ動作になり、通常のクリックは引き続きテキストを編集します。アドレスがアセットとして解決できない場合、ボタンは表示されたまま無効化され、理由がツールチップとして表示されます。
    • セルを右クリックすると プロジェクトでピン表示(リストセルでも使えます)、そして任意列の場合は クリア(デフォルト) が使えます。キャンバスの value row にも同じピンボタンがあります。同じウィジェットだからです。
    • Problems は、反映する前に UnknownAssetKeyAssetTypeMismatch を報告します。ステージングされた登録はエラーではありません——投影はすでにそれを織り込み済みだからです。Addressables パッケージがない場合、⊙ ボタンとドロップは無効化され、理由がツールチップとして表示されますが、アドレスの手入力は引き続き機能します。
  • アセットセルは、アセットそのものを表示します。 AssetRef セルのアドレスが解決すると、テキストの隣に小さな サムネイル が表示されます——エディターがプレビューを描画できるすべてのアセットタイプが対象で、行の高さが決して変わらないようにサイズが調整されます。List<> セルは、その最初の要素のサムネイルを表示します。
    • サムネイルをクリックすると、フローティングの 拡大表示 が開きます。レコードキャンバス上では、画像アセットはカード上に大きく描画されます。
    • 解決しないアドレスは、単にサムネイルを表示しません——↗ ピンボタンにはすでに理由が示されています。
  • AssetRef<AudioClip> セルは再生できます。 クリップのアドレスの隣にある再生ボタンは、エディター自身のプレビューチャンネルを通じてそれを再生します。もう一度押すと停止し、ほかの操作に移るとき——セルの切り替え、ウィンドウを閉じる、ドメインリロード——も同様に停止します。
    • エディターのビルドがプレビュー機能を提供できない場合、ボタンは表示されたまま無効化され、理由がツールチップとして表示されます。アセットがオーディオクリップではないセルには、そもそもボタンがありません。
  • カラー・カーブ・グラデーションのセルは、ネイティブのフィールドそのものです。 ColorAnimationCurveGradient のスカラーセルは、セル全体が Unity のカラーフィールド・カーブフィールド・グラデーションフィールド そのもの であり、生テキストではありません。
    • どの変更も正規のテキストとしてコミットされます(シート構文 を参照)。カラーピッカーでのドラッグやカーブエディターでの一連の操作のような、まとまった変更は一つの undo ステップに統合されます——これは入力に適用されるのと同じルールです。
    • 任意列では、空のセルは と表示されます。クリックすると型のデフォルト値でフィールドが開き、右クリック ▸ クリア(デフォルト) で再び空にできます。
    • List<Color>List<AnimationCurve>List<Gradient>チップエディター です: 要素ごとに一つのチップ(スウォッチ、カーブのサムネイル、グラデーションバー)と、 チップがあります。クリックすると、要素ごとのネイティブフィールドに加えて ▲▼ と ✕ を持つポップアップが開きます。追加・削除・並べ替え、そして各要素の編集は、それぞれが独自の undo ステップです。リストの順序もデータだからです。それ以外の型のリストは正規のテキストのままです。
    • キャンバスの value row も、まったく同じウィジェットを使います。
  • 列フォームからアセット列をタイプに制限する。 列プロパティフォーム——そして列追加フォームとシート作成フォームでも——@type フィールドの横には常に タイプ… ボタンが表示され、入力中の記法が AssetRef@Group である間は有効になり、それ以外のときは無効化されて理由を示すツールチップが表示されます。このボタンは、プロジェクトが読み込めるアセットタイプ(検索可能、短縮名とサブタイトルとしてのフルネーム)を一覧表示し、フィールドを AssetRef@Group<Type> に書き換えます。List<>?=default はそのまま残されます。制限なし(すべてのアセット)<…> を取り除きます。制限を手入力することもできます。列ヘッダーのツールチップには、解決済みのフルタイプ名が表示されます。
  • 入力したものが、そのまま即座に見えます。 グリッドのテキストは baseline とあなたのステージングの合成なので、検証を待つことは決してありません。コミットされた値は、コミットされた瞬間に ステージング中の色を帯びます ——ドロップダウンから選んだ値でも、ビジュアル値の編集でも、素早いタイピングでも同じで、セルがまだフォーカスを持っている間でも変わりません。より重いプレビュー(Problems、カウンター、チップ、キャンバス)は、キー入力ごとではなく、一連の編集のまとまりごとに再計算されます——ただしキャンバス上の一回限りの操作の後だけは、その場で再描画されます。
  • 入力中のインライン検証はありません — 診断情報はただ一つのチャネル(pre-flight/インポートのバリデーター)からのみ得られ、Problems に表示されます。
  • + Row は、提案された id(共通プレフィックスの検出、衝突回避)を持つレコードを追加します。保留中のすべての変更——セル編集、キー編集、行追加、すべて破棄——は Ctrl+Z / Ctrl+Y の一ステップであり、保留中の変更がある状態でウィンドウを閉じると、保存/破棄/キャンセルを確認されます。
  • ↑ Push to source は、共有のディスパッチャーを実行します: 事前検証 → ソースごとの書き戻し → 自動再インポート。キーの名前変更では引き続き「N 件の参照が更新されます — 続行しますか?」と確認され、Google への push でも、何かが送信される前に計画の承認が引き続き表示されます。
  • 正直なゲート:
    • 読み取り専用のソース(Google ExportUrl)では、編集と push がマウスオーバーで理由を示しながら無効化されます。
    • xlsx 由来のタブはバッジ付きで読み取り専用になります(書き戻しは xlsx をスキップします)。
    • import/export/push の実行中は、pull と push が無効化されます。

行と列を選択する——そしてドラッグする

グリッドの座標は、スプレッドシートと同じようにハンドルです。

  • 行番号をクリックするとその行が、列記号をクリックするとその列が選択されます。
    • Ctrl+クリック で選択にさらに追加でき、Shift+クリック で直前のクリックからの範囲を選択します。
    • ヘッダーと本体は選択されているものすべてをハイライトし、キーボードのフォーカスがあるセルは、矢印キーでの移動に追従する選択枠を描きます。
    • シートを切り替えると選択は解除されます——そこでは同じ番号が別の列を指すことになるためです——そしてメニューには 選択を解除 の項目があります。
  • 選択をドラッグして移動する。 選択されている行番号(または列記号)をつかんでドラッグすると、挿入線がドロップ先を示し、ドロップするとその選択がそこへ移動します——これは 一つの Ctrl+Z ステップ です。
    • 連続していない選択——たとえば 2, 5 と 9 行目——は、選択した順序のままドロップ地点にまとめられて 到着します。
    • 並べ替え・検索・フィルタが表示順序を固定している間は、メニュー項目が自ら無効化されるのと同じ理由で行の移動も拒否され続けます——そしてドラッグを始めようとした瞬間、黙って動かないのではなく、その旨を伝えます。
  • 右クリックメニューは選択全体に作用します。 複数の列が選択されている状態では、列の幅…幅を自動調整非表示、◀▶ の移動、削除、列のデータをクリア… が選択されているすべての列に適用され、複数の行が選択されている状態では、移動と削除がそのすべてに及びます——それぞれのバッチが一つの undo ステップです。
    • 一度に一つの対象にしか意味を持たない項目——プロパティ、フィルタ、並べ替え、固定、挿入——は、それぞれ独自の単一対象向けセクションに分かれています。
    • ブロックされている項目は、ほかのすべての場所と同じく、理由を添えたまま表示され続けます。

選択は画面上だけのジェスチャーです: 何らかの操作がそれを使うまでは、何もステージングされず、書き込まれることもありません。

メニューそのものが、いまや一つのコンポーネントです。 Studio 内のすべてのコンテキストメニューとドロップダウンメニュー——列ヘッダー、行のガター、ツールバーの ⋯、サイドバー、キャンバスのノードとワイヤー、セルメニュー——は、すべて同じ形をしています: タイトル付きのセクション、チェックマーク、キーボード操作、そして理由を添えたまま留まる無効化された項目。これは Web アプリのメニューと同じ形なので、両者の間で新たに覚え直す必要はありません。

キャンバス上での編集

キャンバスは、テーブルと同じステージングバッファーを編集します——以下のすべては通常の保留中の変更です: push モーダルに表示され、一つの Ctrl+Z ステップであり、同じ pre-flight と再インポートのチェーンによって書き戻されます。

描画されるもの

すべてが一方向に流れます: 左に材料、右にそれを使うもの、その間に開いたレコードが置かれます。

キャンバス上部のセグメントコントロールで、それぞれの方向にどこまで広げるかを選べます:

  • materials → this → used by — それぞれ一段階ずつ
  • materials only — 組み立てのチェーンを追うための二段階
  • used by のみ

自身に参照列を持たないシートは左側に何も表示されないため、最後の選択肢だけを提供します。この段階の上限があるのは、広く使われている一つの材料がプロジェクト全体を画面に注ぎ込んでしまわないようにするためです。さらに先を見るには、隣接するノードをダブルクリックして、それを新しい terminus にしてください。

  • 同じレコードに二度到達しても、ノードは一つのままです。
  • 存在しないレコードもそのまま描画され、壊れているとマークされます——見えないリンクは、直せないリンクだからです。
  • 循環も隠されません——それを閉じるエッジは、カードの下のレーンをダッシュ線で戻っていくため、どこに戻るのかを追うことができます。

レイアウトは決定的です: 同じデータは常に同じ絵を生成します。ノードの位置はそのセッションの間だけドラッグでき、そのドラッグは意図的に保存されません。

ノード上にあるもの

ヘッダーには、キー、サブタイトル(そのシート名、またはプラグインが提供した人間が読める名前)、セルアドレス、そして他にこのレコードを指しているものの数を示すバッジがあります。

その下には、参照 ポート が常に表示されます。ポートはワイヤーが差し込まれる場所なので、隠してしまうと絵が嘘をつくことになります。それぞれ、塗りつぶされた/空のドット、何を受け入れるか、いくつリンクされているかを示します。リストポートは要素を順番に表示し、それぞれに移動・削除の操作が付いています。リストの順序はデータそのものだからです。

通常の列は「n values」というグループに折りたたまれ、terminus では開き、それ以外では閉じています。各行は入力できる value row で、グリッドと同じウィジェットが使われ、同じゲートを通じてコミットされます。ポートのドットは、それが 受け入れる シートの色に着色されるため、一続きのチェーンは一つの色として読み取れます。

カードは、テーブルと同じ投影を表示します。 このバッチでステージングされた列——まだ反映されていない、必須列・参照型の列も含めて——は、テーブルのヘッダーが示すのと同じ方法でペンディングとしてマークされた状態で、すでにカード上に現れます(ツールチップも同様です): ステージングされた参照列はポートとして、ステージングされた通常列は value row として現れ、ステージングされたリネームは元の値の上に新しい名前を表示し、ステージングされた削除はカードからもその行を取り除きます。データが入ったシートに必須列を追加しても、空のセルがまだ埋まっている間にカードが空になることはありません——キャンバスは、グリッドとまったく同じように、反映後にそのシートがどうなるかを表示し続けます。

右肩には、一つだけの output dot があります。このレコードがエクスポートするのはそれ自身なので、ドットは一つだけであり、そこからドラッグすると、ポートからドラッグする場合(「これは何を指しているか?」)とは逆の問い(「これをどこで使うか?」)を尋ねます。

これが描画されるのは、プロジェクト内のどこかのシートが、実際にこのシートを受け入れる列を持っている場合だけです——行き先のないドットは、失敗することが保証されたアフォーダンスだからです。判定基準は データ ではなく スキーマ です: RecordId@ThisSheet を宣言している列があれば、誰も一行も書いていない段階でも、そのドットは有効なままです。

ジェスチャーとメニュー

ドットがハンドルです。 ポートのドット を押すとジェスチャーが始まり、行の他の場所を押しても始まりません。そのため誤ってつかんでしまうことはありません。移動せずに押して離せば、それは通常のクリックとして扱われます。

  • カードの ヘッダー はそれ自身のハンドルです:
    • クリックするとカードが選択されます(重なっている他のカードより手前に表示されます)。
    • ドラッグするとそのセッションの間だけカードを移動できます。
    • ダブルクリックするとそのレコードが新しい terminus になります。
  • 空のキャンバスを右クリック → New record。 段階的なピッカー が開きます: 左ペインには、現在描画されている ポートが指しているシートが一覧表示され、右ペインには検索・作成・レコード一覧があり、複数のポートが受け取り得る場合には、三ページ目でどのポートがそのレコードを受け取るかを尋ねられます。
    • プラグインは、そのシート一覧を絞り込んだり広げたりできます。プラグインが宣言したシートで画面上のどのポートも受け入れないものは、消えるのではなく、理由を添えたまま一覧に残ります。
    • ここには文脈のない「new record」はありません——キャンバス上で生まれるレコードは、必ずリンクされた状態で生まれます。単独の行が欲しい場合は、テーブルの + Row を使ってください。
  • 空のポートのドットをクリックする、またはノードを右クリック → Connect で、その列をリンクできます。ピッカーは カーソルの位置 に開き、グリッドが使うのと同じ検索可能なキー一覧です。
    • 二行のヘッダーが、そのスロットが何を受け入れるか、そしてピックがどのセルに書き込まれるかを示します。
    • 各行にはキー、その表示名、すでにいくつの場所から指されているかが表示され、すでにここにリンクされているキーには、サイレントに重複させるのではなくマークが付きます。
    • 欲しいレコードがまだ存在しない場合、検索ボックスはシートの共通プレフィックスをあらかじめ入力した キーボックス になります。名前を入力して Enter を押すと、作成 リンクが一つのジェスチャーとして行われ、一回の Ctrl+Z で元に戻せます。名前が空、またはすでに使われている場合は、何も作成せずにその旨(と場所)を伝えます。
  • キャンバス上で作成したレコードは、そのままキャンバスになります。 ビューは、カードをダブルクリックしたときと同じようにそのレコードへ遷移するため、新しいレコードが中央に置かれ、たった今作ったリンクがその横に並びます。(フォークは例外です——フォークの目的は、この terminus が自分自身のコピーを保持することなので、ビューはその場にとどまります。)
  • 空のポートのドットからドラッグする と、ワイヤーがカーソルに追従します: カードにドロップするとリンクされ、空のキャンバスにドロップするとそこにピッカーが開きます。
    • output dot からのドラッグは逆方向です。カードの上で離すと、キャンバスは そのカードの どの列がこのレコードを受け取れるかを調べます(候補が一つならそのまま直接リンクし、複数ならどれか尋ねます)。空のキャンバスにドロップすると、画面外のシートも含めて、それを受け取り 得る シートの鏡合わせのカスケードが開きます。
    • ドラッグ中は、無関係なものはすべて薄くなり、受け入れ可能なポートは光るため、有効なターゲットは推測ではなく目で確認できます。
    • 完了したジェスチャーには必ず、書き込まれたセルの名前を伝える短い トースト が表示されます——重要な場合には、そのリンクが循環を閉じたことや、そのレコードが他の誰かと共有されるようになったことも伝えます。
  • すでに繋がっているリンクを持ち上げる。 塗りつぶされた 単一参照のポートをドラッグすると、まさにソケットからケーブルを引き抜くように、そのワイヤーそのものが持ち上がります。別のカードにドロップすると向き先を変更し、別のポートにドロップするとリンクを二つのセルにまたがって移動します(これも一回の undo ステップであり、両方の計画が成立しない限りどちらのセルも書き込まれません)。元の場所に戻す、あるいは Esc を押せば、何も変更されません。
    • 空のキャンバスにドロップすると、カーソル位置にそのセルのピッカーが開き、その場で切断が実行されるのではなく、切断はその中の一行として提示されます——滑った手が、うっかりリンクを消してしまわないようにするためです。
    • 移動せずにそうしたドットをクリックすると、代わりにそのワイヤーが選択されるため、この二つのジェスチャーが互いを妨げることは決してありません。
    • 塗りつぶされたスカラーポートは、他の誰かのドラッグにとって依然として有効な ターゲット です——そこにドロップすると 置き換え を意味します。
    • リストポートには持ち上げるべき単一のワイヤーが存在しないため、常に 新しい リンクを開始します。要素の削除や並べ替えは、その要素自身の ✕ / ▲▼ 行が担います。
  • ワイヤーの本体は、選択のためのものであり、ドラッグのためのものではありません。 ワイヤーのどこをクリックしても——クリック可能な帯はその経路のすべての区間に追従します——選択され、wire inspector が開きます。Delete、または右クリック ▸ Disconnect で切断できます。向き先の変更は上記のポートのジェスチャーで行うため、それぞれの操作にはちょうど一つのやり方しかありません。
  • ノードを右クリック → Delete this record。 一つのダイアログが、失われるものすべてを明示します: そのレコードを指しているコネクションの数、そしてその行にある保留中の編集のうち破棄される数です。
  • 共有レコードをフォークする。 レコードが複数の場所で使われている場合、node inspector は Duplicate and split を提供します: すべての列を新しいキー(シートのプレフィックスから提案されます)に複製し、この キャンバスのリンクだけをそのコピーに向け直します。これは一回の undo ステップであり、他の全員が使っているレコードには手が加えられません。
  • wire inspector は、選択したワイヤーとともに開きます: そこでは 一行が一つのトークン です——リンクが書き込まれているセル、そのセルの全テキストをトークンに分割し、この行がどれに当たるかにマークを付けたものです。
    • そのエッジを開いたプラグインが記述している場合には、キーではない部分のトークン(attack:add:10add:10 にあたる部分)を編集するための一行があります。その行を編集すると、残りの部分だけが書き換えられます。それが 何を指すか を変更するのは向き先の変更であり、それはポートのジェスチャーで行います。
    • ここから、それが指しているレコードを開いたり、リンクを切断したりすることもできます。
  • Delete キーは選択状態を読み取り、ここでその選択が何を意味するかを判断します。
    • ワイヤーが選択されていれば、そのワイヤーを切断します。
    • カード が選択されている場合は、そのカードが開いているレコードそのものかどうかによって挙動が変わります。terminus——中央にあるカードで、この画面が 主題としている レコード——であれば、メニュー項目と同じ確認ダイアログを経て、そのレコードを削除します。
    • それ以外の 他の カードであれば、そのカードとこの画面の間にある すべて の接続を一度に切断します。ここから見ればそのカードは主題ではなく材料だからです。これは一回の undo ステップで、計画は連結されているため、リスト列は最後の一つを残すのではなく、一致する要素すべてを失います。切断できない接続がある場合は、黙って失敗するのではなく理由を伝えます。
    • (右クリック ▸ Delete this record は、どのカード上であっても常に削除を意味します——キーは選択に応じて意味が変わるショートカットであり、メニュー項目の方が明示的です。)
    • プラグインが描画した、シートの行ではないカードには、削除やリンク解除の対象になるものが何もないため、このキーは何もしません。
  • 何にもリンクされていない新規レコードは、他人のキャンバスには描画されません。 新しい行がここに表示されるのは、保留中の接続によって画面上の何かに結び付けられている間だけです——そうでなければ、テーブル内の未完成な一行が、プロジェクト内のあらゆるキャンバスに付いて回ってしまいます。
    • これによって何かが失われるわけではありません。キャンバス から レコードを作成すると、ビューは即座にそのレコードへ遷移するため、たった今作った行こそが、まさに今見ているものです。テーブルで作った行はテーブルにとどまります。そして最終的に何にもリンクされなかった行は、描画されたことがあってもなくても、破棄される前に reflect ダイアログの破棄リストにその名前が挙げられます。
  • Ctrl/Cmd + ホイールでズーム します。キャンバスは 25 % から 200 % の間でズームし、カーソルの下にある点は動きません。キャンバスヘッダーのパーセンテージ表示はボタンになっており、押すと 100 % に戻ります。通常のホイール操作は、そのままスクロールです。
  • 中ボタンドラッグ——または Alt + 左ボタン——でパンします。 押している間はカーソルが変化するため、キャンバス上の何かではなくビュー自体が動いていることが分かります。
    • 左ドラッグ単体は引き続き「選択とリンク」を意味するため、パンには専用のボタンが割り当てられています。Alt + 左ボタンは、中ボタンのないマウスやトラックパッドのための同じジェスチャーです。
    • パンはコンテンツの端で止まります: これは無限に広がる平面ではなくスクロールビューなので、グラフを空白の彼方へ見失うことはありません。

切断と拒否

切断は、押す前にその結果を伝えます。 クリアが拒否されることはありませんが、メニュー項目にはその結果が明記されます:

  • デフォルト値を持つ任意列は そのデフォルトにフォールバックします。ワイヤーはなくなりますが、レコードはランタイムで引き続き解決されます。
  • デフォルトのない任意列は単に空になります。
  • 必須 列は空のセルになって Problems に報告されます——ステージングすることはできますが、pre-flight はそれを埋めるまで reflect を止めます。
  • リストは、その一つの要素を失うだけです。

検証は一つのチャネルに集約されており、キャンバスが独自に別の検証を走らせることは決してありません。

二つのことだけは、偽装されるのではなく実際に拒否されます。メニューにはそのどちらであるかが示されます:

  • どのセルに書き込まれているかを示さないワイヤーは、編集できません。 core 自身が読み取る参照については、core がこれを埋めます。ワイヤーを手動で追加するプラグインは、これを自ら提供する(か、正直に省略する)必要があります。
  • カスタム型の内部に埋め込まれたリンク——たとえば Modifier の値の中にあるステータス名など——は、そのエッジを開いたプラグインが IAuthorableEdgeContributor にもオプトインしている場合にのみ編集できます。そうでなければ、そのワイヤーは表示専用です。

重複したキー、読み取り専用のソース、xlsx 由来のタブ、実行中のインポートは、テーブルでの編集を無効化するのとまったく同じように、キャンバスでの編集も無効化し、それぞれの理由がメニュー項目に示されます。

構造編集

以下のすべては、セル編集と同じようにステージングされます——即座に見え、undo可能で、一回の書き戻しで確定します。これらの機能は、上記の 右クリックメニュー(列ヘッダー・行のガター・サイドバーのシート)にあります。

Studio では、シート名の隣にあるシートのヘッダーバーにも常設のボタンが用意されており、右クリックメニューの存在を知らなくても、最もよく使う操作を見つけられます——その中には + Row と、末尾に列を追加する + Column があります。同じバーには、シート名変更の @overlap 行のトグル、そして検索とソートのコントロールがあります。特定の位置に新しい列を挿入したい場合は、引き続きヘッダーの右クリックを使います。

  • : 追加・削除・移動、そしてプロパティをその場で編集できます。
    • プロパティフォーム(ヘッダーの properties ✎)は name、@type@desc@overlap をまとめて 編集します。変わるのはマーカーセルだけで、列のデータセルは 100% 保持されます(削除して追加し直すことによるデータ損失はありません)。
    • @overlap はチェックボックスです。初めて必要になったときにその行が自動作成され、常に一意であるキー列では無効化されます。
    • @type の入力は入力しながら検証されます。事前検証(pre-flight)は、何かが書き込まれる前に、既存のすべてのセルが新しい型と互換性があるかを確認します。
  • マーカー: 任意の @overlap 行を追加/削除します。シート自身の @style グループラベルと色も、同じ経路(サイドバーを右クリック ▸ Group & color ✎)でステージングされます。そのため、グルーピングと色分けは、エディターローカルな状態として保持されるのではなく、他の編集と同じようにシートへ書き戻されます。
  • : 削除、そして ▲▼ による並べ替え(Studio では、ガターメニューの「move up」/「move down」)。
  • 列の並べ替え — 何回移動しても、反映は一回で確定します。保留中(新規追加)の列も並べ替え可能で、既存の列を追い越して先頭まで移動できます。
  • コメントと空行は、すべての構造編集を通じて保持されます。

WYSIWYG: グリッドは反映後のシートのライブプレビューである

ステージングした内容は、そのままただちに見た目に反映されます:

  • 追加した列は即座に表示され——同じバッチ内でそのセルを埋めることができます(既存の行、新規の行のどちらでも)。これが、データの入ったタブに 必須 の列を追加する方法です: 列を追加し、値を一緒に埋めてください。埋められていない必須セルは事前検証で検出されます。
  • 削除した列/行は即座に消えます。 ステージングサマリーには、保留中の内容が一覧表示されます(Deleted: column 'hp' · Added: column 'mp')——表示のみです。
  • 一つのバッチの中で、あらゆる操作が自由に混在できます: 値の編集、行の追加、複数の列の追加/削除、マーカーの切り替え、並べ替え——「一バッチにつき一操作」といった制限はありません。
  • すでに保留中の編集がある列/行を削除する場合(または値が入力済みの新規列をキャンセルする場合)は、「N 件の編集が失われます — 続行しますか?」 と確認されます——何かがサイレントに破棄されることはありません。

タブの名前変更と A↔B の入れ替え — 参照はデータに追従する

タブの名前変更(「Rename tab ✎」)は、ソースの名前を変更し(ローカル: 拡張子を保持したままファイル名を変更、Google: タイトルの変更 — 内容には触れません)、確認ダイアログの後、すべてのシートにわたって、そのタブへの すべての @type 参照 を更新します(RecordId@FooRecordId@Bar。リストやカスタム形式も含みます)。

相互入れ替え(A↔B)や循環は一回のバッチでサポートされます——どちらの半分を先にステージングしても機能し、参照は、アトミックな入れ替え書き換えを通じてデータに追従します。

  • ローカルでは、二つのファイルの内容を一回の書き込みで交換し、古い拡張子の使われなくなったファイルをクリーンアップします。
  • Google では、瞬間的な重複を避けるため、一時的なタイトルを使ってタイトル変更をトポロジカルに順序付けます。

再インポートが、生成クラスの名前変更、旧クラスファイルの削除、ベイクされた SO と Addressables アドレスの再登録といったクリーンアップを自動的に処理します。

参照の伝播を伴うキー(RecordId)の名前変更

グリッド内でキーセルを直接編集します。反映時には、「N 件の参照が更新されます — 続行しますか?」 という確認の後、そのキーを参照している すべてのタブのすべてのセル(RecordId@ThisTab のスカラーとリスト要素)がまとめて更新されます。ローカル・Google どちらの経路でも機能します。境界:

  • 伝播が触れるのは baseline のセルだけ です——同じバッチ内で たった今入力した テキストが、サイレントに書き換えられることは決してありません。代わりに事前検証が宙に浮いた参照を検出するため、あなたはそれを承知の上で修正できます。
  • もし伝播が xlsx 由来のタブ に触れることになる場合、反映全体がブロックされます(部分的な反映は決して許されません)——そのワークブックを直接編集し、再インポートしてください。
  • 副次的な整数キー(IntId)も同じ方法で編集できます。

Ctrl+Z / Ctrl+Y — Unity ネイティブの Undo に接続

ステージング中のあらゆる変更は Unity 標準の Undo に統合されています:

  • セルの編集
  • キーの編集
  • 列の追加/削除/キャンセル
  • 行の追加/削除
  • マーカーの切り替え
  • 並べ替え
  • プロパティの編集
  • タブの名前変更
  • キャンバスでのリンクとリンク解除
  • アセットのドロップと、それがステージングする登録
  • 「すべて破棄」さえも

知っておくべき境界が二つあります:

  • テキストフィールドに入力している間は、そのフィールド自体が先に Ctrl+Z を消費します(標準的な Windows の挙動です)。
  • 反映が成功した後、ステージングの履歴は クリアされます — Ctrl+Z は反映前のセッション内でのみ機能します。すでにシートに書き込まれた変更は、シートを編集することで元に戻します。

保留中の編集は再インポートを乗り越える

保留中の編集は、物理的な行番号ではなく 論理アドレス(タブ・行のキー・フィールド)を持ち、反映の直前に再解決されます。そのため、あなたのステージングは、自動的な再インポートやバックグラウンドでの baseline の変更を乗り越えて生き残ります。

もしシートが 外部で 変更され、それが解決を破綻させた場合——行のキーが外部で名前変更された、行が削除された、あるいはキーが競合するようになった——その編集は 分離されます: 反映から除外され、「isolated」バッジとともに表示されます。それはサイレントに破棄されることも、セッションの残りをブロックすることもありません。確認の上で、個別に破棄することができます。

事前検証 — 検証してから反映する

書き戻しは、まず メモリ上に投影された状態全体 を検証します——参照の整合性、@overlap の一意性、アセットキーとアセットタイプ(このセッションでステージングされた登録は存在するものとしてカウントされます)、そしてプラグインのドメインバリデーターです。検証が失敗した場合、何も書き込まれず、完全なレポートが得られます。投影された状態全体が検証を通過して初めて、書き込みが開始されます。ステージングされた Addressables の登録は、シートの書き込みが成功した後、自動的な再インポートの前に実行されます。ステージングされた変更が登録だけであるような反映でも、その登録は実行され、再インポートが行われます(ソース・エクスポート・プッシュ を参照)。

シートの作成 / 削除

  • 作成 は、二つの組み込みテンプレートのいずれか、プラグインが登録したテンプレート、またはフィールドをゼロから定義すること(from scratch)で行います。ワンクリックで、ローカルファイルまたは Google のタブが作成されます(警告の後)。
    • 組み込みテンプレートは アイテム例(コア型のみ) と、@enum シートを用意する Enum definitions(下記参照)です。
    • プラグインが登録したテンプレートは、プラグインが提供する場合にのみ存在します — 例: Plugin Demo の skill タブ。
  • 現在インポート元にしているソースとは別のソースに作成する場合、ダイアログは実行前にその旨を伝えます: 自動的な再インポートは古いソースを読み取ってしまい、新しいタブを見つけられないため、作成するとインポートソースが切り替わり、作成先のソースが設定アセットに保存されます。
  • 削除 は、ソース・baseline・ベイクされた SO・生成された .cs を、まとめてすべてクリーンアップします(強い警告 + 承認)。

タブ横断検索(All エントリ)

サイドバーの先頭項目は All です: 語句を入力すると、すべてのシートの id とフィールド値を部分一致で検索し、シート・キー・フィールド・値を 50 行ずつのページで一覧表示します。ボックスを空のままにすると、すべてのシートの全レコードを閲覧できます。

これは ベイクされた データベースを読み取るため、最初に一度成功したインポートが必要で、まだない場合はその旨を明確に伝えます。結果は、インポートが完了したときやアクティブな設定が変わったときに自動的に更新され、古い答えを表示したままにはなりません。

結果の行は、単なる一覧ではなく扉です。ダブルクリックする——または行を選択して Enter を押す——と、一致したセルが選択された状態でそのシートが開きます。シングルクリックでは行が選択されるだけです。結果はベイクされたデータから得られるため、現在のセッションでまだ読み込まれていないシートを結果が指すこともあります——その行は遷移せず、一覧の下の短い注記が(何もしないのではなく)その理由を伝えます。

インポートに失敗したシートを開く(quarantine)

これまで、検証エラーが出ると、それを直す手立てが何もありませんでした: インポートが失敗するとウィンドウには何のシートも表示されず、進む道はスプレッドシート自体を直接開くことだけでした。これは今では逆になっています。

取得と保存は、検証とは切り離されています。 ソースを最後まで読み取れてさえいれば、検証が失敗していても、シートは baseline スナップショットとして保存されます——そのため Studio はそれらを開き、問題のあるセルすべてに対してエラーを表示し、いつもどおり修正して push できます。

止まったままなのは 出力 の方です: エラー件数がゼロになるまで、コード生成とベイクは実行されません。「部分的な組み立てはしない」という原則は、それが本来属する場所——出口——で守られ続けます。

  • 推測ではなく、はっきり伝えられます。 コンソールは、シートが保存されたこと、そして何がブロックされているかを伝えます。サイドバーには ⛔ N error(s) — code generation and baking are blocked という通知があり、クリックすると最初のエラーにジャンプします。シートごとのエラーバッジは、Problems ですでに見ているのと同じ投影診断から来ています。まったくパースできなかったシートは、空として表示されるのではなく、その旨を伝えます。
  • 修正を push するときは、一度だけ確認されます。 シートが quarantine されている間、書き戻しには追加の確認が表示されます: 既存のエラーはそのまま残り、この編集が新たに持ち込むエラーも書き込まれます——検証がそれを止めることはありません。見つかったものはすべて、その反映のレポートに警告として列挙され、その後の自動再インポートがシート全体を再検証します。健全なシートでは何も変わりません: pre-flight は引き続き厳格なゲートです。
  • 出口は閉じたままです。 quarantine されている間は、実運用シートへの Export と Push のどちらも拒否されます。どちらも、直前に成功したベイク済みの値を新しいシートに継ぎ足す動作をするため、誰かがたった今直した値をロールバックしてしまうからです。同じ理由でビルドは鮮度チェックによって止められ、「はじめに」ウィンドウにもこの状態が表示されます。
  • このフラグが解除されるのは、ちょうど一箇所だけです——インポートがベイクまで最後まで通り抜けた瞬間です。それより前のどの段階でも解除されることはないため、後になって失敗しても、誤った「問題なし」が残ることはありません。

並べ替えとフィルター(表示のみ)

Studio には、シートごとの並べ替え(任意の列、昇順/降順、型を意識した比較、プロジェクトごとに保存)と テキストフィルター が追加されています。どちらも表示順序だけを変更します: ガターは実際のシート行番号を保持したままで、並べ替えやフィルターは、ステージング・反映・push・export のいずれにも影響しません。並べ替えやフィルターが有効な間は、ガターメニューの行移動項目は無効化され、その理由が示されます。「見た目の隣」は本当の隣ではないからです。下記で説明する列ごとの値フィルタと列の非表示も、同じ規則に従います。

固定列(表示のみ)

列ヘッダーを右クリック ▸ この列まで固定 を選ぶと、その列と、その左側にあるすべての列が、水平スクロールの外側にある専用のペインに移動します——そのため、遠くの列までスクロールしても、キーは常に見えたままになります。列の固定を解除 で解除できます。少なくとも一つの列はスクロール可能なままである必要があるため、最後の一列を固定しようとすると、理由とともに拒否されます。列が一つしかないテーブルには、固定できるものがありません。

固定されるのは、特定の名前を持つ列ではなく、左からの列数 です——そのため列を移動すると、どの列が固定されているかが変わります。これは、スプレッドシートの固定ペインの挙動とまったく同じです。並べ替えやフィルターと同様、これはビューの設定であり、プロジェクトごとの設定にシート単位で保存されます: シート自体には一切反映されないため、読み取り専用や xlsx 由来のシートでも、インポートの実行中でも機能し、push や export には一切現れません。

列の幅・非表示・列ごとのフィルタ(表示のみ)

データシートでも enum 定義シートでも、あらゆる列は手動でサイズ変更できます: 列記号セルの右端にあるハンドルをドラッグする、ハンドルをダブルクリックして測定済みの幅に戻す、あるいは列メニューの 列の幅… で正確な数値を指定するか、幅を自動調整 で測定し直します。下限は 24px で、上限はありません。幅はシートごとに保存され、シートやエディターが戻ってきたときに復元されます。自動調整は——表示中の行だけでなく——すべての行を測定するため、フィルタによって幅が飛ぶことはありません。

同じ列メニューには、スプレッドシートらしい残りの機能も収められています:

  • 列を非表示にする / 非表示の列を表示(n) ——非表示はビューの設定です: 記号はシートの実際の位置(A・C・D)を示したままで、ヘッダーと本体には非表示の列がある位置を示す太い境界線が引かれ、ツールバーのチップがその数を数えます。最後に表示されている列は、理由とともに非表示化を拒否します。非表示の列は、それ以外のすべての場所——キャンバス、検証、Export、Push——では変わらず存在し続けます。
  • フィルタ… ——列の値のチェックリスト(空のセル用の (空白) 項目付き)に加えて、一つの条件を指定できます: 任意の列に対する含む / 含まない / 空白 / 空白ではない、そして数値列に対する等しい / 等しくない / より大きい / より小さい / 以上 / 以下です。何もチェックしていない場合はすべての値が通過し、条件はそのまま適用されます。フィルタは検索ボックスと組み合わさり、新しく追加した行は常に表示されたままで、ツールバーのチップがフィルタされた列の数を数え、フィルタをクリア が一つを解除します。
  • 列のデータをクリア… ——確認の後、その列の値をすべての行(フィルタで除外されている行や、ステージング済みの新規行を含む)で一つの undo ステップとして空にします。キー列は拒否します——各行の名前がそこにあるため、名前の変更はセルで行ってください——そして必須列は、再入力されるまで正直にエラーを報告し続けます。クリアするものが何もない列は、何もステージングしません。
  • 昇順で並べ替え / 降順で並べ替え / シートの順序 ——シートごとの並べ替えが、今では列メニューにも表示され、現在の選択にはチェックマークが付きます。

並べ替えや固定列と同様、これらはすべて表示のみです: シートごとのビュー設定であり、シートにも push にも export にも決して反映されません。

enum 定義シート

enum を定義するシート(シート構文 を参照)にはレコードがないため、Studio はレコードテーブルの代わりに専用のグリッドを用意します。グリッドには enum ごとに一列あり、そのメンバーが順番に並び、サイドバーには Enum definitions バッジと、保持している enum の数が表示されます。他のシートと同じように読めます: 上部には列記号、ガターには実際のシート行番号、同じ順序の同じ右クリックメニュー、そしてデータテーブルが使うのと同じ色で示されるステージング済みの変更です。

シートの構造は、データシートとまったく同じように、その場でオーサリングできます:

  • 新しい Enum を定義する には、ヘッダーバーの + Enum ボタン(まだ Enum が一つもない定義シートに最初の Enum を置ける唯一の方法です)を使うか、列ヘッダーの右クリックメニューから任意の位置に追加します。フォームには、名前、任意の基になる型と説明、そして最初のメンバーを入力します——メンバーがゼロの Enum はインポートできないため、少なくとも一つが必要です。メンバーの順序がそのまま整数値になります。
  • Enum の名前を変更する と、それを参照するすべてのシートの @type セルが同じバッチで一緒に書き換えられるため、書き込み後の再インポートも問題なく解決されます。基になる型説明 はその場で編集できます——マーカー行は、シートにまだそれがなくても表示され、変更が反映されたときに作成されます。
  • Enum を削除する — いずれかのシートがまだ使用している間は、使用している列名とともに拒否されます。列の並べ替え は自由に行えます。Enum の列位置には意味がないため、常に安全です。
  • すべては他の編集と同じようにステージングされます: 即座に見え、一つのジェスチャーにつき一つの Ctrl+Z ステップで、一回の反映で書き込まれます。名前が有効か使用済みか、メンバーが有効か、基になる型が許可されているか、Enum がまだ使用中かどうか——あらゆる判定は、インポートを検証するのと同じコードによって行われるため、フォームと再インポートが食い違うことはありません。ブロックされた操作は、消えるのではなく、理由を添えたままそのメニューに残ります。

メンバーの行は引き続き末尾への追加のみで、並べ替えはできません。メンバーの位置がその値 そのもの だからです——メンバーを並べ替えると、すでにアセットに焼き込まれたデータの番号が変わってしまいます。

セルには、シートが記述している内容がそのまま表示されます: Name=value 構文で固定されたメンバーは、書かれたとおりに表示されます。重複チェックは名前の部分だけを比較するため、すでに Rare=10 を保持しているシートに Rare をステージングしようとすると、二重登録ではなく拒否されます。

メンバーを追加するためだけなら、シートを開く必要さえありません。プロジェクト内のどこにある Enum<T> セルのドロップダウンにも、末尾に 「Add a new member…」 があります: 名前を入力すると、一つの Ctrl+Z ステップとして enum シートにステージングされ、次の反映で書き込まれるまで保留中として表示されます。プラグイン C# から登録された enum では、この行は表示されず失敗するのではなく、そもそも提供されません——シートがその enum を所有していないためです。

ウェブアプリも同じルールで、同じようにこれらのシートをオーサリングします——SheetForge Web を参照してください。

コンソールのエラーからセルへジャンプする

インポートまたは反映がエラーを見つけると、人間に読みやすいコンソールレポートには、各エラーの座標の隣にクリック可能な 「Open in Data Studio」 リンクが追加されます。それをクリックすると Studio が開き、そのタブに切り替わり、そのセルをハイライトします(行の左のバーと、セルの枠線)。特定のセルを持たないエラー(ファイル/タブレベル)は、そのタブにフォーカスするだけです。このリンクは人間に読みやすいレポートにのみ追加されます。CI やログのスクレイピングが頼りにしているマシン可読な座標行は、手を加えられていません。

ヘルスチェック

Studio ツールバーの ⋯ ▸ ヘルスチェック は、ネットワーク不要の簡易診断を実行し、次のそれぞれについて ✓/✗ と修正案を表示します:

  • アクティブな設定
  • ソースへの到達可能性 — 存在するローカルフォルダー、または Google の id + サービスアカウントキーパス
  • インポートの baseline
  • 生成コード/ベイク/addressable の鮮度

サマリーダイアログには、対応が必要なチェック項目の数が表示されます。

アクティブなインポート設定

プロジェクトに SheetForgeSettings アセットが 複数 ある場合、ツールバーにドロップダウンが表示され、どれを アクティブ にするか選べます。一つを選ぶと即座にアクティブ化され、ビューが再構築されます。メニュー・インポート・このウィンドウは、いずれもそのアクティブな選択に従います。設定アセットが一つだけの場合、このドロップダウンは表示されません。アクティブな選択はプロジェクトごと・ユーザーごとに保存され(VCS には影響しません)、「はじめに」 ウィンドウ(Tools ▸ SheetForge ▸ はじめに)や、設定アセット自身のインスペクター(「active」 バッジ、または 「Set as active」 ボタンを表示します)からも管理できます。

セーフティネット

  • ローカルソースに対する 外部変更の検知
  • 保留中の変更がある場合の クローズ時の警告
  • 古くなったグリッドに対して操作してしまうことを防ぐ、ステージング世代のアンカー。
  • モードの認識: 読み取り専用のソース(Google ExportUrl)では、Push / 反映 / 構造編集 / 削除が無効化され、マウスオーバーで説明が表示されます。
  • インポート/エクスポート/プッシュ中の プログレスバー は、常にクリアされ(try/finally)、ローカライズされています。
  • 誤動作する拡張機能が、ウィンドウ全体を巻き込むことはありません: キャンバスオーバーライド・ウィジェット・アクションは try/catch の内側で呼び出され、失敗しても英語のコンソール警告が出るだけで、ウィンドウの他の部分は動作し続けます。

名前変更の前に知っておくべきこと(反映後は元に戻せません)

  • 列の名前変更 / @type の変更 は、生成されるフィールド(名前/型)を再生成します。そのフィールドを参照するゲームコードは、手動で更新する必要があります。確認ダイアログはそのことを明示的に伝え、結果として生じるコンパイルの break は、自動チェーンによって実行可能な文とともに安全に中断されます。列の は保持されます。
  • タブの名前変更 は、生成されるクラス名(FooDatabaseBarDatabase)を変更します——同じルールが適用されます。
  • 相互入れ替えや循環は、単一の名前変更と同じルールに従います(上記のタブ名前変更の節を参照)。却下されるのは、二つの名前変更が同じ名前を対象にしているという 本物の 競合の場合だけです。
  • xlsx 由来のタブは名前変更の対象外です。 フォームはその理由を伝え、Apply は無効化されます——ワークブック自体でシート名を変更してから再インポートしてください。
  • Google では、一つだけ限界が残っています: 入れ替えられた二つのタブが 互いを参照している 場合、それらは向き先を変更されません(ローカルは完全に正しく処理します)——機能と制限 を参照してください。
  • 反映後、これらは Ctrl+Z できません(シートはすでに書き込まれています)。

テスト編集(一時的な SO の調整)

ベイクされた SO のインスペクターには、「テスト編集」トグル(デフォルトはオフ = 読み取り専用)があります。オンにすると、SO の値を 一時的に 調整し、ランタイムの数値を試すことができます——シートに書き込まれることは決してなく、次の再インポートで消えます。レコードは、エディターでも Play モードでも、codeName/id によってすばやく見つけられます。

ワークベンチが持っていた、独自の「保留中の値を SO 上にプレビューする」ボタンは、そのウィンドウとともになくなりました。それを駆動していたオーバーレイは、それを必要とするツールのために、引き続き公開 API として残っています: EphemeralSoApply は、正直に計算できるものだけを適用し、保留中の列やパースに失敗したセルは、偽装するのではなく適用を見送ります。上記のトグルが、日常的なケースをカバーします。

プラグインの有無

プラグインなし(コアのみ)に挙げられている内容はすべて、プラグインなしのプロジェクトでもそのまま機能します。プラグインあり の各行は、ドメインプラグインが追加するものです。そのすべてが同梱の Plugin Demo で実際に動いているため、自分で書く前に、それぞれの動作を確認できます(プラグイン作成)。

  • シート・セル・行
    • プラグインなし: 完全なテーブル、セル編集、行追加、ステージング、Ctrl+Z、push。
    • プラグインあり: 変わりません。
  • Pull / Push
    • プラグインなし: アクティブなソースからのインポート。同じ pre-flight + 再インポートのチェーンを通じた push。
    • プラグインあり: 変わりません。
  • Problems
    • プラグインなし: コアの四つの検証(キー、参照、@overlap、アセットキー)。
    • プラグインあり: これに加えて独自の IDomainValidator ルール。デモでは、ブレーキのない反応サイクルと孤立レコードに対して警告します。
  • キャンバスが表示するもの
    • プラグインなし: 開いたレコード、それが何から構成されているか、そして何がそれを使っているかを、決定的なレイアウトで表示します。
    • プラグインあり: これに加えて、ISheetForgeGraphPlugin によるタブ単位のオーバーライド——シートのレコードではない識別子、core からは見えないリンク、ドメインの順序で固定された列(絶対位置、または画面上のレコードからの相対位置)、そしてレコードが持つ人間が読める名前です。デモでは、ExampleActions レコードの周囲にイベントノードとコードブロックを生やし、ExampleSkills レコードの詠唱ステージを固定し、カードとピッカーの中で fireballFireball に変えます。
  • 描画されるエッジ
    • プラグインなし: core のスキャナーが認識する、すべての RecordId@Tab 参照(スカラー、リスト要素、デフォルト値、ラッパーの内部)。
    • プラグインあり: これに加えて IEdgeContributor が宣言するエッジと、キャンバスオーバーライドが明らかにする追加のエッジです。デモでは、Modifier ミニ構文の値の内部に埋め込まれたステータス参照を開きます。
  • キャンバス上での編集
    • プラグインなし: すべての列について、作成・接続・切断・向き先変更・フォーク・削除、そしてインラインでの値編集。描画されたポートが指すシートに、新しいレコードを作成できます。
    • プラグインあり: これに加えて、新しいレコードをどこに作成できるかを決める IAuthorableGraphShape、コントリビューター自身のエッジを編集可能にする IAuthorableEdgeContributor、そしてトークンのうちキーでない部分を公開する IEdgeTokenEditor です。デモのコントリビューターは、ステータスをリンク/リンク解除するたびに modifier ミニ構文を書き換え、その op:value を wire inspector 内の編集可能な一行として提供します。
  • セルウィジェット
    • プラグインなし: 組み込みの分岐(トグル、選択ピッカー、参照ピッカー、ドロップ対応のアセットピッカー、カラー / カーブ / グラデーションフィールド、その三つのリストに対するチップリスト、生テキスト)。
    • プラグインあり: これに加えて、特定のセルタイプ一つに対する独自の IStudioCellEditorProvider。ウィジェットのコードがまったくない場合でも、StudioCellEditorHint がその型に対して七つの組み込み形状(ドロップダウン、複数行、スライダー、トグル、カラー、カーブ、グラデーション)のいずれかを指定できます。登録済みウィジェットが優先され、hint はコアのデフォルトより優先されます——同じ型名でパックが hint を登録した場合、組み込みのカラー / カーブ / グラデーションの hint よりも優先される点も含みます。
  • メニューとパネル
    • プラグインなし: 組み込みの項目のみ。
    • プラグインあり: これに加えて、独自の ISheetForgeStudioPlugin 登録——インスペクター末尾の動詞、行メニュー、列ヘッダーメニュー、キャンバスノードメニュー、トップバーの 、右側のサマリーパネル、そして列ヘッダー横のバッジです。デモでは、ある行に反応ブレーキを一つステージングし、一つの Undo ステップで列全体を埋め、詠唱時間ゲージでスキルの構成をまとめます。
  • リッチパネル
    • プラグインなし: なし。
    • プラグインあり: IStudioPanelProvider が、任意の UIToolkit パネルを描画します。記述済みパネルと同じ id で登録されている場合はこちらが優先され、ブラウザーは記述済みのものを描画します。
  • サイドバー
    • プラグインなし: あなたのシートのみ。
    • プラグインあり: これに加えて、ロックされた _Refs 形式のコードレジストリ(ISheetForgeCodeRegistryPlugin)が、読み取り専用の key/label/raises グリッドとして表示されます。これらのキーを指すエッジは、壊れているとは描画され ません
  • キャンバス上部
    • プラグインなし: 何もありません(core はウィジェットを同梱しません)。
    • プラグインあり: 独自の IStudioGraphWidget。デモでは、terminus の行から埋められる固定のステージ帯(VALIDATE → CAST → COMMIT → DELIVER → APPLY)を表示します。
  • ノードインスペクター
    • プラグインなし: アドレス、used-by リスト、「Go to this sheet」、「Duplicate and split」。
    • プラグインあり: これに加えて、独自の IStudioInspectorAction ボタン。デモでは、ブレーキのない反応に対して brakeSeconds = 0.25 をステージングします(通常の、undo 可能な保留中の編集です)。
  • 色とラベル
    • プラグインなし: 組み込みのプリセットに加え、各シート自身の @style の色。
    • プラグインあり: これに加えて、独自の ISheetForgeThemePlugin プリセットと ISheetForgeStringsPlugin の文字列——これらは Core に登録されるため、同じパックのラベルはブラウザーにも表示されます。

空のプロジェクトから始める

アクティブなインポート設定がない 状態で開くと、Studio はテーブルの代わりに 「Get started」 パネルを表示します——設定アセットの作成、Plugin/Core デモのインポート、「はじめに」を開くための、インラインボタンです。設定が存在するようになると、このパネルは消えます。

さらに手早くする方法もあります: ウィンドウに フォルダーをドラッグするか、単一の .tsv/.csv/.xlsx ファイルをドラッグしてください(その場合は親フォルダーが使われます)。確認の後、そのフォルダーから読み込むインポート設定アセットが作成され、アクティブになります。すでにアクティブな設定がある場合は、ダイアログがその旨を伝え、新しいものを作成して切り替えることを提案します。

ワークベンチはどうなったか

もともとの IMGUI ワークベンチ ウィンドウは削除されました。Studio とオーサリングセッション・組み立て/検証エンジン・反映経路を共有していたため、挙動として失われたものは何もありません——そしてワークベンチだけが提供していた三つの機能は、先に移設済みです。

ワークベンチの機能現在の置き場所
ページングつきのタブ横断検索を行う All タブStudio サイドバー先頭の All エントリ(同じ検索、同じページサイズ)
ドラッグ&ドロップ によるオンボーディングStudio 自身がそのドロップを受け取ります(上記)
Google の gid 自動入力 / ライブなタブ一覧パネル設定アセットのインスペクター、Google Sheets の下

一つの機能だけは、移設ではなく廃止されました: ワークベンチが持っていた、保留中の値をベイクされた SO 上にプレビューするボタンです。SO インスペクターの テスト編集 トグルが、同じニーズをカバーします(上記の テスト編集 を参照)。

もしそれを指すコードやメモが残っている場合: 更新すべきメニュー項目はありません——もともと存在しなかったからです——そして設定インスペクター、ベイクされた SO のインスペクター、「はじめに」のテンプレートギャラリーは、いずれも Data Studio を開きます。

関連ページ