API リファレンス — 公開サーフェス
このページには、製品のアセンブリに含まれる すべての public 型 を掲載しています。ここに載っていないものは、設計上 internal です——公開サーフェスは意図的に狭く保たれています。
- Core(
SheetForge.Core+SheetForge.Core.Tooling): 137個の public 型(Core: 131個、Core.Tooling: 6個)。Core.Tooling は、レポート出力や Push プランニングのようなインポート時サービスを持つ、エディター専用の半身です——そのためプレイヤービルドには一切含まれません。 - Editor: トップレベルの public 型53個と、それらの public なネスト型。
- Runtime: 7個の型に加え、生成される出力。
これはまさに、コンシューマーシミュレーションテスト(InternalsVisibleTo なし)がコンパイル対象とするサーフェスそのものです。
検出契約(型ではない): 別のアセットも、Editor アセンブリが自己登録する
SHEETFORGEスクリプティング定義シンボルを通じて、コンパイル時に SheetForge がインストールされていることを検出できます。これは define であり public な型ではないため、下記の表には載っていません——プラグイン作成 ▸ 他のアセットから SheetForge を検出する を参照してください。(SHEETFORGE_ADDRESSABLES——Addressables パッケージが存在するかどうかだけを示す内部的なバージョン定義——とは別のものです。)
表記の規則: シグネチャは省略されています(… = ソースの XML ドキュメントを参照)。「pure(純粋)」は、UnityEngine への依存も IO もないことを意味します。
Core アセンブリ(SheetForge.Core)— 純粋な C#
UnityEngine への依存なし、IO なし、ネットワークなし、ドメイン知識なし。コンパイラによって強制されています: Core は何も参照しません。
プラグイン登録契約(SheetForge.Core.Plugins)
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
ISheetForgePlugin | interface | 基本となるドメインプラグインの契約。string Name · RegisterEnums(EnumRegistry) · RegisterCellParsers(CellParserRegistry) |
ISheetForgeValidatorPlugin | interface | 検証ルールのためのオプトインアドオン。RegisterValidators(DomainValidatorRegistry) |
ISheetForgeEdgePlugin | interface | エッジ宣言のためのオプトインアドオン。RegisterEdgeContributors(EdgeContributorRegistry) |
ISheetForgeMarkerPlugin | interface | カスタム構造マーカーのためのオプトインアドオン。RegisterStructuralMarkers(MarkerRegistry) |
ISheetForgeTemplatePlugin | interface | 「シート作成」テンプレートのためのオプトインアドオン。RegisterTemplates(TemplateRegistry) |
ISheetForgeGraphPlugin | interface | タブ単位の Data Studio キャンバスオーバーライドを登録する、オプトインアドオン。RegisterGraphShapes(GraphShapeRegistry) |
ISheetForgeCodeRegistryPlugin | interface | コードが所有する参照先(ロックされた仮想タブ)のためのオプトインアドオン。RegisterCodeRegistries(CodeRegistryCatalog) |
ISheetForgeThemePlugin | interface | ウィンドウのカラープリセットのためのオプトインアドオン。RegisterThemes(ThemeRegistry) |
ISheetForgeStudioPlugin | interface | 宣言的な オーサリングサーフェス(アクション、パネル、列バッジ、セルエディターの hint)のためのオプトインアドオン。RegisterStudioUi(StudioUiRegistry)。Editor ではなく Core にあるため、一度の登録が UIToolkit のエディターとブラウザーの両方に描画されます |
ISheetForgeStringsPlugin | interface | あなたのパックの UI 文字列を言語ごとに登録する、オプトインアドオン。RegisterStrings(StringOverlayRegistry)。エディターにしか届かなかった、廃止済みの Editor 側 ISheetForgeLocPlugin / PluginLocRegistry の組を置き換えます |
ISheetForgePipelinePlugin | interface | パイプラインオブザーバーを登録する、オプトインアドオン。RegisterPipelineObservers(PipelineObserverRegistry) |
構成と互換性(SheetForge.Core.Plugins)
発見はホストごとです——エディターでは Unity の TypeCache、Web ではブラウザーのアップロード済みアセンブリスキャン。それ以降(インスタンス化、順序付け、隔離、互換性ゲート)はすべて、一つの共有された Core の機能であり、これが二つのホストがスロットごとに乖離しないようにしています。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
PluginComposition | static class | 唯一のアセンブリ経路。型ごとに一つのインスタンスが、それが実装するすべての契約にキャストされます。二つのメンバーと診断の振り分けは、表の下にあります |
PluginSet | sealed class | 組み立てられた結果——十二のスロット: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes · Strings · StudioUi · PipelineObservers。新しいスロットは、ここに追加されることで両方のホストに届きます |
SheetForgePluginCompatAttribute | sealed attribute (assembly) | [assembly: SheetForgePluginCompat(SheetForgePluginFormat.Current, MinHostVersion = "…", PluginVersion = "…")]。int FormatVersion · string MinHostVersion(数値のドット区切り比較。null/空 = 要件なし)· string PluginVersion(表示専用、比較には使われません)。何もインスタンス化せずに読み取られ、アセンブリ単位 で判定されます——拒否されたアセンブリは、半分だけ読み込まれるのではなく、すべての登録を失います。宣言なし = 世代 Minimum、ホスト要件なし |
SheetForgePluginFormat | static class | 世代の定数: const int Current · const int Minimum。プラグインフォーマット自体が置き換えられたときだけ動きます——純粋な追加的成長では、この番号は動きません |
PluginComposition — 二つのメンバー:
IReadOnlyList<Type> ContractTypes— 発見のフィルターです。その順序は固定されています。診断情報が現れる順序を決めるためです。PluginSet Compose(IReadOnlyList<Type> candidateTypes, string hostVersion, ErrorCollector errors, ICollection<string> failures, Func<string,bool> isProductKey = null)— 組み立て呼び出しそのものです。
二種類の問題は分けて扱われます。登録の衝突と互換性の拒否は errors の中で構造化された診断情報になり、実装のバグ——構築失敗、例外を投げるコールバック——は failures の中で英語の一行になります。そこに null を渡すと、それらは破棄されます。
末尾の isProductKey 述語は、文字列オーバーレイの「プラグインは製品キーを上書きできない」というルールが、Core が言語テーブルを一切見ることなく強制される仕組みです: ルールはここにあり、ホストは素材だけを供給します。この述語を省略すると、そのルールだけがスキップされます。
レジストリ(SheetForge.Core.Model / .Validation / .Edges)
| 型 | 役割 & 主なメンバー |
|---|---|
EnumRegistry | enum 名 → CLR 型(コード生成用の素材)。Register<TEnum>() · Register(name, memberNames) · TryGetMembers · TryGetClrTypeName · TryGetClrAssemblyName · RegisteredEnumNames。さらに三つのメンバーの詳細は表の下にあります |
CellParserRegistry | 型名 → セルパーサー(オープン・クローズド)。重複登録は例外を投げます。Register(ICellValueParser) · TryGet · TryGetCustomRenderer · RegisteredTypeNames · RegisterWrapper(ICellWrapperType) · TryGetWrapper · RegisteredWrapperNames(ラッパー型) |
DomainValidatorRegistry | 追記専用のバリデーターリストで、順序は保持されます。Register(IDomainValidator) · Validators |
EdgeContributorRegistry | 追記専用のコントリビューターリストで、順序は保持されます。Register(IEdgeContributor) · Contributors |
MarkerRegistry | マーカー名(@ なし)→ カスタム構造マーカー。組み込みマーカー(SheetSyntax.ReservedMarkers — @name/@type/@desc/@overlap/@style/@enum/@loc)との衝突 / 重複 / 無効な識別子は例外を投げます。Register(IStructuralMarkerDefinition) · TryGet · IsEmpty · RegisteredMarkerNames · AppendMarkerTokens |
TemplateRegistry | 「シート作成」テンプレートのキー → テンプレート。空/重複したキー、空の表示名、ゼロ個のタブ、空のタブ TSV は例外を投げます。Register(DataTemplate) · TryGet · Templates · IsEmpty |
EnumRegistry — 三つのメンバーの詳細:
EnumRegistry(EnumRegistry parent)— 親を読み取りつつ、登録は自分自身にのみ行う子です。親はドメインリロード全体を通じてプラグインが登録した CLR enum を保持し、子は今回のインポートでシート定義された enum を保持するため、インポートが共有キャッシュを変更することは決してありません。親がすでに所有している名前を登録しようとすると、それを覆い隠すのではなく例外を投げます。Contains(name)— 自分自身、次に親、Ordinal で判定します。SetClrTypeName(name, fullTypeName)— 文字列のみの登録の後で CLR 名を埋めます。型がまだ存在しないため、アセンブリ名は空のままです。
「シート作成」テンプレート(SheetForge.Core.Model)
| 型 | 役割 & 主なメンバー |
|---|---|
DataTemplate | プラグインが登録するテンプレート: string Key(レジストリ上の識別子)· string DisplayName(プラグイン自身が所有するテキスト)· IReadOnlyList<DataTemplateTab> Tabs(一つ以上) |
DataTemplateTab | テンプレートの一つのタブ: string TabName · string Tsv(完全に正規化された TSV — マーカー行にサンプルデータを加えたもの) |
カスタムセルタイプ(SheetForge.Core.Model)
| 型 | 役割 & 主なメンバー |
|---|---|
ICellValueParser | 一つのスカラーセルをパースします。失敗した場合は context.Errors に収集して false を返します(例外は投げません)。string TypeName · bool TryParse(CellParseContext, string, out object) |
ICustomCellType | コード生成/ラウンドトリップのための任意のヘルパー。Type ValueType · bool TryRender(object, out string text, out string reason) |
IReferencingCellType | 登録済みの ICellValueParser が追加で実装できる、オプトインの capability です。これにより、その記法の内部に埋め込まれたキーが、RecordId@Tab と同じ完全な扱いを受けます——整合性 + 提案、ペイロードを保ったままのキー名変更伝播、グラフのエッジとポート、▾ ピッカー、孤立検出、エクスポートされるドロップダウンルール。登録済みのパーサーをキャストする ことで見つかります(別の登録は不要です)。bool TryGetTokenKey(elementText, out key) · string MakeToken(key) · bool TryRetargetToken(elementText, newKey, out newText) · bool TryRemoveToken(elementText, key, out newText)(空の結果 = その要素が消えます)· bool TryRewriteKeys(elementText, IReadOnlyDictionary<string,string> renames, out newText)。一回の呼び出し = 一つの要素(セル全体、または ; 区切りの一つの要素)であるため、ペイロードに ; を含めることはできません。@target は実在するシートのタブを指していなければなりません(そうでなければ UnknownTargetTab)。例外は決して投げません——false/null は「解釈できない」ことを意味し、書き換えの際には残りの部分を保存します |
IRefBearingValue | 上記の値側の半分であり、パース済みの値 が実装します: IEnumerable<string> ReferencedKeys(宣言順序 = 診断と提案予算の順序。null/空のエントリはスキップされます)。スキャナーはこれを読み取り、上記のテキスト側のフックはセルを書き換えます。両方が必要です——パース済みの値は作者の記法を復元できず、テキストは読み取られなければ検証できません |
ICellWrapperType | 汎用のラッパー値形状 MyWrapper<T>(例: Pair<int> = 1~2)— ラッパーが外側の構文を持ち、内側の型は Core が再帰的にパースします。string Name · bool TrySplit(string, out IReadOnlyList<string> pieces, out string reason) · string JoinCanonical(IReadOnlyList<string>) · Type OpenClrType · object Assemble(IReadOnlyList<object>, Type closed) · bool TryDisassemble(object, out IReadOnlyList<object>, out string reason) |
WrapperValue | ラッパーセルのパース済み IR — ラッパーの戦略を保持し、内側の CellValue 群を公開します(これにより、内部の参照は検証・キー/タブの名前変更・Export を通過できます)。ICellWrapperType Wrapper · IReadOnlyList<CellValue> Inner |
IStructuralMarkerDefinition | カスタムの @marker 行(列ごとの値を持ち、列ごとに検証されます — @overlap を一般化したもの)。string MarkerName(@ なし)· string Description · void ValidateCell(MarkerCellContext) |
MarkerCellContext | 一回のマーカーセル検証呼び出し。string MarkerName · string RawText · string FieldName · CellCoordinate Coordinate · void Reject(string reason, string suggestion = null)(→ MarkerCellInvalid) |
CellParseContext | 一回のパース呼び出しのコンテキスト。TypeToken Type · CellCoordinate Coordinate · ErrorCollector Errors · EnumRegistry Enums |
シート文法定数(SheetForge.Core.Model)
セルのテキストを読み書きするパックは、インポーターと同じ文法で動作します——リストセルを分割する、@type 文字列を組み立てる、名前がすでに使われていないか確認する、といったことです。
これらの定数はその文法の単一の情報源であり、パックが自前の区切り文字を書き直すことは決してありません:文字をコピーして持っておくと、文法が変わった日にずれてしまいます。リストは読み取り専用として渡されるため、パックが何をしても文法そのものを変えることはできません。それらが表す記法は、シート構文 ページに完全に文書化されています——これはその文法へのプログラム的な取っ手です。
| 型 | 種類 | 役割 |
|---|---|---|
SheetSyntax | 静的クラス | シート文法を定数としてまとめたもの、以下でグループ分け |
マーカー
CommentPrefix(#) ·MarkerPrefix(@)。- 組み込みマーカー行ごとに定数一つ:
NameMarker·TypeMarker·DescMarker·OverlapMarker·StyleMarker·EnumMarker·LocMarker。 RequiredMarkers— すべてのシートが持たなければならない三つ。ReservedMarkers— すべての組み込み名。カスタムマーカーに名前を付ける前にこれを確認してください:衝突は登録時に拒否されます。
区切り文字
ListSeparator(;) — リストの要素の間。EntrySeparator(,)、FieldSeparator(:)、SectionSeparator(|)、KeyTimeSeparator(@) — 一つの値の 内側 にある層であり、だからこそ;が値自身のテキストの中に現れることは決してありません。StyleKeyValueSeparator(=) —@styleセルの内部。
@type の記法
OptionalSuffix(?) ·DefaultSeparator(=) ·TargetSeparator(@、RecordId@Tabのように)。ListTypeName·ListOpen(List<) ·ListClose(>)。
型名
- 組み込み名ごとに定数一つ:
IntTypeName·FloatTypeName·BoolTypeName·StringTypeName·RecordIdTypeName·IntIdTypeName·AssetRefTypeName·LocRefTypeName·ColorTypeName·AnimationCurveTypeName·GradientTypeName·EnumTypeName。 BuiltinScalarTypesとIsBuiltinScalarTypeName(name)——「この名前はすでに組み込みか?」に、パーサーがその名前で登録される前に答えます。StyleKeyNames(title、color) ·LocReservedColumns(smart、comment)。
値
TrueCanonical/FalseCanonical— 正規のboolテキスト。NumberCellStyles— すべての数値セルの読み取りに使われるNumberStyles。桁区切り文字は除外され、カルチャーは常に不変(invariant)なので、ロケールの小数点カンマは数値を静かに変えてしまう代わりに、はっきりと失敗します。
ドメイン検証(SheetForge.Core.Validation)
| 型 | 役割 & 主なメンバー |
|---|---|
IDomainValidator | 列/タブをまたぐルール。違反は、4つの要素すべてを伴う DomainRuleViolation として ctx.Errors に入ります。string Name · Validate(DomainValidationContext) |
DomainValidationContext | Tables(タブ → SheetTable)· KeyIndices · AssetKeys(null = スキップ)· Errors |
エッジの継ぎ目(SheetForge.Core.Validation / .Edges)
| 型 | 役割 & 主なメンバー |
|---|---|
ReferenceScanner(static) | 参照出現箇所の列挙における、唯一の信頼できる情報源。Scan(tables) · ScanTable · ScanField · IsReferenceField(TypeToken)、そして表の下で詳述する二つの参照用述語 |
RefKeyKind(enum) | ある参照が、文字列(RecordId)キー空間と整数(IntId)キー空間のどちらに一致するかを表します。ReferenceScanner.GetReferenceKind が返し、利用側はこれで分岐します。追記専用です |
ReferenceOccurrence(struct) | 一つの出現箇所 — Kind · FromTab · RowNumber · ColumnNumber · FieldName · TargetTab · TargetId · ToCoordinate() |
ReferenceOccurrenceKind(enum) | Scalar · ListElement · ExplicitDefault · WrapperElement · CustomElement(IRefBearingValue が自身の記法の外に宣言した参照——内部のレイアウトはその型に属するため、セル単位の座標になります)。追記専用なので、既存の値の意味が変わることはありません |
IEdgeContributor | スキャナーからは見えないエッジを宣言します。診断情報は発行しません。string Name · ContributeEdges(EdgeContributionContext, ICollection<EdgeSpec>) |
EdgeSpec | 一つのエッジ — FromTab/FromRecordId/ToTab/ToRecordId(+ 任意で FieldName、レコードエッジ用の PayloadTab/PayloadRecordId、Label) |
EdgeContributionContext | 読み取り専用の Tables + KeyIndices(エラーコレクターはありません — エッジは検証ではないためです) |
IAuthorableEdgeContributor | IEdgeContributor が追加で実装できる、オプトインの capability です。これにより、そのエッジをグラフキャンバス上で編集できるようになります。bool TryPlanConnect(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out EdgeCellWrite) · bool TryPlanDisconnect(EdgeAuthoringContext, RecordEdge, out EdgeCellWrite) — false = 何もステージングされず、その機能は理由とともに無効化されます。両方とも try/catch の内側で実行されます |
IEdgeTokenEditor | IEdgeContributor が追加で実装できる、オプトインの capability です。これにより、そのトークンの残りの部分(キーではないすべて)を wire inspector で編集できるようになります。bool TryDescribeToken(EdgeAuthoringContext, RecordEdge, out EdgeTokenDescription) · bool TryPlanSetModifier(EdgeAuthoringContext, RecordEdge, string newModifier, out EdgeCellWrite) — どちらも同じセルを読み取ります(エッジが知っているのは、それが何を指しているかであって、今日それがどう綴られているかではありません)。false = その行は隠されるか、正直に無効化されます。両方とも try/catch の内側で実行されます |
EdgeTokenDescription | 一つのトークンが何であり、その残りの部分をどう編集するか — TokenText(ハイライトする断片)· ModifierText · HasModifier · ModifierLabel · IsChoice · Options / OptionLabels。new EdgeTokenDescription(tokenText) = 残りの部分がない、つまり行は描画されません。選択肢用のコンストラクターは、選択肢リストが空の場合は自由テキストにフォールバックします |
IBatchAuthorableEdgeContributor | IAuthorableEdgeContributor の兄弟である、オプトインの capability です(継承ではありません): 一つのジェスチャーで複数の対になったセルを同時に変更しなければならないデータのために、接続/切断の計画をセル書き込みの リスト として扱います。bool TryPlanConnectMany(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out IReadOnlyList<EdgeCellWrite>) · bool TryPlanDisconnectMany(EdgeAuthoringContext, RecordEdge, out IReadOnlyList<EdgeCellWrite>) — リスト全体が一つの undo ステップとしてステージングされるか、まったくステージングされないかのどちらかです。単一形式のコントリビューターは引き続き機能し(フォールバック)、一つのクラスが両方を実装している場合はバッチ形式が優先されます |
IVirtualNodeFactory | オプトインの capability: 新しいシートの行ではないキャンバスの「create」ジェスチャーです。IReadOnlyList<VirtualNodeKind> KindsFor(EdgeAuthoringContext, tab, recordId)(メニュー構築のたびに呼び出されるため、軽量に保ってください)· bool TryPlanCreate(EdgeAuthoringContext, tab, recordId, VirtualNodeKind, out IReadOnlyList<EdgeCellWrite>) — false = セッションには触れられません。計画は、同じジェスチャーで作成中のレコードをターゲットにすることはできません |
VirtualNodeKind(struct) | 一つの作成可能な種類 — Id(選択時にそのまま返されます)· Label(すでに翻訳済みのメニューテキスト。/ はネストします)· IsUsable。null セーフ、default セーフです |
IEdgeSlotDeclarer | オプトインの capability: (仮想の)ノードが、ライブなエッジを必要とせずに 開くポートです。IReadOnlyList<DeclaredSlot> DeclareSlots(EdgeAuthoringContext, nodeTab, nodeRecordId) — 宣言されたスロットは、connect メニュー、ポートピッカー、カードのポート行に加わります。描画のたびに呼び出されるため、実装は軽量かつ副作用のないものでなければなりません |
DeclaredSlot(struct) | 一つの宣言済みスロット — FieldName(ノードごとに一意。ワイヤーがアンカーされるには、コントリビューターのエッジの FieldName と一致していなければなりません)· TargetTab · IsList · IsUsable。null セーフ、default セーフです |
EdgeAuthoringContext | 計画立案の入力 — Tables + string CellText(tab, recordId, field)。これは、セルを 今読める状態のまま(baseline とステージングの合成)返すため、連続して作られた二つのリンクは互いを認識できます |
EdgeCellWrite(struct) | 計画: TabName · RecordId · FieldName · NewRawText(空 = クリア)· IsAddressable。行番号ではなく、キーでアドレス指定されます |
ReferenceScanner — 二つの参照用述語:
GetReferencedTab(TypeToken)— あらゆる利用側が「これは参照か、そしてどこへの参照か」を尋ねるための唯一の述語です。RecordId@Tab、IntId@Tab(整数キー空間)、ラッパーの内側、そしてIsCustomReferenceが付いたカスタム型のいずれに対しても答えます。だからこそ、一つのオプトイン——そしてIntId@Tabについては、この述語の一つの拡張——だけで、これらすべてが同時に有効になります。GetReferenceKind(TypeToken)→RefKeyKind— その参照が 文字列 と 整数 のどちらのキー空間と比較されるかを表します。これにより、名前変更の伝播・ドロップダウン・ピッカーが正しく分岐できます。GetReferenceKind(TypeToken, tables)— テーブルを考慮するオーバーロードです。
core の参照は、自身のキー空間(RecordId / IntId)を自ら述べます。参照型のカスタム型には、それを述べるための記法がありません——MyType@Tab が唯一の綴りです——そのため、そのキー空間は 対象タブ自身のアイデンティティ から導出されます: RecordId を自己キーとするタブは文字列空間を、IntId のみのタブは整数空間を意味し、タブが不明な場合や tables が null の場合は文字列空間にフォールバックします(これは、トークンのみを見るオーバーロードが返すのと同じ答えです)。この導出こそが、既存の IReferencingCellType 実装を、一行も変更せずに IntId キーのタブへ向けられるようにしているものです。
参照グラフインデックス(SheetForge.Core.Edges)
core がスキャンした参照とコントリビューターのエッジを一つのモデルに統合し、双方向に索引化した不変のスナップショットです。表示用の材料です——診断情報を生成することは決してありません(問題に関する唯一の信頼できる情報源は、引き続きプロジェクションの Diagnostics です)。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
RecordEdge(struct) | value | 一つのエッジ。RecordEdgeOrigin Origin · FromTab · FromRecordId(フィールドレベルのエッジでは空)· FieldName · RowNumber / ColumnNumber(1始まり。0 = フィールド/タブレベル)· ToTab · ToRecordId(未解決の場合でも 意図された id)· bool IsDangling(構築時に確定)· Label · PayloadTab / PayloadRecordId(レコードエッジ) |
RecordEdgeOrigin(enum) | — | CoreReference(RecordId@Tab セルから読み取られたもの — 座標を持ちます)· Contributor(IEdgeContributor が宣言したもの — レコードレベル) |
ReferenceIndex | sealed class | スナップショット本体。static Build(tables, keyIndices, contributorEdges, codeRegistries, extraKeys = null)(最後の三つは null 可。extraKeys = タブ → 存在するがまだパースされていないキー。例えば、オーサリングサーフェスがたった今ステージングした行など。これにより、それらへのリンクが壊れているとは描画されません)· AllEdges(決定的な順序: from タブの Ordinal → 行 → 列 → 出現順)· OutEdges(tab, recordId) / InEdges(tab, recordId)(決して null になりません)· int InCount(tab, recordId) · bool TryGetRowKey(tab, rowNumber, out recordId) · DanglingEdges |
Data Studio のレコードキャンバス(SheetForge.Core.Graphing)
キャンバスは、何を描画するかを自力で決定します: 開いたレコード(terminus)から参照インデックスを外向きにたどり、結果を決定的に配置します。プラグインはその絵を置き換えるのではなく、追加 します。全体を通して純粋なデータです: 列はピクセルではなくグリッドのセルであり、色は、ウィンドウがパレットにマッピングする自由な Category 文字列です。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
IRecordCanvasAugmenter | interface | 一つのタブのキャンバスオーバーライドで、クロージャが組み立てられた 後に 呼び出されます。Augment(GraphBuildContext, CanvasAugmentBuilder, string terminusTab, string terminusRecordId)。何も追加しなければ、core の絵はそのままです。例外はウィンドウが捕捉し、英語のコンソール警告になります。アイデンティティはデータに属します(仮想ノードは、同じキーを持つ実在のレコードに敗れます)。表示のヒントである見た目は、そうではありません |
CanvasAugmentBuilder | sealed class | 書き込みサーフェスで、できることは四つだけです——メンバーとルールは表の下にあります |
GraphShapeRegistry | sealed class | タブ名 → キャンバスオーバーライド。Register(tabName, IRecordCanvasAugmenter)(重複したタブ / 空の名前 / null は例外を投げます)· TryGet · IsEmpty |
GraphBuildContext | sealed class | オーバーライドへの読み取り専用の入力。Tables(タブ → SheetTable)· ReferenceIndex References · IReadOnlyList<CodeRegistrySource> CodeRegistries(空でも null にはなりません)。エラーコレクターはありません——キャンバスは表示であり、検証ではないためです |
GraphSpecBuilder | sealed class | グラフ組み立てのヘルパー。ctor (GraphBuildContext) · static NodeKey(tab, recordId)(ワイヤーが指す唯一の真実)· AddNode(GraphNodeSpec)(最初の (Key, Column) が優先)· AddWire(GraphWireSpec) · AddWire(fromKey, toKey, label, fromTab, fromRecordId, fieldName, isCyclic = false, cyclicNote = null)(そのリンクが書き込まれているセルも名指しするオーバーロードで、これがワイヤーを編集可能にします) |
GraphSpec | sealed class | キャンバスが描画する、組み立て済みの結果 — Nodes · Wires(組み立てはビルダーを経由します。ctor は internal です) |
GraphNodeSpec | sealed class | 一つのノード。Key · Tab · RecordId · Title · Subtitle · Category · CellCoordinate Address · Column / Row(キャンバスがすでに解決済みのグリッドセル——ここでは選ばれるのではなく運ばれるだけです)· IsFocus(terminus)· IsMissing · InCount · IsCyclic |
GraphWireSpec | sealed class | 一つのワイヤー。FromKey · ToKey · Label · IsCyclic · CyclicNote、そして任意の所有セル: FromTab · FromRecordId · FieldName · RecordEdge? SourceEdge(null = 表示専用のワイヤー。この場合キャンバスは編集できないと伝えます)。五つの表示用引数は変わっていないため、既存の呼び出しはそのままコンパイルでき、まったく同じように描画されます |
IAuthorableGraphShape | interface | IRecordCanvasAugmenter が追加で実装できる、オプトインの capability です。IReadOnlyList<string> CreatableTabs(GraphBuildContext, string tabName) — キャンバスがどこにレコードを作成できるか(空 = どこにもできません)。これがない場合のデフォルトは表の下にあります |
CanvasAugmentBuilder — 書き込みサーフェス。 できることは四つだけです:
AddNode(tab, recordId, title = null, category = null)/AddNode(tab, recordId, title, category, CellCoordinate address)— シートのレコードではない識別子(イベントキー、コードアトム)のための 仮想ノード。タブは空でも構いません。AddEdge(fromTab, fromRecordId, toTab, toRecordId, label = null, fieldName = null, fieldOnTarget = false, isCyclic = false, cyclicNote = null)— core のスキャナーが見ることのできない 追加のエッジ。fieldNameを指定すると、そのリンクがどのセルに書かれているかを示し、fieldOnTargetは、そのセルが出発ではなく到着側にあることを示し、cycle のペアは、ドメインだけが知っている note とともに、そのループを表示用にマークします。SetLayer(tab, recordId, layer)— 絶対的なレイヤーヒント(0 = 最も左、負の値はさらに左。それを補うためすべてが右にシフトします)。SetLayerRelative(tab, recordId, offset)— 同じものを terminus からの相対位置 で(−1 = その一つ左の列)、どのヒントによっても動かされる前の terminus の列を基準に解決します。SetSubtitle(tab, recordId, subtitle)— 表示のヒント。すでに存在するレコードにも、画面にないレコードにも適用される唯一のもの(connect ピッカーはそれらを読み取ります)。
キーが空の項目は無視され、何が集められたかは internal です。マージのルールは一箇所に集約されているためです。あらゆる拡張は末尾に追加されるため、以前のサーフェスに対して書かれたオーバーライドも引き続きコンパイルできます。
IAuthorableGraphShape — これがない場合の二つのデフォルト:
- この capability が置き換える 作成可能タブの一覧——そもそもキャンバスが開くかどうかや、保留行の探索がどこまで届くかも決める基準——は、フォーカスしているタブからスキーマを 推移的に たどって到達できるすべてのタブを網羅します。
- ユーザーが実際に目にする リンク のカスケードは、現在画面に描画されているポートが指しているタブから始まります。
どちらも、コードレジストリのタブと、キー列を持たないタブを除外します。この関数が返すタブのうち、画面上のどのポートも受け入れないものは、理由を添えたままリンクのカスケードに残り、ウィンドウ自身のゲートもその上に引き続き適用されます。
カラープリセット(SheetForge.Core.Theming)
| 型 | 役割 & 主なメンバー |
|---|---|
ThemeRegistry | プリセット id → テーマ。空の id、重複、そして予約済みの二つの組み込み id は例外を投げます。Register(SheetForgeTheme) · TryGet · Themes · IsEmpty · IsBuiltInId(id) · BuiltInDefaultId · BuiltInHighContrastId |
SheetForgeTheme | 一つのカラープリセット。Id · DisplayName · DarkColors / LightColors(IReadOnlyDictionary<ThemeColorSlot, uint>。構築時にコピーされます)· TryGetColor(dark, slot, out rgb) · IsEmpty |
ThemeColorSlot | enum — プリセットが上書きできる33の色の役割(サーフェス、罫線、テキスト、意味を持つ色、ステージングのマーク、失敗を示すサーフェス、スクリム、グラフ)。色は 0xRRGGBB です: Core はエンジンの型を一切参照せず、半透明の塗りはスロットの色に固定のアルファ値を組み合わせて導出されます。追記専用です。 |
プリセットは、自身が名指ししたスロットだけを上書きします。それ以外のスロットはすべて製品のデフォルトのままなので、スロットが追加されてもプリセットは有効であり続けます。登録しただけではプリセットは適用されません——ユーザーが Preferences ▸ SheetForge ▸ Theme で選択します。
宣言的オーサリングサーフェス(SheetForge.Core.Studio)
プラグインは、何を表示するかを記述します——外殻はデータとして、述語と効果はデリゲートとして。各ホストは、それを自身のウィジェットで描画します: エディターでは UIToolkit、ブラウザーでは React です。レイアウトの数値は、どこにも登場しません。何を語るかはプラグインのものであり、どう配置するかはレンダラーのものです。
ここにあるすべての enum は 追記専用 です。そのため、語彙が成長しても、登録はその意味を保ちます。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
StudioUiRegistry | sealed class | RegisterStudioUi が埋めるもの。AddAction(StudioActionDescriptor) · AddPanel(StudioPanelDescriptor) · AddColumnBadge(StudioColumnBadgeDescriptor) · AddCellEditorHint(StudioCellEditorHint) · Actions / Panels / ColumnBadges / CellEditorHints · IsEmpty |
StudioUiNode | sealed class | 一つの記述されたフラグメントで、不変であり、静的なファクトリーを通じて構築されます——ファクトリー、読み取り可能なプロパティ、URL のルールは表の下にあります |
StudioUiNodeKind | enum | 上記の13種類(Row … Link) |
StudioActionDescriptor | sealed class | 一つの動詞。Id(一意)· LabelKey(Loc キー。未登録はそのまま表示)· StudioActionPlacement Placement · Func<StudioSurfaceContext,bool> AppliesTo · Action<StudioSurfaceContext> Execute · ConfirmKey(任意——ホストが、先にこの文を尋ねます)。ホストは呼び出し時に AppliesTo を再チェックするため、古くなったメニュー項目は、正直な no-op と再描画で答えます |
StudioActionPlacement | enum | Inspector · RowContextMenu · TopbarMenu · ColumnHeaderMenu · CanvasNodeMenu。それぞれの場所が、異なるコンテキストフィールドを満たします——行の場所はレコードを、列の場所は列名を、キャンバスの場所はそのノードのレコードを運びます |
StudioPanelDescriptor | sealed class | Studio の右側のペインにある一つのパネル。Id · TitleKey · Func<StudioSurfaceContext,StudioUiNode> Build — 再計算のたびに再構築されるため、状態を持ちません。パネルが一つも登録されていない場合、そのペインはまったく描画されません |
StudioColumnBadgeDescriptor | sealed class | 列ヘッダー横の一つのバッジ。Func<StudioSurfaceContext,string,string,StudioUiNode> Provide(コンテキスト、タブ、フィールド)— null はその列に何もないことを意味します |
StudioCellEditorHint | sealed class | 「この型にはこの組み込みウィジェットを使う」——一つを供給するのではなく、種類を選びます。TypeName(CellParserRegistry の正確な型名。リストのセルはその要素の名前で一致し、ラッパーのセルは正規のテキストのまま保持され、決して一致しません)· StudioCellEditorArchetype Archetype · GetOptions(ドロップダウンのみ — Func<context, tab, field, IReadOnlyList<StudioCellOption>>)· SliderMin / SliderMax · ToggleTrueValue / ToggleFalseValue。素材の形一つにつき一つの、四つのコンストラクター。登録済みの IStudioCellEditorProvider が辞退した 後、そして組み込みの分岐の 前 に参照されます。パックの hint は、下記の組み込み hint より先に参照されるため、Color、AnimationCurve、Gradient のいずれかにパックが hint を登録すると、その型のデフォルトエディターを上書きします。要素の hint が ColorPicker、CurveEditor、GradientEditor のいずれかである List<> は、両方のホストでチップエディターになります |
StudioCellEditorArchetype | enum | Dropdown · MultilineText · Slider · Toggle · ColorPicker(セルテキストは #RRGGBB / #RRGGBBAA) · CurveEditor(セルテキストは正規の CurveValue 記法)· GradientEditor(セルテキストは正規の GradientValue 記法)。追記専用——最新の二つは 5 と 6 |
BuiltinCellEditorHints | static class | Core 自身が宣言する三つの hint です——Color → ColorPicker、AnimationCurve → CurveEditor、Gradient → GradientEditor——これらはパックの hint とまったく同じ経路をたどるため、エディターとブラウザーがそれらに対して異なるウィジェットを選んでしまうことはありません。IReadOnlyList<StudioCellEditorHint> All(固定順)· bool TryGet(typeName, out hint)(Ordinal)。ホストはまず StudioUiRegistry.CellEditorHints を参照し、見つからなければこの表にフォールバックします |
StudioCellOption | sealed class | 一つのドロップダウン候補 — Value(セルに書き込まれる正規のテキスト)· Label(人が読むもの。デフォルトは Value) |
StudioSurfaceContext | sealed class | 拡張が目にし、それを通じて働きかける唯一の継ぎ目です。読み取り: Tables · ReferenceIndex References · CodeRegistries · Tab · RecordId · Field · ActionArgument(Input ノードがコミットした値)。仲介された変更、それだけです: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells(一つの Undo ステップ、オールオアナッシング)· Action<string,string> FocusRecord · Action RequestRebuild。ステージングはウィンドウ自身のゲートを通過するため、読み取り専用のソース、実行中のパイプライン、ワークブック由来のタブは、理由とともにこれをブロックします(ctor は internal です: ホストがこれを組み立てます) |
StudioUiNode — ファクトリー、読み取り、URL のルール:
- ファクトリー:
Row·Label·Chip·Badge·Button·Rule·Heading·KeyValue·Table(headerRow, rows)·List·Progress·Input·Link、そしてWithTooltip(text)(このノードを変更するのではなく、新しい ノードを返します)。 - 読み取り:
Kind·Text·Tooltip·ThemeColorSlot? Tone(決してハードコードされた色ではなく、テーマに追従します)·ActionId·Detail·Ratio·Url·Children。 - static
bool IsAllowedUrl(url)—http/httpsのみです。両方のホストが尋ねる一つの述語であり、そのため何を開いて安全かについて意見が食い違うことはありません。
プラグインの UI 文字列(SheetForge.Core.Model)
| 型 | 役割 & 主なメンバー |
|---|---|
StringOverlayRegistry | プラグインが登録した UI 文字列のための、コレクター 兼 ルックアップオーバーレイです。Loc.Tr(エディター)と t()(ブラウザー)は、製品のテーブルより先にこれを参照します。Register(key, language, value) · Register(key, IReadOnlyDictionary<string,string> byLanguage) · bool TryGet(key, language, out value) · RegisteredKeys。言語の照合と四つの拒否理由は、表の下にあります |
StringOverlayRegistry — 照合と拒否。 language は IETF コードです("en"、"ko"、"zh-Hans"、"pt-BR"、…)、大文字小文字を区別せずに照合されます。ルックアップは 要求された言語 → 英語 → 見つからない の順にフォールバックし、このフォールバックはここに存在するため、両方のホストが同一に答えます。
四つの登録は拒否され、それぞれサイレントに失敗するのではなく、開発者向けの理由を記録します:
- 製品の組み込みキー——オーバーレイはキーを追加できますが、製品自身の文やメニューパスを上書きすることは決してできません。
- すでに他のパックが登録した キー+言語 の組み合わせ——最初に見つかったものが優先されます。そうしなければ、インストール順が画面を左右してしまいます。
- 空のキーまたは値。
- 製品が知らない言語コード——これは決して英語に畳み込まれません。
パイプラインの観察(SheetForge.Core.Plugins / .Model)
| 型 | 役割 & 主なメンバー |
|---|---|
IPipelineObserver | 読み取り専用の通知。void OnImportCompleted(PipelineRunView view) — 明示的なインポートサイクルごとに一度、その終了時に、成功したか失敗したかを問わず呼び出されます。値を書き換えたり診断を追加したりするフックは意図的に存在せず(それらはセルタイプと IDomainValidator の役割です)、ステージングの pre-flight に対して実行されるフックもありません。投げられた例外は、理由とともに分離されます。インポートの出力は変わりません。将来の観察ポイントは、登録済みのオブザーバーからキャストされる兄弟 capability インターフェースとして追加されるため、今日書かれた実装はそのままコンパイルされ続けます |
PipelineObserverRegistry | 追記専用のオブザーバーリストで、順序は保持されます。Register(IPipelineObserver) · Observers |
PipelineRunView | オブザーバーが受け取る不変のスナップショット — Success(検証、すなわちレジストリが組み立てられたかどうか。codegen/bake の結果は診断情報から読み取ります)· Tables(パースされたタブ。失敗した 実行では、パースできなかったタブだけが欠けます——部分的組み立てをしないというのは 出力 のルールであり、観察のルールではないからです)· Diagnostics(レポートが表示するのと同じリスト)· SkippedTabs · EnumTabs。コレクションは構築時にコピーされ、コンストラクターは internal であるため、半分だけ組み立てられたスナップショットがオブザーバーに渡ることはありません |
コードレジストリ(SheetForge.Core.Graphing)
コードの中に存在する参照先で、オーサリングサーフェスにはロックされた仮想タブとして公開されます。インポートのバリデーターではなく、Data Studio(サイドバー / グラフ / インスペクター)が消費します。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
CodeRegistryCatalog | sealed class | 登録のルート。Register(CodeRegistrySource)(null / 空のタブ名 / 重複したタブ名は例外を投げます)· TryGet(tabName, out source) · Sources · IsEmpty |
CodeRegistrySource | sealed class | 一つのロックされた仮想タブ。string TabName · IReadOnlyList<CodeRegistryEntry> Entries(登録順序 = 表示順序) |
CodeRegistryEntry | sealed class | 一つのエントリ。string Key(参照が指し得るもの)· string Label · IReadOnlyList<string> Raises(null は空に正規化されます)。Core はこの三つすべてを不透明な文字列として扱います |
IR の読み取りモデル(SheetForge.Core.Model)
| 型 | 役割 & 主なメンバー |
|---|---|
SheetTable | 一つのタブのパース結果。SheetSchema Schema · IReadOnlyList<SheetRecord> Records |
SheetSchema | string TabName · Fields · TryGetField(name, out FieldSchema) · SheetStyle Style(そのシートの @style 表示メタデータ)· bool IsLocalizationSheet(@loc マーカーが存在します)· IReadOnlyList<LocaleColumn> LocaleColumns(元の列順のままのロケール列——ローカライズシートではないシートでは空になり、null になることはありません)· TryGetLocaleColumn(localeCode, out LocaleColumn)(コードによる検索。大文字小文字は区別しません)· TryGetSourceLocale(out LocaleColumn)(最初のロケール列。一つも無ければ false) |
SheetStyle | @style 行の値 — 一つのシートの表示メタデータです。string Title(サイドバーのグループラベル)· string ColorHex(記述されたままの #RRGGBB)· bool HasColor · static None(スタイルなし)。コード生成、ベイク、スキーマフィンガープリントからは決して読み取られません |
LocaleColumn(struct) | ローカライズシートのロケール列一つ——@loc 行がその列に書き込んだ内容です。string Code(書かれたとおりのコード。Core が検証するのは綴りの形であって、そのロケールが実在するかどうかではありません)· string FieldName · int ColumnNumber(1 始まり)· bool IsSource(最初のロケール列——インラインプレビューが読み取り、ミンティングが書き込む列です) |
SheetRecord | int RowNumber(元の、1始まりの行番号)· Values(フィールド → CellValue)· TryGet · インデクサー |
FieldSchema | Name · TypeToken Type · Description · ColumnNumber · DefaultValue · AllowOverlap · IReadOnlyDictionary<string,string> MarkerValues(カスタムマーカー名 → この列のセルテキスト) |
TypeToken | パースされた @type セル。RawText · TypeName · TypeArgument · TargetName · IsList · IsOptional · HasExplicitDefault · DefaultValueText · AllowsEmptyCell · IsSelfKey · IsIntId(このタブ自身の セルフ 整数キーのみを表します——IntId@Tab の 参照 形式は、RecordId@Tab と同じく TargetName + ReferenceScanner.GetReferencedTab を通じて読み取られます)· TypeToken InnerToken / IsWrapper(ラッパー型 — 再帰的な内側)· IsCustomReference(この列が、パーサーが IReferencingCellType を実装している MyType@Tab であること。ReferenceScanner.GetReferencedTab が、これを読み取る唯一の述語であり、これによってシグネチャの変更なしに、すべての利用側が対応できるようになっています)· AssetTypeName(書かれたままの AssetRef@Group<Type> の <Type>。無制限の場合は null。Core はこの名前を保持するだけで、解決するのは IAssetTypeResolver の仕事です——リストやラッパーの内側にある AssetRef トークンにも、同様にこの名前が刻まれます)。コンストラクターの末尾三つの引数(innerToken、isCustomReference、assetTypeName)にはデフォルト値があるため、既存の呼び出しはそのままコンパイルできます。さらに、以前からの8引数版と10引数版のコンストラクターもオーバーロードとして残っているため、すでにコンパイル済みのプラグインアセンブリは再ビルドなしで動作し続けます |
CellValue(struct) | 一つの型付けされたセルの値。null はありません(IsDefaulted が、実体化されたデフォルト値を示します)。object Value · IsDefaulted · AsList · static Of / Defaulted |
RecordId(struct) | キーの値(Ordinal による等価比較)。string Value · IsEmpty |
RecordRefValue(struct) | RecordId@Tab セルの値。TargetTab · Id |
IntRefValue(struct) | IntId@Tab セルの値——RecordRefValue の整数キー版の対です。string TargetTab · int Id · bool IsEmpty · static Empty(tab)(何も指さない、任意の IntId@Tab?) |
LocRefValue(struct) | LocRef@Tab セルの値——RecordRefValue のローカライズ版の対であり、値だけを見て文字列テーブルを指していると消費者が分かるよう、別の型として保たれています。string TargetTab · string Key · bool IsEmpty · static Empty(tab) · ReferencedKeys。IRefBearingValue を実装しているため、参照スキャナーはこれをコアの参照とまったく同じように扱います |
AssetRefValue(struct) | AssetRef@Group セルの値。Group · Key(サブアセットのキーは parent[sub]) |
EnumValue(struct) | Enum<T> セルの値(文字列のペア — CLR への変換はベイクの仕事です)。EnumName · MemberName |
型付きアセット参照(SheetForge.Core.Model)
AssetRef@Group<Type> の <Type> を解決するのは ホスト です——Core はエンジンもプロジェクトのアセンブリも知らないため——Core はその結果を判定するだけです。ここに登場するものはすべて純粋なデータです。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
IAssetTypeResolver | interface | AssetTypeResolution Resolve(string rawName) — 一つの名前を入れると、一つの判定結果が出ます。同じ名前は常に同じ答えを返します(実装はキャッシュしてもかまいません)。AssetKeyIndex とは 別に ImportPipeline へ注入されるため、Addressables の設定がまだないプロジェクトでも型名は解決されます。リゾルバーが注入されない場合(ヘッドレス、ブラウザー)、型名の診断はそもそも生成されません。エディターの実装は、プロジェクトが読み込んだ UnityEngine.Object 派生のアセットタイプに対して解決を行います(許可リストはありません。コンポーネントとエディター専用タイプは除外されます) |
AssetTypeResolution | sealed class | 一つの名前に対する判定結果です — RawName · AssetTypeResolutionStatus Status · FullName(CLR のフルネーム。ネストされた型は + で連結。Resolved と NotReferenceable のときのみ)· AssemblyName(生成されるコンパニオンアセンブリが参照しなければならないアセンブリ——アセンブリ定義を持つタイプでは設定され、エンジンモジュールと未解決の名前では null)· Candidates(null になることはありません: 曖昧な場合はその候補、未知の名前の場合は最も近い候補の提案)。ファクトリー Resolved(raw, fullName, assemblyName) · Unknown(raw, suggestions) · Ambiguous(raw, candidates) · NotReferenceable(raw, fullName, assemblyName) |
AssetTypeResolutionStatus | enum | Resolved · Unknown(該当するタイプがない)· Ambiguous(短縮名が複数のタイプに一致する——フルネームを書いてください)· NotReferenceable(そのタイプが Assembly-CSharp のような定義済みアセンブリに属しており、生成されたコードから参照できない) |
コード生成は、パイプラインが生成した解決済み辞書を読み取り、解決済みの名前には AssetReferenceT<global::FullName> を出力します。その辞書に見つからない名前が そのまま出力されることは決してありません ——そのフィールドは AssetReference にフォールバックし、AssetTypeUnresolvedFallback 警告が収集されます。解決済みのフルネームは、スキーマフィンガープリントにも組み込まれます。
視覚的な値の型(SheetForge.Core.Model)
三つの組み込み視覚型に対する、エンジンに依存しない値モデルです。それぞれが不変で、IEquatable であり、独自のテキスト形式(TryParse / Render)を持ちます——これはシート構文のページが説明しているのと同じ記法です——そのため、カラー・カーブ・グラデーションの値を保持するプラグインの型は、第二の記法を発明する代わりにこれらを再利用できます。エディターはこれらを UnityEngine.Color / AnimationCurve / Gradient にベイクし、読み戻します。ブラウザーは、計算式を再実装するのではなく、下記の評価器を通じてこれらをサンプリングします。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
ColorValue | readonly struct | 四バイト R · G · B · A · static Default(#00000000)· static TryParse(text, out value, out error)(#RGB / #RGBA / #RRGGBB / #RRGGBBAA を受け付けます)· Render()(不透明な場合は大文字六桁) |
CurveValue | sealed class | Keys(時間順)· PreWrap / PostWrap · static Empty(キーなし——テキスト形式を持たない唯一の状態。Render() は "" を返します)· static Create(keys, preWrap, postWrap) — 唯一の構築経路: 時間順にソートし、重複する時間を拒否し、CurveTangentSolver を適用することで、カーブが存在した瞬間から「モードが優先する」という性質が保たれます · static TryParse(2/4/7/8 フィールドのキー、Once は ClampForever のエイリアスとして受け付けられます、Infinity/-Infinity のタンジェント)· Render()(8 フィールド形式のキー、ラップ接尾辞は必要なときのみ) |
CurveKey | readonly struct | Time · Value · InTangent · OutTangent · InWeight · OutWeight · CurveWeightedMode WeightedMode · CurveTangentMode LeftMode / RightMode · bool Broken。十個の引数を持つコンストラクターで、それ自体では正規化を行いません |
CurveWrap | enum | ClampForever · Loop · PingPong · Default — Unity のラップ語彙を名前で表したものです(WrapMode への値のマッピングはベイカーの仕事です) |
CurveTangentMode | enum | Free = 0 · Auto = 1 · Linear = 2 · Constant = 3 · ClampedAuto = 4 — AnimationUtility.TangentMode と名前・値ともに同一であるため、ベイカーは名前でマッピングし、Unity のパックされたタンジェントビットには一切触れません |
CurveWeightedMode | [Flags] enum | None = 0 · In = 1 · Out = 2 · Both = 3 — キーのどちら側が重み付き(ベジェ)タンジェントを使うか |
CurveTangentSolver | static class | CurveKey[] Apply(IReadOnlyList<CurveKey> sortedKeys) — モードが指定するタンジェントの数値を導出します。エンジンと同じ順序で段階を適用します(Linear は自分の側のみ → ClampedAuto は両側 → Auto は両側 → Constant は自分の側のみ)。Free の側と重みには触れません。CurveValue.Create がこれを呼び出すため、呼び出し側が自分で呼ぶことはめったにありません |
CurveEvaluator | static class | float Evaluate(CurveValue, float time) · float[] Sample(CurveValue, int count)(count ≥ 2、最初のキーから最後のキーまで等間隔)— キー間は Hermite 補間、重みフラグが立っている側は重み付きベジェ、タンジェントが無限大のときは保持、そしてキー範囲外では四つのラップ挙動です。AnimationCurve.Evaluate に対してランダムなカーブで検証済みです |
GradientValue | sealed class | ColorKeys · AlphaKeys(それぞれ 1 個から 8 個、時間順)· GradientBlend Mode · GradientColorSpace ColorSpace · static Default(白、完全不透明、Blend)· static Create(colorKeys, alphaKeys, mode, colorSpace)(個数と 0…1 の範囲を検証し、Unity と同じく時間を 16 ビットに量子化し、安定ソートします)· static TryParse(三つまたは四つの ` |
GradientColorKey | readonly struct | ColorValue Color(アルファは無視されます——アルファには専用のキーがあります)· float Time |
GradientAlphaKey | readonly struct | float Alpha · float Time |
GradientBlend | enum | Blend · Fixed · PerceptualBlend |
GradientColorSpace | enum | Uninitialized(書き込まれない場合。Gamma として読み取られます)· Gamma · Linear — 影響を受けるのは PerceptualBlend だけです |
GradientEvaluator | static class | ColorValue Evaluate(GradientValue, float time) · ColorValue[] Sample(GradientValue, int count) — リニア・ステップ・知覚的(Oklab)のいずれかでブレンドし、アルファキーは別に処理してバイトに丸めます。Gradient.Evaluate に対してランダムなグラデーションで検証済みです |
エラーと結果(SheetForge.Core.Model / .Reporting)
| 型 | 役割 & 主なメンバー |
|---|---|
ImportError | 構造化された、ロケールに依存しないエラー。Code · Severity · Coordinate · ActualValue · Expected · Suggestion |
ImportErrorCode(enum、105個) | 「なぜ」の完全なカタログ — それが網羅する系統は表の下に一覧があります。追記専用です——レンダラーのテーブルは、メンバーの値をキーにしています |
ImportSeverity(enum) | Error(出力をブロックする)· Warning |
CellCoordinate(struct) | タブ・1始まりの行・1始まりの列・フィールド。スプレッドシートの列記号を計算します。ForTab / ForRow ファクトリー |
ErrorCollector | 「すべてを収集する」ためのシンク。All · HasErrors · ErrorCount · Add |
ImportResult | パイプラインの出力。不変条件: Success == false ⇔ Registry == null。Success · Registry · Diagnostics · SkippedTabs · EnumTabs(enum 定義シートとして読み取られたタブ。データテーブルとしてはパースされません——「まだテーブルが書かれていない」ことを意味する SkippedTabs とは別に保持されるため、レポートのスキップ件数は正しいままです。どちらも、それらのタブについて生成コード・ベイクされたアセット・アドレスを保持しておくための保存用の集合です)· static Succeeded / Failed |
ImportReport(.Reporting、アセンブリ SheetForge.Core.Tooling) | レポートのレンダラーへの入力 — Timestamp · SourceDescription · TabCount · RecordCount · Success · Diagnostics · ErrorCount · WarningCount · SkippedTabCount(TabCount のうち、インポートされたのではなく、空のシートとしてスキップされた数——ヘッダーにこれが表示されるため、タブ数を「すべてインポートされた」と誤解することはありません) |
ImportReportText(.Reporting、アセンブリ SheetForge.Core.Tooling、static) | レポートを、製品自身の人間に読みやすい 文字列 として描画します。コンソールには何も書き込まれず、ジャンプリンクやマシン可読の座標行も付加されません(それらはコンソール自身の慣習に属します)。string Render(ImportReport report, IReadOnlyDictionary<string,string> languageTable = null, string operationName = null) — 英語の場合はテーブルを省略します。操作名を省略した場合は、同じ テーブルから読み取られるため、一つの文の中で二つの言語が混ざることはありません。Editor 側の呼び出し元は、通常 SheetForgeActions.RenderReportText(report) を使います。これは現在のエディター言語を埋めてくれます(純粋なアセンブリは EditorPrefs を読めないためです) |
ImportErrorCode — それが網羅する系統:
- マーカー、スキーマ、型、セル、キー/参照、アセットキー。
- ソース/ファイル、csv/xlsx、コード生成の識別子、addressables、baseline/export、Google/認証/Push、テンプレート。
- プラグイン —
PluginRegistrationConflict、そしてアセンブリの互換性宣言がこのホストの読み取れる範囲から外れている場合のPluginIncompatible。 - IntId —
DuplicateIntId、そしてIntId@Tab参照についてはUnresolvedIntId·TargetTabHasNoIntId。 @overlapとDomainRuleViolation。- enum 定義シート —
EnumSheetMarkerConflict·DuplicateEnumName·EnumSheetEmptyColumn·InvalidEnumIdentifier·InvalidEnumUnderlyingType·InvalidEnumMemberValue。 DropdownNotSupportedByFormat(エラーではなく 警告 です)。- 型付きアセット参照 —
UnknownAssetType·AmbiguousAssetType·AssetTypeNotReferenceable(列ごとに一度、@typeの行で)、セルごとのAssetTypeMismatch、そしてコード生成の 警告AssetTypeUnresolvedFallback。
インデックスとユーティリティ(SheetForge.Core.Validation / .Model / .Parsing / .Unparse)
| 型 | 役割 & 主なメンバー |
|---|---|
TabKeyIndex | 一つのタブのキー情報 — 文字列のキー列と、そのタブの IntId 整数キー集合の両方を持ち、RecordId@Tab と IntId@Tab の参照はどちらもこれに対して解決されます。TabName · KeyField · HasKeyColumn · Keys · Contains(id) |
KeyIndexBuilder(static) | キーインデックス(文字列キーと IntId 整数キー集合を一度に)を構築し、キーのエラーを報告し、IntId 列を検証します。Build(SheetTable, ErrorCollector) · ValidateIntIdColumns |
AssetKeyIndex | グループ → 有効なキーの集合(Editor が Addressables のカタログから埋めます。サブアセットのキーも含みます。null を注入する = アセット検証をスキップする)。Register(group, keys) · HasGroup · HasKey · KeysOf · GroupNames、そして AssetRef@Group<Type> が使うタイプ層です: RegisterTyped(group, key, satisfiedTypeFullNames)(そのキー と、それが読み込める型のフルネームの閉包——自身の型・基底型・インターフェース・サブアセットの型。再登録すると閉包は和集合になります)· HasTypeInfo(group, key) · SatisfiesType(group, key, typeFullName)。素の Register で登録されたキーには閉包がなく、タイプチェックは失敗するのではなく免除されます |
LocalizationCoverage(static) | ローカライズシートの、ロケールごとのカバレッジと孤児のキー。エラーを収集する代わりにリストを返す純粋な計算です。未翻訳のセルも使われていないキーも、塞ぐべき出口ではなく通常の状態だからです。IReadOnlyList<LocaleCoverage> Compute(SheetTable) · IReadOnlyList<string> FindOrphanKeys(locTabName, tables)(どこからも指されていないキー。意図的に保守的です——スキャナーが知るあらゆる参照の形を使用として数えるため、生きている翻訳が孤児と呼ばれることはありません) |
LocaleCoverage(sealed class) | 一つのロケールのカバレッジ。LocaleColumn Locale · int TotalKeys · int TranslatedKeys · IReadOnlyList<string> MissingKeys(シートの行順で、null になることはありません)· bool IsComplete |
TextSuggestion(static) | 最も近い候補の提案(上限付き Levenshtein 距離、決定的)。FindNearest · Distance · DistanceWithin |
BuiltinCellParsers(static) | CreateDefaultRegistry() — 組み込みの12個のパーサー(int、float、bool、string、Enum、RecordId、AssetRef、IntId、LocRef、Color、AnimationCurve、Gradient)。 |
CanonicalValueRenderer(static) | 値 → 正規のセル文字列(Export/Push)。TryRender(…)(ColorValue / CurveValue / GradientValue は、それぞれ自身の Render() に委譲します。キーを持たないカーブは空セルとして描画されます)· RenderFloat(float)(最短のラウンドトリップ) |
Push プラン(SheetForge.Core.Unparse)
IPushApprover.Approve(PushPlan) がこれらを公開するため、public になっています。純粋なデータです。
| 型 | 役割 |
|---|---|
PushPlan(アセンブリ SheetForge.Core.Tooling。以下の三行も同様) | 送信プラン全体。Tabs · HasWork |
PushTabPlan | 一つのタブ: Writes · Appends · Deletes(キー + 行番号; DeleteNotices はキーのみを見るビューとして残ります) |
PlannedCellWrite | 一つのセルの書き込み — 座標、baseline のセル、新しい値/テキスト、文字列系フラグ |
PlannedRowAppend | 一つの追加行 — セルのテキスト全体 + 文字列系の列 |
Editor アセンブリ(SheetForge.Editor)
設定・ローカライズ・構成(SheetForge.Editor.Pipeline / .Localization)
| 型 | 役割 & 主なメンバー |
|---|---|
SheetForgeSettings(SO) | 設定アセット。フィールド: sourceProviderId(唯一のソース選択軸。空 = 組み込みの LocalFile)· localFolderPath · bakeOutputFolder · generatedCodeFolder · generatedNamespace · exportFolderPath · exportFormat · spreadsheetId · googleAccessMode · serviceAccountKeyPath · gidMap(GidMapEntry { tabName, gid } のリスト)。解決済みの Effective* プロパティ。 |
Loc(static) | ローカライズのエントリーポイント。Tr(key) · TrContent(…) · Table · MenuRoot 定数。Tr は四段階で解決します: プラグインが登録した文字列(現在の言語、次に英語——このフォールバックはオーバーレイ自身が持ちます。StringOverlayRegistry を参照)→ 組み込みのテーブル(現在の言語、次に英語)→ キー自体。プラグイン文字列の登録経路はちょうど一つしかないため、「どちらの登録が優先されるか」が問題になることはありません |
PluginRegistry(static) | TypeCache によってプラグインを検出し、その候補を PluginComposition.Compose に渡します。Build · BuildValidators · BuildEdgeContributors · BuildStructuralMarkers · BuildTemplates · BuildGraphShapes · BuildCodeRegistries · BuildThemes · BuildAll(まとめて実行)· InvalidateCache()(リロード寿命のキャッシュを破棄します — SourceProviderRegistry.InvalidateCache と同じ慣習です。互換性ゲートのキャッシュも破棄するため、発見される集合が変わると再判定されます)。バンドルとスロットの分離は表の下にあります |
ImportEvents(static) | エディター側のイベントバス — 公開契約です: 外部のアセットも購読できます。event Action<ImportCompletedArgs> ImportCompleted · RaiseImportCompleted(ImportCompletedArgs) は、インポートが ベイクまで最後まで 実行されたときにのみ発火し、購読者はベイクされたアセットを読み取れます。event Action<BaselineUpdatedArgs> BaselineUpdated · RaiseBaselineUpdated(BaselineUpdatedArgs) は、シートのスナップショットが保存されるたびに発火します——検証が失敗した実行も含みます——これが、オーサリングサーフェスが quarantine されたインポートに際して自らを更新する方法です。二つの軸は意図的に統合されていません: 一方は「シートが動いた」ことを、もう一方は「アセットが動いた」ことを意味します |
BaselineUpdatedArgs(sealed) | baseline 保存のペイロード。IReadOnlyList<string> Tabs(スナップショットに書き込まれたタブ)· bool Quarantined(たった今保存されたスナップショットが検証に失敗したかどうか) |
SheetForgeActions(static) | 実行ファサード — メニューのクリックが実行するのと同じサイクルを、CI スクリプト、ビルドフック、あるいはあなた自身のボタンから呼び出せます。RunImport() · RunExport() · RunPush() · RunHealthCheck() · RunLocalizationSync()(それぞれが委譲します。設定の解決、Addressables のゲート、排他制御、確認モーダル、プログレスバー、コード生成 → コンパイル → ベイクの再開は、すべて製品内部にとどまります)· bool IsBusy · bool TryBeginExclusiveScope(out IDisposable scope)(すでに何かが実行中の場合は false + scope = null。解放を行うのはこの scope であり、二回目の Dispose が他人の実行を解放することはありません)· string RenderReportText(ImportReport)(現在のエディター言語での、製品自身の文。コンソールへの書き込みなし)。完了のセマンティクスは表の下にあります |
SheetForgeEditorInfo(static、名前空間 SheetForge.Editor) | Editor アセンブリのアンカー — const Version。Editor 側のサーフェスに対する機能ゲーティング用の、SheetForgeRuntimeInfo の鏡像です |
ImportCompletedArgs(sealed) | 購読者に渡される完了ペイロード。IReadOnlyList<string> Tabs(この完了でベイクされたタブ)· string BakeFolder(Database SO のフォルダー)。Args オブジェクトパターン——将来フィールドが増えても、イベントのシグネチャは壊れません。 |
GoogleSheetAccessMode(enum) | SheetsApi(認証あり、書き込み可能)· ExportUrl(認証なし、読み取り専用) |
ExportFormat(enum) | Tsv · Csv · Xlsx · Json · MatchSource |
PluginRegistry — バンドルとスロットの分離。 ネストされた PluginBundle は、組み立て済みの PluginSet Set——十二スロットの単一の真実であり、これによってバンドルを広げることなく、新しく育ったスロットを読み取れます——に加えて、それへの九つの便宜的な窓を公開します: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes。以前の六引数・八引数のコンストラクターは、後から追加されたレジストリを空にデフォルトするオーバーロードとして残されており、それらの契約が存在する前のバージョンとまったく同じように振る舞います。
分離は、この型ではなく Core のものです: 登録中に例外を投げたプラグインは、名前とともに報告され、スキップされますが、他のすべてのスロットとプラグインは引き続き登録されます。
SheetForgeActions — 完了のセマンティクス。 RunImport/RunPush は投げっぱなし(fire-and-forget)です。 そのボディは async void です。エディターのメインスレッドはネットワーク IO でブロックできないためです。そのため戻り値は完了を意味しません: 完了を知るには ImportEvents.ImportCompleted を購読してください。RunExport/RunHealthCheck/RunLocalizationSync は同期的に完了します——RunLocalizationSync は、インポートの完了が実行するシート → StringTable の経路を実行し、Unity Localization パッケージが無ければインストールの案内を表示するだけで、何も変更しません。
ソースプロバイダーの継ぎ目(SheetForge.Editor.Sources)
| 型 | 役割 & 主なメンバー |
|---|---|
ISheetSourceProvider | プロバイダーの契約。Id · DisplayNameKey · CreateTabSource(settings) · GetVisibility(settings) · CanAuthor(settings) · CreateReflectTarget(dispatcher, settings) |
ISourceReflectTarget | 書き戻しのターゲット。void Reflect() |
SourceVisibility | どの設定フィールドを表示するか — 5つの bool フラグ |
SourceProviderRegistry(static) | 検出/解決。All · ResolveActive(SheetForgeSettings) と ResolveActive(string providerId)(設定アセットを持っていなくても、id から直接解決できます)· TryGet · InvalidateCache |
ITabSource | 取得の抽象化。Description · Task<TabSourceResult> FetchAsync() |
TabSourceResult | タブ(名前 → 生の TSV)+ 診断情報 + タブごとのフォーマット。部分的な出力も許可されます。static Create |
TabSourceFormat(enum) | Tsv · Csv · Xlsx · GoogleSheet |
Data Studio の拡張ポイント(SheetForge.Editor.Studio)
UIElements / ウィンドウの状態に触れるため、Editor 側にあります——ISheetSourceProvider と同じ、理にかなった非対称性です。四つの契約はすべて TypeCache によって発見され(引数なしのコンストラクター、登録の呼び出しなし)、すべて try/catch の内側で呼び出されます。ウィンドウ自体(DataStudioWindow)は internal です。
データとして表現できるものはすべて、代わりに Core の ISheetForgeStudioPlugin の語彙に属します——そちらはブラウザーでも描画されます。ここにあるのは、記述では語れないもののための、天井のないエスケープハッチです。
最後の四つの項目は契約ではなく、マウントされたウィジェットが利用できるツールです:
- ウィンドウ自身の 読み取り専用 のスキン値。これにより、そこに元からあるかのように見せられます。
- キーのドロップダウン。これにより、セルウィジェットが組み込みのセルと同じ方法でキーを選べます。
- そして発見キャッシュのリセット。これにより、あなた自身のテストが、有効化したばかりのプローブを再発見できます。
| 型 | 種類 | 役割 & 主なメンバー |
|---|---|---|
IStudioGraphWidget | interface | グラフキャンバスの上に表示するドメインの帯(Core は何も同梱しません)。bool AppliesTo(StudioGraphContext) · VisualElement Create(StudioGraphContext)(グラフが再構築されるたびに作り直されます——状態を保持しないでください。null は何も追加しません) |
StudioGraphContext | sealed class | 読み取り専用: Tab と FocusRecordId(terminus)· SheetRecord FocusRecord(未解決の場合は null)· Tables · ReferenceIndex References · CodeRegistries。シグネチャの互換性のために残されている、廃止済みの二つの軸には [Obsolete] が付いています: ShapeId(常に "record")と ModeId(常に空)。どちらを比較してもコンパイルは通りますが、決して true にはなりません。そのためコンパイラが、死んだ分岐を放置する代わりに、いまそれを警告します——そのチェックは削除してください。ステージング用のサーフェスはありません——ウィジェットは表示専用です(ctor は internal です: ウィンドウがこれを組み立てます) |
IStudioCellEditorProvider | interface | 名前付きの型のために、一つのグリッドセルを描画します。string TypeName(CellParserRegistry の型名またはラッパー名に一致。Ordinal。空はオプトアウト)· VisualElement CreateEditor(StudioCellEditorContext) — null を返すとそのセルを辞退し、組み込みのウィジェットが引き継ぎます。同じ型名への重複した主張は警告され、最初に見つかったものが優先されます |
StudioCellEditorContext | sealed class | セルウィジェットが受け取るもの: Tab · FieldName · TypeToken Type · CurrentRawText(ステージング適用済みの正規テキスト)· Action<string> Commit(一回限りの操作 — それ自身の undo ステップ)· Action<string> CommitTyping(キー入力の連続 — セルごとにまとめられます)· Func<string,IReadOnlyList<string>> ReferenceKeys(組み込みのピッカーが提供するのと同じ候補キー)。どちらのコミットも、ウィンドウのステージングゲートを通過します(ctor は internal です: ウィンドウがこれを組み立てます) |
IStudioInspectorAction | interface | node inspector に追加されるボタン。string LabelKey(Loc キー。未登録 = そのまま表示、空 = 型名)· bool AppliesTo(StudioInspectorContext) · void Execute(StudioInspectorContext) |
StudioInspectorContext | sealed class | 読み取り: Tab · RecordId · SheetRecord Record · Tables · References · CodeRegistries。仲介された変更: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells(どちらも詳細は表の下にあります)。サービス: Action<string,int,string> FocusCell · Action RequestRebuild。AuthoringSession は意図的に公開 されていません |
IStudioPanelProvider | interface | Studio の右側のペインにある、任意の UIToolkit パネル——記述的な StudioPanelDescriptor の隣にあるエスケープハッチです。string Id · string TitleKey · bool AppliesTo(StudioSurfaceContext) · VisualElement CreatePanel(StudioSurfaceContext)(null はそのティックでは何も描画しません)。記述的なパネルを 同じ Id で登録すると、各ホストは自分が描画できる方を採用します——エディターはこちらを優先し、ブラウザーは記述的な方を描画します——そのため「ブラウザーでできる範囲では、エディターでも完全に通用する」という原則に、二番目の契約は不要です。この要素は一回の再計算ティックだけ生存するため、状態も持ちません |
StudioPalette | static class | ウィンドウ自身が描画に使う、読み取り専用 の色・間隔・タイプの値です。これにより、あなたがマウントするウィジェットは、色をハードコードする代わりに、ウィンドウに合わせられます。各スロットは読み取り時に解決されるため、ウィジェットは明るさモードとカラープリセットに、追加コストなしで追従します。値そのものを選ぶこと(プリセット、明るさ、デフォルト)は internal のままです——ウィジェットはパレットに従うのであって、それを塗り替えるのではありません。メンバー一覧は表の下にあります |
StudioTheme | static class | 四つのメンバーだけです: CategoryColor(category)(ウィンドウがそのカテゴリーに与えるのと同じ決定的な色調)· Np(text)(リッチテキストラベルへの安全な埋め込み)· Mono / ApplyMono(element)(モノフォントの方針: キー・アドレス・数値のみ——モノフォントには CJK のグリフがありません)。この型のそれ以外はすべて internal です |
StudioKeyPicker | static class | メンバーは一つだけです: Show(Rect screenAnchor, string targetTab, IReadOnlyList<string> candidates, Action<string> picked, string acceptsLabel = null) — 自身の記法の内部にあるキーに到達しなければならないセルウィジェットのための、組み込みの参照セルが開くのと同じドロップダウンです。渡した候補の中から 一つ のキーを選び、それを返します。レコードの作成、セルを空のままにすること、リストの複数トグル、どのポートがそのピックを受け取るかを尋ねることは、組み込みの参照セル自身のルールであるため、このファサードには含まれていません。picked は必須です(ウィンドウが作られる前に ArgumentNullException)。候補がなく、提供できるものが何もない場合は、空のリストを開く代わりにログを出力します。ウィンドウの型自体は internal のままです |
StudioPluginRegistry | static class | public なメンバーは一つだけです: InvalidateCache() — リロードごとの発見キャッシュを破棄し、あなた自身のテストが有効化したばかりのプローブを再び発見できるようにします(PluginRegistry と SourceProviderRegistry がすでに提供しているのと同じ配慮で、このレジストリだけが例外でした)。発見されたリストは internal のままです: ウィンドウがマウントしようとしているものを、外部が読み取ったり置き換えたりすることはできません |
StudioInspectorContext — 二つのステージング用デリゲート:
- StageCell はタブ、レコード id、フィールド、正規の生テキストを受け取ります。ウィンドウが Undo ステップを登録し、プロジェクションの世代を進め、論理アドレスをステージングします。
- StageCells は、一緒に変更しなければならない 複数 のセルに対して同様のことを行います: 一つのネイティブ Undo ステップで、オールオアナッシングです。一つでもステージングできなければ、セッションにはまったく触れられません。
失敗は、いずれの場合も画面上ではサイレントですが、ゲート だけは自身の理由を説明します。読み取り専用のソース、すでに実行中のパイプライン、ワークブック由来のタブは、その理由をコンソールに書き込みますが、空のリスト、タブまたはフィールドを欠いた書き込み、どの行にも解決されないレコードキーは、何もせず何も言いません。
StudioPalette — メンバー一覧:
- 33の色スロット:
Canvas·Panel·Band·Chrome·Surface·Chip·Selection·PendingCell·Line·LineSoft·GridLine·LineHover·Text·TextMuted·TextFaint·RefText·OnAccent·Accent·AccentDim·Warning·Danger·Ok·SheetTone·CodeTone·EditedCell·NewRowCell·NewRowLine·DangerChip·DangerPanel·Scrim·Wire·WireDot·GridDot。 IsDark。- 間隔:
SectionSpace·RowSpace·RuleHeight·ButtonHeight·PrimaryButtonHeight·GlyphWidth。 - フォントサイズ:
HeadingFontSize·SectionFontSize·CaptionFontSize。 FromRgb(uint)·ToHex(uint)。
Push の承認(SheetForge.Editor.Push)
| 型 | 役割 |
|---|---|
IPushApprover | bool Approve(PushPlan, string humanSummary) · bool ApproveStructureRewrite(string, bool hasLiveConflicts) — 却下 = 送信ゼロ |
AutoPushApprover | 常に承認する(テスト/自動化用) |
オーサリングエンジン(SheetForge.Editor.Structure / .Pipeline / .Export)
| 型 | 役割 & 主なメンバー |
|---|---|
AuthoringSession | 保留中の状態の保持者(serializable — 追加コストなしの Undo とリロード耐性)。Edits · IsolatedEdits · NewRows · StructOps · Reorders · TabRenames · EnumMembers(保留中の enum シートへのメンバー追加)· AssetRegistrations(ステージングされた Addressables の登録——プロジェクトレベルであるため、タブ単位のゲートには関与しませんが、反映への参入・破棄・差分サマリーにはカウントされます)· HasAssetRegistrations · StageAssetRegistration(r)(同じ guid、またはグループ作成の場合は同じグループであれば、その場で置き換えます——最後の意図が勝ちます。識別子を持たない登録は拒否されます)· RemoveAssetRegistrationsWhere(predicate) · SetStaged · ResolveBaselineEdits · RemapFieldName/RecordId/Tab · StageTabRename · EffectiveStructOps · PendingStructCount · TabNames · TryGetBaselineTable · LastProjectionResult · ClearAll(登録もクリアします) |
AuthoringDispatcher | 反映のオーケストレーター。ctor (session, callbacks, baselines) · Reflect() · BuildProjectionResult()(副作用のないプロジェクションの照会)· IReadOnlyDictionary<string,string> BuildProjectedTabs()(同じプロジェクションを タブごとの TSV として——書き戻しターゲットがまさに送信しようとしている内容で、書き込むことなくプレビューできます)· void FinalizeReflectSuccess(IReadOnlyList<string> writtenTabs, IReadOnlyList<TabRenameEntry> committedRenames = null)(ソース自身の書き戻しが到達しなければならない終端処理: 書き込んだタブの保持プルーニング、ClearUndo の境界、そして自動的な再インポート——組み込みの経路も同じ private な本体を実行するため、外部のプロバイダーもまったく同じように終了できます。空のリストはステージングをそのまま保つ no-op です)· Session · Callbacks · Baselines |
AuthoringDispatchCallbacks | 13個の一般的なビュー関連の関心事のデリゲート + IPushApprover — ResolveSettings · RenderReport(Action<ImportReport>、null 許容)· TriggerReimport · ConfirmKeyRenames · ConfirmTabRenames(null 許容)· ClearUndo · Rebuild · … 組み込みの Local/Google のダイアログデリゲートは、オプトインの BuiltInSourceDialogs バンドルに分離されています |
BuiltInSourceDialogs | 組み込みの Local/Google ソースのダイアログデリゲート14個から成る、オプトインのバンドル。AuthoringDispatchCallbacks とは別に分離されています — 外部プロバイダーはこれらを一切必要としません。NotifyLocalDone は五つの引数を取ります。最後の引数は、完了ダイアログ用の Addressables 登録サマリー行です(何もステージングされていない場合は null) |
BaselineStore(.Export) | タブごとの、正規化された TSV の baseline スナップショット |
ステージング用の値の型(SheetForge.Editor.Structure。StagedCellEdit/StagedNewRow は SheetForge.Editor.Windows にあります)
| 型 | 役割 |
|---|---|
StagedCellEdit(struct) | 一つの保留中の編集 — TabName · RowOrdinal · FieldName · RawText · RecordId(論理キー) |
StagedNewRow | 一つの保留中の新規行 — TabName · FieldNames · CellTexts |
StructureOp | 一つの構造操作 — Kind · 座標 · テキスト · Order の並べ替え |
StructureOpKind(enum) | AddColumn · RemoveColumn · AddMarker · RemoveMarker · RemoveDataRow · ReorderColumns · ReorderDataRows · RenameColumn · EditColumnType · EditColumnDesc · SetColumnOverlap · SetSheetStyle |
TabReorderEntry | タブごとの並べ替え状態 — Tab · ColOrder · RowOrder |
TabRenameEntry(struct) | OldName · NewName |
StagedEnumMember(struct) | 一つの保留中の「このメンバーをこの enum に追加する」操作 — TabName(どの enum シートか。空 = すべてを検索)· EnumName · Member。タブの名前変更と同じ理由から、StructureOp ではなくセッションレベルです: enum シートにはテーブルもスキーマもキー列もないため、セル編集の (タブ, レコード, フィールド) というアドレスでは「この enum の次のメンバー」を名指しできません。public なのは、AuthoringSession.EnumMembers が public だからにすぎません(CS0050) |
StagedAssetRegistration(struct) | プロジェクトの Addressables 設定に対する一つの保留中の変更で、AssetRef@Group セルへアセットをドロップまたはピックすることで作られます — StagedAssetRegistrationKind Kind · Guid(そのアセット。サブアセットの場合は親をステージングします)· Group · FromGroup(移動のときのみ)· Address(新規エントリの場合は拡張子なしのファイル名。すでに登録済みのアセットは既存のアドレスを保持します)· AssetPath(表示用)。ファクトリー Add(guid, group, address, assetPath) · Move(guid, fromGroup, group, address, assetPath) · CreateGroup(group)。シートの書き込みが成功した後に実行され、その後クリアされます。public なのは、StagedEnumMember と同じく AuthoringSession.AssetRegistrations が public だからにすぎません(CS0050) |
StagedAssetRegistrationKind(enum) | Add · Move · CreateGroup |
TabBaselineAnchor(struct) | TabName · Fingerprint · RecordCount |
IsolatedEdit | 再アンカーに失敗した編集 — Edit · Reason |
IsolationReason(enum) | 外部での名前変更 / 外部での削除 / キーの競合 |
オーサリングヘルパー(SheetForge.Editor.Windows / .Structure)
| 型 | 役割 |
|---|---|
KeyRenamePlanner(static) | キーの名前変更 + タブをまたぐ伝播の計画。Plan(…) · ネストされた KeyRenamePlan · 兄弟の struct KeyRename |
RecordIdMinter(static、純粋) | id の提案。Suggest · DetectCommonPrefix · Uniquify · StagedNewRowKeys |
IntIdMinter(static、純粋) | 新規レコードのための、次の IntId の提案 — Suggest(existingIds) → max + 1。RecordIdMinter とは別軸であり、削除された欠番を再利用することは決してありません |
ProjectionErrorMapper(static、純粋) | エラーの座標 → 論理アドレス。TryMap(…) · ネストされた LogicalAddress |
EphemeralSoApply(static) | 保留中の値による SO オーバーレイ(一時的)。Apply(…) · InvalidateIndex(…) · ネストされた Report / SkipReason / SkippedEdit |
Runtime アセンブリ(SheetForge.Runtime)
autoReferenced — asmdef の参照なしに、ゲームコードから利用できます。
| 型 | 役割 & 主なメンバー |
|---|---|
SheetForgeDatabases(static) | ランタイムローダー — 正式な読み込み経路です。const AddressPrefix = "SheetForge/" · AddressFor(tab) · LoadAsync(tab) · LoadAsync<TDatabase>(tab) · Release(handle) / Release<TDatabase>(db)。アドレス用のヘルパーは単なる文字列であり、常にコンパイルされます。LoadAsync と Release は SHEETFORGE_ADDRESSABLES の下でのみ存在します——これは com.unity.addressables がインストールされているときに設定されるバージョン定義であり、これによって製品はパッケージなしでもコンパイルできます |
DefinitionDatabase(abstract SO) | すべての生成されたタブごとの Database の基底クラス。abstract TabName · abstract Count · virtual IReadOnlyList<object> RecordsUntyped · virtual InvalidateIndex()。RecordsUntyped は、生成された型を知らなくてもベイクされたタブを列挙できる、正式な方法です——第二のベイカーや、すべてのタブを走査するインスペクターは、かつては private な records フィールドに対してリフレクションを行う必要がありましたが、それはフィールド名を、宣言されていない契約に変えてしまい、コード生成がそのフィールド名を変更した日にサイレントに壊れてしまうものでした。このリストは読み取り専用として扱ってください(シートが正規です)。デフォルトは 空 であるため、このメンバーが存在する前の生成コードも引き続きコンパイルされ、動作します。再インポートすると上書きが出力されます |
RecordRef(struct) | ベイクされた SO の内部でシリアライズされる参照値(文字列の id で、ルックアップ時に解決されます)。Id · IsEmpty |
IntRef(struct) | ベイクされた SO の内部でシリアライズされる、整数 キーの参照値——IntId@Tab フィールドのための RecordRef の対です。0 も有効な id であるため、IsEmpty は hasValue ビットで支えられています。Id · IsEmpty。コード生成は IntId@Tab フィールドを IntRef として出力し、生成された Database の TryGet(IntRef) がそれを受け取ります |
LocRef(struct) | ベイクされた SO の内部でシリアライズされるローカライズ参照——LocRef@Tab のセルです。Table(ローカライズタブであり、これが StringTable コレクションの名前になります)· Key · long KeyId(0 は「まだ解決されていない」という意味です: インポートは 0 をベイクし、テーブル同期のあとでブリッジが本物の id を埋めるため、キーがリネームされても参照は生き延びます)· IsEmpty。これは 常にコンパイルされます — 生成されたコードもベイクされたアセットも、ローカライズパッケージの型を決して含みません。それがパッケージを任意のままに保っているものです |
LocRefExtensions(static) | メンバーは一つ: LocalizedString ToLocalizedString(this LocRef) — KeyId が 0 でないときはそれで、そうでなければキー名で指し示し、空の参照は空の LocalizedString に変換されます。これは com.unity.localization がインストールされているときにだけ存在し、バージョン定義 SHEETFORGE_LOCALIZATION の下にあります — Addressables のレイヤーで SHEETFORGE_ADDRESSABLES が使うのと同じ仕組みです |
SheetForgeRuntimeInfo(static) | const Version |
生成される型(パターン — プロジェクトごとのものであり、出荷される API ではありません)
タブ Foo ごとに、コード生成はあなたの generatedNamespace に次を出力します。
public sealed partial class FooDefinition // one strongly-typed field per column; @desc → doc/tooltip
public sealed partial class FooDatabase : DefinitionDatabase
{
// TabName, Count, SchemaFingerprint, Records, RecordsUntyped override,
// lazy _byId/_byIntId lookups, InvalidateIndex override
}SheetForgeDatabases.LoadAsync<FooDatabase>("Foo") で読み込みます。
どちらのクラスも partial として出力されます。そのため、派生メンバー——計算プロパティ、インターフェースの実装、演算子など——を、生成されたファイルの隣にあるあなた自身のファイルに追加でき、再インポートしてもそれは上書きされません。一つだけ境界があります: あなたの部分に シリアライズされるフィールドを追加しないでください。ベイクされた ScriptableObject は、インポートのたびにシートから再構築されるため、あなたの部分だけがシリアライズするものは、デフォルト値に戻ってしまいます——ある値がデータに属するのであれば、それは列に属するべきです。(partial キーワードは、スキーマだけから計算される SchemaFingerprint には影響しないため、クラスを partial にしたことで、既存のベイクが無効になることはありません。)
その他のアセンブリ
-
SheetForge.Setup— 依存関係を持たない、Addressables 欠落時のブートストラップです。公開 API はありません(すべて internal です。これはガイダンスウィンドウを表示するために存在します)。 -
SheetForge.PluginDemo(一つに統合された asmdef + Demo.Editor asmdef。コンテンツの名前空間はSheetForge.Skillsのまま)— 参照用のサンプルパッケージであり、製品の API ではありません。次を含みます:SkillsPlugin(七つのプラグインインターフェース——base、validator、edge、template、graph、code registry、theme)。Modifier+ModifierCellParser(カスタムセルタイプ)、ModifierStatEdgeContributor(エッジコントリビューター)。ExamplePipelineAugmenter/ExampleReactiveAugmenter(キャンバスオーバーライド)、ExampleCodeAtoms(_Refsコードレジストリ)。ExampleStudioUi(宣言的なアクション・パネル・列バッジ・セルエディターの hint)、ExampleImportObserver(パイプラインオブザーバー)。ExampleStageStripWidget/ExampleInspectorAction/ExampleStudioPanel(Data Studio の Editor 拡張ポイントで、公開パレットから描画されます)、ExampleLocStrings(それらのラベルを二つの言語で登録します——メインの アセンブリにあるため、ブラウザーにも表示されます)。- アセンブリレベルの
SheetForgePluginCompat宣言。 SkillRunner(ランタイムを利用する側)、デフォルトのSheetForge.Generated名前空間にある生成されたExample*型(分離を担っているのは、別の名前空間ではなくExample*という接頭辞です)。
プラグインを使わない
SheetForge.CoreDemoサンプルは、asmdef を 一切持たず(Assembly-CSharpにコンパイルされます)出荷されます。
関連ページ
- プラグイン作成 — 使用されている契約と、その完全な例
- オーサリングカーネル — 文脈の中でのエンジンの型
- 機能と制限 — これらの API の振る舞いの境界