跳至主要內容
SheetForge

Data Studio——編寫介面

Data Studio 是一個涵蓋一切功能的視窗:查詢、搜尋、儲存格編輯、列/欄/分頁的編寫、試算表的建立與刪除,以及一個能夠顯示一筆記錄由什麼組成的記錄畫布。

底層只有一條規則貫穿一切:試算表才是權威來源。Studio 只會寫入來源(本機檔案/Google 試算表),絕不會寫入 SO,且每一項變更都會透過自動重新匯入來確認。

Tools ▸ SheetForge ▸ Data Studio 會開啟它——選單中唯一的編寫進入點。它不需要任何外掛:以下所有內容單靠核心內建型別即可運作,而外掛則會在其上額外新增形態與唯讀的鍵值空間(請參閱有無外掛的差異)。

現在只有一個編寫視窗。較舊的 Workbench——原本那個 IMGUI 視窗——已被移除,它原本能做到的一切,Studio 現在全都能做到。如果你正在升級,請參閱工作台去哪了

畫面上的內容

工具列

  • 使用中的來源標籤會標示提供者名稱;沒有使用中設定時會變暗。
  • ↓ Pull from source 會執行匯入。
  • ↑ Push to source 帶有一個計算待處理變更數量的圓角標籤。
  • 旁邊有一個 Discard 按鈕,會丟棄視窗中所有已暫存的變更。它會先詢問一次附上數量的確認,並以單一 Ctrl+Z 步驟完成,因此若你不慎捨棄,暫存內容仍可復原。來源本身絕不會被觸碰。
  • isolateddraft 徽章。
  • ⛔/⚠ 計數器。點擊某個計數器會跳到第一個錯誤/警告。
  • 一個 溢出選單,內含執行匯出推送至 Google 試算表匯出翻譯…匯入翻譯…健康檢查開啟本地化報告主題設定…。在非 Google API 來源下,Google 推送這一列仍會顯示但呈停用狀態,並在標籤上附上原因;當專案裡沒有任何在地化試算表時,那兩列翻譯項目也以相同方式處理。

側邊欄

  • 最上方是一個 All 項目——跨試算表搜尋,詳見下方說明。
  • 接著是每一份試算表,連同其列數、顏色圓點,以及任何帶有暫存變更的試算表上的 標記。工具列的圓角標籤顯示的是總數;這裡則顯示變更來自哪些試算表。
  • 試算表會依照自己的 @style 群組標籤被歸入不同的區段。在試算表上按右鍵 ▸ Group & color ✎ 即可設定;沒有標籤的試算表則留在預設區段中。
  • 試算表清單下方是一個 READ-ONLY 群組,列出外掛註冊的程式碼註冊表。
  • 這裡也會誠實顯示徽章:parse failed 代表某分頁在預覽中遺失,name clash 代表某個程式碼註冊表宣稱擁有一個真實試算表的名稱,以及下方所述的隔離通知。
  • 任何目前被封鎖的右鍵選單項目,仍會保持可見並附上原因。

表格

  • 一個黏性的四列標頭:來源試算表的欄字母位於原始的 @name@type@desc 儲存格上方。A 欄存放標記,因此資料從 B 欄開始。
  • 一個帶有真正試算表列號的槽,以及逐列的參照晶片:當兩筆以上記錄指向此列時顯示 shared N,恰好一筆時顯示 ↩ 1,沒有則不顯示任何內容。
  • 字母與列號,正是錯誤報告所印出的相同座標,因此「第 5 列、C 欄」可以被直接指出。點擊它們可選取該欄或該列,用於多目標操作與拖曳搬移——詳見下方的選取列與欄
  • 字母歸屬於位置,而非欄位本身。移動一欄,它就會顯示反映後它將坐落的位置字母。同樣的規則,也讓一個你已新增但尚未推送的欄,顯示它即將取得的字母。
  • 結構編輯位於右鍵選單中。欄標頭提供屬性、移動、往左右兩側插入與刪除;列號槽則提供上移、下移與刪除。被封鎖的項目仍會保持可見並附上原因。
  • 欄標頭還提供 凍結到這一欄為止,會將該欄與其左側的所有欄固定在水平捲動範圍之外(詳見下方說明)。
  • 欄選單其餘的部分——欄寬、自動調整欄寬、隱藏、篩選、清除欄資料,以及排序項目——會在下方的欄寬、隱藏與逐欄篩選一節中說明。每個字母儲存格的右緣都有一個可拖曳調整大小的把手。
  • 在一個參照儲存格內部,只有失效的清單片段會被醒目標示。

畫布

  • 當你啟用某一列時,會在表格下方開啟。
  • 你所開啟的記錄位於正中央:它所消耗的東西從左側流入,消耗它的東西則站在右側。畫布上方有一個分段控制項,可選擇雙向各自延伸的範圍。
  • 拖曳把手可調整大小,Esc 可將其關閉。
  • 每張節點卡片都會顯示其參照連接埠,以及以可編輯數值列呈現的一般欄位,因此畫布是第二個可以編輯的地方,而不只是一張圖(詳見下方的在畫布上編輯)。

節點檢閱器

位於畫布右下方。它承載:

  • 該節點的儲存格位址(點擊可在網格中聚焦該儲存格);
  • 一則「共用記錄」/「此鍵值不存在」/「此記錄為新建」的說明;
  • Used by 清單(點擊某個項目可前往該處);
  • 內建的 Go to this sheet 動作;
  • 在適用情況下的 Duplicate and splitCancel new row

Problems

底部面板會承載與一次匯入所產生的診斷資訊完全相同的內容,並由同一個報告渲染器呈現。管線才是唯一真實來源;視窗絕不會自行捏造訊息。點擊某一列會聚焦有問題的儲存格,並開啟其畫布。

外掛面板

一個右側窗格,每個外掛註冊的面板各佔一個區段,可收合,並會記住你上次展開的是哪一個。只有在有外掛註冊面板時才會繪製——若沒有任何面板註冊,就不會出現空盒子,因為一個空盒子代表著某樣東西正在遺失。

推送對話框

寫入前的差異比對:針對每一項暫存變更,列出分頁.列鍵值.欄位.舊值 → 新值,並在有編輯被隔離時附上說明。一個 Addressables 區段會列出這次反映將會進行的每一項資源註冊(新增.移動.建立群組——請參閱編輯儲存格)。取消則不會寫入任何內容。

編輯儲存格

  • 元件會跟隨 @type 而定。它讀取的 @type 是畫面上目前顯示的那一個,因此一個你已新增或已重新輸入型別、但尚未推送的欄,也已經會取得該型別對應的元件。
    • 必填的 bool 是切換開關;選填的 bool 會開啟與 enum 儲存格相同的選取器,因為它有三種狀態。
    • Enum<T> 會顯示其值加上一個 ▾,並開啟與參照儲存格相同的可搜尋選取器視窗。無法辨識的值會停留在清單最上方,而不會被靜默改寫。若該 enum 是在試算表中定義的,選取器最下方還會有 "Add a new member…"。空白的選填儲存格會顯示 ,或 —(預設)
    • RecordId@Tab 欄會得到一個參照下拉選單(詳見下方)。
    • AssetRef@Group 欄會得到一個資源選取器,並支援拖放(詳見下方)。
    • Color / AnimationCurve / Gradient 欄會得到 Unity 自己的顏色、曲線與漸層欄位(詳見下方)。
    • 其餘一切皆為標準的原始文字——數字、字串、鍵值、非參照的 List<>、wrapper、自訂型別——因為那正是剖析器往返所依據的文字。
  • 參照儲存格永遠都有下拉選單。 一個 RecordId@Tab 儲存格是一個文字方塊加上一個 ▾ 按鈕;手動輸入鍵值依然可行。即使目標試算表目前沒有任何候選項目,這個按鈕依然存在:這種狀態通常代表現在有什麼東西壞了,而這正是你最需要這項工具的時刻,選取器會說明此狀況,並提供建立記錄的選項,而不是直接開啟一個空清單。
    • 一個 List<RecordId@Tab> 儲存格會得到 +▾。選取器會保持開啟,且每一列都是一個核取方塊,因此勾選三筆記錄只需造訪一次。勾選會新增、取消勾選會移除該元素,且每一次勾選都是各自獨立的復原步驟。
    • 元素的順序並非下拉選單所要回答的問題。請在畫布上重新排序元素,那裡每個清單元素都有自己的 ▲▼ 列。
    • 純量儲存格則會直接取代其數值並關閉,且儲存格中已存在的鍵值會被標示,因此你不會重複挑選同一個。
  • 選填欄位可以被重新設回空白。 只要該欄宣告了 ?=default,這些選取器——參照、enum 與選填布林皆然——就會帶有一列留空選項,並標示出該儲存格會回退到的數值。必填欄位則不會有這一列,因為在那裡空白儲存格即為錯誤。
  • 直接從儲存格建立你缺少的記錄。 如果你想要的鍵值不存在,可在選取器中按下 + Create a new … record:搜尋框會變成一個預先填入該試算表共同前綴的鍵值輸入框。輸入名稱、按下 Enter,該列就會被建立,同時寫入這個儲存格,並以單一 Ctrl+Z 步驟完成。
    • 當此操作無法成立時,這一列就不會出現。程式碼所擁有的鍵值空間無法被新增內容,選取器會用一句話說明這一點。唯讀來源、正在執行中的管線,或以 xlsx 為來源的試算表,也會以畫布所使用的相同把關機制將其封鎖。
  • 資源儲存格具有選取器,並支援拖放。 一個 AssetRef@Group 儲存格是一個文字方塊,外加一個 按鈕,其精神與 Unity 的物件欄位相同。無論資源是以哪種方式抵達,規則都是一樣的。
    • 會開啟 SheetForge 的資源選取器:列出該群組中已有的位址——若該欄帶有 <Type>,則會依此限縮範圍,子資源則會以 parent[sub] 的形式列在其上層資源之後——並附上搜尋功能,目前的值也會被標示出來。清單下方的一行 ⊙ 瀏覽專案…,會開啟 Unity 自己、且已依該型別篩選過的物件選取器。
    • 你也可以將資源從 Project 視窗拖放到儲存格上:純量欄只能放一項資源,List<> 則可以放任意數量(會依順序附加;已存在於儲存格中的鍵值會被略過)。
    • 已在該群組中註冊過的資源,會保留其原有位址。尚不可定址的資源則會被暫存以待註冊:儲存格會立即取得其位址——不含副檔名的檔案名稱——而群組項目、以及尚不存在時的群組本身,都會在你反映時才建立,且是在試算表寫入成功之後。在那之前,專案中不會有任何變動;捨棄這項暫存內容也完全不會造成任何改變。
    • 已在另一個群組中註冊過的資源,會先詢問——一個對話框會列出這兩個群組的名稱,以及目前有多少其他儲存格透過原本那個群組參照它——然後才會暫存一次移動
    • 以下情況會被拒絕,並以 toast 說明原因:場景物件、資料夾、對一個純量儲存格拖放多項資源、不符合該欄型別的資源,以及該群組中已被其他資源使用的位址。
    • 暫存的註冊會出現在 Push 對話框的 Addressables 之下,並計入工具列的圓角標籤中。Ctrl+Z 會將儲存格數值與該項註冊一併移除;若重新輸入儲存格內容、使得再也沒有任何內容參照該位址,也會在同一個步驟中一併撤銷該項註冊,因此一項過時的註冊絕不會獨自留存下來。
    • 每個資源儲存格右側也帶有一個常駐的 按鈕:按下它,Project 視窗就會顯示並選取該項資源——清單儲存格會選取其持有的每一項資源並顯示第一項,而 parent[sub] 位址則會顯示子物件本身。在儲存格上 Ctrl+click(macOS 上為 Cmd+click)效果相同,單純點擊則仍會編輯文字。當位址無法解析為資源時,這個按鈕仍會保持可見,但呈停用狀態,並以工具提示說明原因。
    • 在儲存格上按右鍵可使用在專案中顯示——清單儲存格也適用——而在選填欄上則可使用清除(預設)。畫布上的數值列帶有相同的顯示按鈕,因為它們是同一個元件。
    • 在你反映之前,Problems 會回報 UnknownAssetKeyAssetTypeMismatch,而一項暫存的註冊並不算是錯誤——投影結果已將其計入。若沒有安裝 Addressables 套件,⊙ 按鈕與拖放功能都會被停用,並以工具提示說明原因;直接輸入位址則依然可行。
  • 資源儲存格會顯示資源本身。 當一個 AssetRef 儲存格的位址能解析時,文字旁會出現一個小型縮圖——只要是編輯器能夠繪製預覽的資源型別皆可,其大小經過調整,使列高絕不會因此改變;List<> 儲存格則會顯示其第一個元素的縮圖。
    • 點擊縮圖會開啟一個浮動的放大檢視;在記錄畫布上,圖片類資源會以大圖顯示在卡片上。
    • 無法解析的位址則單純不顯示縮圖——↗ 顯示按鈕已經承載了原因。
  • AssetRef<AudioClip> 儲存格可以播放。 位址旁的播放按鈕會透過編輯器自身的預覽聲道播放該音訊剪輯;再按一次即可停止,切換儲存格、關閉視窗、網域重新載入時同樣會停止。
    • 當編輯器組建版本無法提供這項預覽功能時,此按鈕仍會保持可見但呈停用狀態,並以工具提示說明原因。若儲存格中的資源並非音訊剪輯,則單純不會出現這個按鈕。
  • 顏色、曲線與漸層儲存格就是原生欄位。 一個 ColorAnimationCurveGradient 純量儲存格本身就是 Unity 的顏色欄位、曲線欄位或漸層欄位——整個儲存格皆是如此,沒有原始文字。
    • 每一次變更都會提交標準文字(請參閱試算表語法)。一連串的變更——例如在顏色選取器中拖曳、一次曲線編輯工作階段——會合併為一個復原步驟,與打字所遵循的規則相同。
    • 在選填欄上,空白儲存格會顯示 。點擊它會以型別預設值開啟該欄位,右鍵 ▸ **清除(預設)**則可將其再次清空。
    • List<Color>List<AnimationCurve>List<Gradient> 都是晶片編輯器:每個元素各有一枚晶片(一個色塊、一個曲線縮圖、一條漸層色帶),外加一枚 晶片。點擊會開啟一個彈出視窗,內含每個元素各自的原生欄位,加上 ▲▼ 與 ✕;新增、移除、重新排序,以及每一次元素編輯,都各自是獨立的復原步驟,因為清單的順序本身就是資料。其他型別的清單則維持標準文字。
    • 畫布上的數值列使用的是完全相同的元件。
  • 從欄表單將資源欄限制為某個型別。 在欄屬性表單中——以及在新增欄與建立試算表表單中——@type 欄位旁一律會有一個 型別… 按鈕;當目前輸入的記法是 AssetRef@Group 時它會啟用,否則會停用,並以工具提示說明原因。它會列出專案能夠載入的資源型別(可搜尋,短名稱並以完整名稱作為副標題),並將該欄位改寫為 AssetRef@Group<Type>List<>?=default 則不受影響;**不限制(任何資源)**會移除 <…>。手動輸入這項限制同樣有效。欄標頭的工具提示會顯示已解析的完整型別名稱。
  • 所打即所見,即時呈現。 網格中的文字是 baseline 加上你的暫存內容,因此它絕不會等待驗證完成才顯示。已提交的數值會在提交當下立即顯示其暫存色彩——無論是從下拉選單挑選的值、一次視覺值編輯,還是快速打字,即使儲存格仍保有焦點也一樣。較重的預覽內容(Problems、計數器、晶片、畫布)則是每一波編輯動作才重新計算一次,而非每次按鍵都重新計算。例外情況是在畫布上完成一次性手勢,那種情況會立即重繪。
  • 輸入時不會有行內驗證——診斷資訊只來自單一管道(預檢/匯入驗證器),並顯示於 Problems 中。
  • + Row 會新增一筆帶有建議 id 的記錄(共同前綴偵測,且避免衝突)。每一項暫存變更——儲存格編輯、鍵值編輯、新增列、全部捨棄——都是一個 Ctrl+Z/Ctrl+Y 步驟。在有暫存變更的情況下關閉視窗,會提示儲存/捨棄/取消。
  • ↑ Push to source 會執行共用的調度器:預檢 → 依來源進行寫回 → 自動重新匯入。鍵值重新命名仍會詢問「將會更新 N 筆參照——是否繼續?」,而 Google 推送在傳送任何內容之前,仍會顯示計畫核准畫面。
  • 誠實的把關機制
    • 唯讀來源(Google ExportUrl)會停用編輯與推送,並附上滑鼠懸停原因;
    • 來源為 xlsx 的分頁為唯讀狀態並附上徽章(寫回會略過 xlsx);
    • 當匯入/匯出/推送正在執行時,拉取與推送皆會被停用。

選取列與欄——以及如何拖曳它們

網格的座標本身就是把手,就像在試算表軟體中一樣。

  • 點擊列號可選取該列;點擊欄字母可選取該欄。
    • Ctrl+click 會將更多項目切換加入選取範圍;Shift+click 則會選取從上次點擊處算起的整個範圍。
    • 標頭與內容區會醒目標示所有已選取的項目,而鍵盤所在的儲存格則會畫出一個會隨方向鍵移動而跟著移動的選取外框。
    • 切換試算表會清除選取範圍——因為同樣的數字在那裡會指向不同的欄——選單中也會提供一個取消選取項目。
  • 拖曳選取範圍即可移動它。 抓住一個已選取的列號(或欄字母)並拖曳:一條插入線會追蹤放開時的落點,放開後選取範圍就會以單一 Ctrl+Z 步驟移動到該處。
    • 不連續的選取範圍——例如第 2, 5 及 9 列——會依你選取的順序,一併聚集到放開的位置
    • 當排序、搜尋或篩選固定了顯示順序時,列的移動會基於相同理由被拒絕,選單項目也會自我停用——而開始拖曳的那一刻就會立即說明原因,而不是靜默地不移動。
  • 右鍵選單會作用於整個選取範圍。 當選取了多個欄時,欄寬…自動調整欄寬隱藏、◀▶ 移動、刪除與**清除欄資料…**會套用到每一個被選取的欄;選取多列時,移動與刪除也會涵蓋所有列——每個批次都是一個復原步驟。
    • 只在單一目標時才有意義的項目——屬性、篩選、排序、凍結、插入——會獨立自成一個單一目標區段。
    • 被封鎖的項目一如既往,仍會保持可見並附上原因。

選取是一種僅限檢視當下的手勢:在有動作使用它之前,它不會被暫存,也不會被寫入任何地方。

選單本身現在是同一個元件。 Studio 中的每一個右鍵選單與下拉選單——欄標頭、列號槽、工具列的 ⋯、側邊欄、畫布節點與連線、儲存格選單——都是同樣的形狀:具標題的區段、核取記號、鍵盤導覽,以及會保持原地並附上原因的停用項目。這與網頁應用選單的形狀完全相同,因此兩者之間不需要重新學習。

在畫布上編輯

畫布編輯的是與表格相同的暫存緩衝區。以下所有內容都是一般的暫存變更:它會顯示在 Push 對話框中、是一個 Ctrl+Z 步驟,並透過相同的預檢與重新匯入鏈路寫回。

繪製的內容

一切都朝單一方向流動:素材在左側,使用這些素材的東西在右側,你所開啟的記錄則位於中間。

畫布上方的分段控制項可選擇雙向各自延伸的範圍:

  • 素材 → 這筆記錄 → 使用者——每側各一步;
  • 僅素材——兩步,用於追蹤一條組裝鏈;
  • 使用者

一份沒有自己參照欄的試算表,其左側自然沒有任何內容,因此只會提供上述選項中最後一種。之所以設有步數上限,是為了避免一個被廣泛使用的素材,把整個專案都塞進畫面中。若要看得更遠,只需雙擊某個鄰居,將其設為新的終點。

  • 同一筆記錄即使被抵達兩次,依然只算作一個節點。
  • 一筆不存在的記錄仍然會被繪製出來,並標示為失效,因為一個你看不見的連結,就是一個你無法修正的連結。
  • 循環同樣不會被隱藏:閉合該循環的那條邊,會沿著卡片下方的一條車道以虛線繪製回去,讓你能夠追蹤它返回的位置。

版面配置具有決定性——相同的資料永遠會產生相同的畫面。節點位置可以在本次工作階段中被拖曳,而拖曳結果刻意不會被儲存。

節點上的內容

標頭帶有鍵值、一個副標題(其所屬試算表,或外掛提供的人類可讀名稱)、儲存格位址,以及一個計算還有誰指向這筆記錄的徽章。

標頭下方,參照連接埠永遠可見。連接埠正是連線插入的地方,因此隱藏任何一個都會讓畫面說謊。每個連接埠都帶有實心或空心圓點、標示它接受什麼,以及目前連結了多少項。清單型連接埠會依順序顯示其元素,每個元素都有移動與移除控制項,因為清單的順序本身就是資料。

一般欄位會摺疊成一個「n 個值」群組,在終點展開、在其他地方收合。每一列都是一個可供輸入的數值列——與網格所使用的是同一個元件,並透過相同的把關機制提交。連接埠圓點會依其所接受試算表的顏色染色,因此一整條鏈讀起來就是同一種顏色。

卡片顯示的投影結果,與表格顯示的完全相同。 這一批次中已暫存的一欄——尚未反映,必填欄與參照型別欄皆包含在內——已經呈現在卡片上,並以表格標頭標示暫存狀態的相同方式標示為待處理,連工具提示也一併呈現:暫存的參照欄會顯示為一個連接埠,暫存的一般欄會顯示為一個數值列,暫存的重新命名會在原始數值上方顯示新名稱,而暫存的刪除也會把該列從卡片上移除。在已有資料的分頁中新增一個必填欄,並不會在空白儲存格仍待填入時把卡片清空——畫布會持續顯示這份試算表反映後的樣子,就跟表格一模一樣。

右肩處有一個單一的輸出圓點。這筆記錄所匯出的就是它自己,因此只有一個。從它拖曳所詢問的是相反的問題(「我在哪裡用到這個?」),而非拖曳連接埠所問的(「這指向什麼?」)。

只有當專案中確實有某份試算表擁有一個接受此試算表的欄位時,那個圓點才會被繪製,因為一個無處可去的圓點,是一種註定會失敗的操作提示。判斷依據是結構描述,而非資料:一個宣告了 RecordId@ThisSheet 的欄,即使還沒有任何人寫入過任何一列,仍會讓這個圓點保持存在。

手勢與選單

圓點就是把手。 按下一個連接埠圓點會啟動手勢,按在該列的其他任何位置則不會,因此不會有東西被意外抓取。按下並在未移動的情況下放開,依然算是一次點擊。

  • 卡片的標頭是它自己的把手:
    • 點擊它可選取該卡片,同時也會將其提升到任何與它重疊的卡片之上;
    • 拖曳它可在本次工作階段中移動卡片;
    • 雙擊它則會將該記錄設為新的終點。
  • 在空白畫布上按右鍵 → New record。 會開啟一個串聯式選取器:左側窗格列出目前畫面上已繪製的連接埠所指向的試算表,右側窗格則承載搜尋、建立與記錄清單,若有一個以上的連接埠可能接收該記錄,第三頁則會詢問由哪一個連接埠接收。
    • 外掛可以縮小或擴大這份試算表清單。它所宣告、但畫面上沒有任何連接埠接受的試算表,仍會留在清單中並附上原因,而不會直接消失。
    • 這裡不存在無關脈絡的「新記錄」——每一筆在畫布上誕生的記錄,一出生就帶有連結。獨立的一列,則是表格的 + Row 所要做的事。
  • 點擊一個空的連接埠圓點,或在某個節點上按右鍵 → Connect,即可連結該欄位。選取器會在游標所在位置開啟,且與網格所使用的是同一份可搜尋鍵值清單。
    • 兩行標頭文字會說明該插槽接受什麼,以及所挑選的內容會被寫入哪個儲存格。
    • 每一列都帶有鍵值、其顯示名稱,以及目前已有多少個地方指向它,已在此連結的鍵值則會被標示,而不會被靜默地重複連結。
    • 如果你想要的記錄尚不存在,搜尋框會變成一個填入該試算表共同前綴的鍵值輸入框。輸入名稱、按下 Enter,該記錄就會在同一個手勢中被建立連結,且以單一 Ctrl+Z 即可復原。若名稱為空白或已被使用,系統會說明原因(以及位置),而不會建立任何內容。
  • 你在畫布上建立的記錄,會成為新的畫布焦點。 檢視畫面會像雙擊卡片那樣導向它,因此新記錄會站在中央,你剛建立的連結則在它旁邊。(分岔是例外——分岔的重點就在於這個終點會保留自己的副本,因此檢視畫面會維持原地不動。)
  • 從一個空的連接埠圓點拖曳,連線會跟隨游標:放到一張卡片上即可連結,放到空白畫布上則會在該處開啟選取器。
    • 輸出圓點拖曳則方向相反。在某張卡片上放開後,畫布會找出該卡片的哪些欄位可以接受這筆記錄——若只有一個候選欄位就直接連結,若有多個則會詢問要用哪一個。放到空白畫布上則會開啟一份鏡像的串聯清單,列出可能接受它的試算表,包括畫面上尚未出現的試算表。
    • 拖曳進行中時,所有不相關的內容都會變暗,而能夠接受它的連接埠則會發光,因此合法的目標是可見的,而不必用猜的。
    • 每一次完成的手勢,都會以一則簡短的 toast 提示回應,說明寫入了哪個儲存格——並在必要時,說明該連結是否閉合了一個循環,或該記錄現在是否與其他人共用。
  • 拿起一條已經接上的連結。 拖曳一個已填滿的單一參照連接埠,會把那條連線本身拿起,就像從插座上拔出一條纜線一樣。放到另一張卡片上可重新瞄準它,或放到另一個連接埠上將連結搬移到兩個不同的儲存格——依然是一個復原步驟,且除非兩項計畫都成立,否則兩個儲存格都不會被寫入。放回原處,或按下 Esc,則不會有任何變動。
    • 放到空白畫布上,會在游標位置開啟該儲存格的選取器,並將取消連結作為選取器內的一個選項提供,而不是就地直接執行:一次失手的操作,絕不能就此抹除一條連結。
    • 若在不移動的情況下點擊這樣的圓點,則會改為選取該連線,因此這兩種手勢絕不會互相干擾。
    • 一個已填滿的純量連接埠,依然是別人拖曳時的有效目標——放到它上面代表取代
    • 清單型連接埠沒有單一連線可以拿起,因此永遠會開始一條連結。移除或重新排序某個元素,則是該元素自己的 ✕/▲▼ 列所要做的事。
  • 連線本身的線身是用來選取的,而非用來拖曳的。 在連線上的任何位置點擊——可點擊的範圍會沿著其路徑的每一段延伸——即可選取它並開啟連線檢閱器。Delete 或右鍵 ▸ Disconnect 可將其取消連結。重新瞄準則是上述的連接埠手勢,因此每件事都恰好只有一種做法。
  • 在某個節點上按右鍵 → Delete this record。 一個對話框會列出所有將會消失的內容:有多少連結指向這筆記錄,以及該列上有多少項暫存編輯會被捨棄。
  • 分岔一筆共用記錄。 當一筆記錄被用於多個地方時,節點檢閱器會提供 Duplicate and split。它會將每一欄都複製到一個新的鍵值上(依試算表的前綴建議產生),並只將這個畫布的連結重新瞄準到這份複本上。這是一個復原步驟,其他人所使用的原始記錄則完全不受影響。
  • 連線檢閱器會隨著選取的連線一同開啟。它遵循「一列即一個 token」的原則:連結所寫入的儲存格,以及該儲存格整段文字依 token 拆解後的結果,並標示出目前這一列所對應的那一個。
    • 當開啟該邊的外掛提供描述時,會有一列用來編輯 token 中除鍵值以外的部分(例如 attack:add:10 中的 add:10)。編輯這一列只會改寫殘留的部分;要變更它指向什麼,則屬於重新瞄準,也就是連接埠手勢。
    • 從這裡你也可以開啟它所指向的記錄,或剪斷這條連結。
  • Delete 鍵會讀取目前的選取內容,並依此判斷它在此處代表的意義。
    • 若選取的是一條連線,會將其取消連結。
    • 若選取的是一張卡片,則要視該卡片是否為你所開啟的記錄而定。對終點——中間那張卡片,也就是這個畫面主題所在的記錄——會刪除該記錄,並經過與選單項目相同的確認對話框。
    • 對任何其他卡片,則會一次剪斷該卡片與這個畫面之間的所有連結,因為從這裡看,該卡片只是素材,而非主題。這是一個復原步驟,且各項計畫會串聯執行,因此一個清單欄會失去所有相符的元素,而不會只留下最後一個;若某個連結無法被剪斷,系統會說明原因,而不會悄悄無聲。
    • (右鍵 ▸ Delete this record 永遠代表刪除,無論是哪一張卡片——按鍵是意義會跟隨選取內容而變的捷徑,選單項目則是明確固定的那一個。)
    • 外掛所繪製、並非試算表列的卡片,沒有任何東西可以刪除或取消連結,因此該按鍵對它不會有任何作用。
  • 一筆沒有連結任何東西的新記錄,不會出現在別人的畫布上。 一列新記錄只有在暫存的連結將它繫結到畫面上某個東西時,才會在此顯示——否則,表格中一列尚未完成的資料,就會跟著專案中的每一個畫布到處出現。
    • 這不會造成任何損失。從畫布建立一筆記錄,會立即將檢視畫面導向它,因此你剛建立的那一列正是你所看到的內容。在表格中建立的一列則會留在表格中。而一列最終沒有連結任何東西的記錄,無論它是否曾經被繪製過,都會在被捨棄之前,出現在反映對話框的捨棄清單中並具名列出。
  • Ctrl/Cmd +滾輪可縮放畫布,範圍介於 25% 到 200% 之間,並讓游標下方的那一點保持靜止。畫布標頭中的百分比則是一個按鈕,點擊可立即返回 100%。單純滾動滾輪仍會捲動畫面。
  • 以滑鼠中鍵拖曳——或 Alt +左鍵——即可平移畫面。 按住期間游標樣式會改變,清楚表示正在移動的是檢視畫面本身,而不是畫面上的東西。
    • 單純的左鍵拖曳仍然代表「選取與連結」,這正是平移功能需要獨立按鍵的原因。Alt +左鍵則是為沒有中鍵的滑鼠與觸控板提供的相同手勢。
    • 平移動作會在內容邊緣處停止:這是一個捲動檢視,而非無限延伸的平面,因此你不會把圖形搞丟在空白區域中。

取消連結與拒絕情況

取消連結會在你按下之前,就先說明將會發生什麼事。 清除操作永遠不會被拒絕,但選單項目會清楚寫出其後果:

  • 具有預設值的選填欄,會回退到該預設值,因此連線會消失,但該記錄在執行期依然能夠解析;
  • 沒有預設值的選填欄則單純變為空白;
  • 必填欄則會變成一個空白儲存格,並由 Problems 回報——你可以將其暫存,而預檢會阻擋反映動作,直到你填入內容為止;
  • 清單則單純會失去那一個元素。

驗證只透過單一管道進行;畫布絕不會自行執行第二套驗證。

有兩件事確實會被拒絕,而非偽裝成可行,選單會說明是哪些:

  • 一條沒有指明自己寫在哪個儲存格中的連線,無法被編輯。 對於核心自行讀取的參照,核心會自動填入這項資訊;若是外掛手動新增的連線,則需由外掛自行提供(或誠實地略過)。
  • 深埋在自訂型別內部的連結——例如 Modifier 數值中的數值名稱——只有在開啟該邊的外掛也額外選用實作了 IAuthorableEdgeContributor 時,才能被編輯。否則該連線僅供顯示。

重複的鍵值、唯讀來源、以 xlsx 為來源的分頁,以及正在執行中的匯入,會如同它們停用表格編輯功能一樣,同時停用畫布的編寫功能,並各自在選單項目中附上原因。

結構編輯

以下所有內容都會像儲存格編輯一樣被暫存——立即可見、可復原,並透過一次寫回動作確認。這些操作入口位於上方所述的右鍵選單中(欄標頭.列號槽.側邊欄的試算表)。

Studio 也在試算表的標頭列上、緊鄰試算表名稱處,保留了固定的按鈕,讓最常用的操作即使不知道右鍵選單的存在也能找到。其中包括 + Row+ Column(會在最後面附加一欄)。同一列工具列還帶有試算表的重新命名 @overlap 列切換開關,以及搜尋與排序控制項。若要將新欄放在特定位置,仍需透過在欄標頭上按右鍵完成。

  • :可原地新增、移除、移動,以及編輯屬性。
    • 屬性表單(標頭上的 properties ✎)會一併編輯名稱、@type@desc@overlap。只有標記儲存格會變動;該欄的資料儲存格會 100% 被保留(不會有先刪除再新增造成的資料遺失)。
    • @overlap 是一個核取方塊。該列會在首次需要時自動建立,且在鍵值欄上會停用,因為鍵值欄永遠是唯一的。
    • @type 的輸入內容會邊打字邊驗證。預檢接著會在任何內容被寫入之前,驗證每一個既有儲存格是否與新型別相容。
  • 標記:新增/移除選填的 @overlap 列。一份試算表自己的 @style 群組標籤與顏色,會透過相同的路徑暫存(側邊欄右鍵 ▸ Group & color ✎),因此群組與配色會像任何其他編輯一樣被推送到試算表,而不是只停留在編輯器本機的狀態中。
  • :刪除;以 ▲▼ 重新排序(在 Studio 中,對應列號槽選單裡的「move up」/「move down」)。
  • 欄重新排序——可移動任意次數,並在一次反映中一併確認。待處理(新增)的欄也可以重新排序,甚至可以一路移到最前面、越過既有的欄。
  • 註解與空白列會在所有結構編輯過程中被保留。

所見即所得:網格是反映後試算表的即時預覽

你所暫存的一切,會立即呈現為你所看到的樣子:

  • 新增的欄會立即出現——你也可以在同一批次中填入其儲存格內容(無論是既有列或新列皆可)。這正是在已有資料的分頁中新增必填欄的方式:新增欄位的同時一併填入數值。未填入的必填儲存格會被預檢攔截。
  • 刪除的欄/列會立即消失。 暫存摘要會列出目前待處理的項目(Deleted: column 'hp' · Added: column 'mp')——僅供顯示。
  • 所有動作都可以在同一批次中自由混合:數值編輯、新增列、多個欄的新增/移除、標記切換,以及重新排序——沒有「一個批次只能一種操作」的限制。
  • 刪除一個已有暫存編輯的欄/列(或取消一個已填值的新欄)時,會詢問*「將會遺失 N 筆編輯內容——是否繼續?」*——沒有任何內容會被靜默捨棄。

分頁重新命名與 A↔B 互換——參照跟隨資料

分頁重新命名(「重新命名分頁 ✎」)會重新命名來源,並在確認對話框之後,更新所有試算表中每一個指向該分頁的 @type 參照RecordId@FooRecordId@Bar,包含清單與自訂型別形式)。重新命名來源,在本機端代表保留副檔名的檔案重新命名,在 Google 端則代表內容不受影響的標題變更。

互換(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 變動之後依然存續。

當試算表被外部變更、導致解析失效時——例如該列的鍵值在外部被重新命名、該列被刪除,或鍵值現在發生衝突——一項編輯就會被隔離。被隔離的編輯會從反映中排除,並顯示「隔離」徽章。它既不會被靜默捨棄,也不會阻擋你工作階段中的其餘內容;你可以在確認後個別捨棄它。

預檢驗證——先驗證,再反映

寫回動作會先驗證記憶體中預計呈現的完整狀態——參照完整性、@overlap 唯一性、資源鍵值與資源型別(本次工作階段中已暫存的註冊會被視為已存在),以及任何外掛的領域驗證器。若驗證失敗,不會寫入任何內容,你會得到完整的報告。只有在整個預計狀態通過驗證後,寫入動作才會開始執行;暫存的 Addressables 註冊會在試算表寫入成功之後、自動重新匯入之前執行;一次反映若唯一的暫存變更就是一項註冊,仍然會執行該項註冊並重新匯入(請參閱來源、匯出與推送)。

試算表的建立/刪除

  • 建立:可從兩個內建範本之一建立、從外掛註冊的範本建立,或從零開始自行定義欄位。一鍵即可建立本機檔案或 Google 分頁(會先顯示警告)。
    • 兩個內建範本分別是物品範例(僅核心類型),以及會排出一份 @enum 試算表的 Enum definitions(詳見下方說明)。
    • 外掛註冊的範本,僅在有外掛提供時才會出現——例如 Plugin Demo 的技能分頁。
  • 如果你建立到的來源,並非你目前匯入所使用的來源,對話框會在執行動作前先說明此情況。自動重新匯入只會讀取舊的來源,永遠不會看到新的分頁,因此建立動作會將匯入來源切換成你剛剛建立進去的那一個,並將此變更儲存到設定資源中。
  • 刪除:會一併清除所有相關內容:來源、baseline、烘焙後的 SO,以及產生的 .cs(會有強烈警告並需要核准)。

跨試算表搜尋(All 項目)

側邊欄的第一個項目是 All:輸入一個字詞,它就會以部分符合的方式,搜尋每一份試算表的 id 與欄位值,並列出試算表.鍵值.欄位.值,每頁 50 列。搜尋框留空時,則會瀏覽每一份試算表中的每一筆記錄。

它讀取的是烘焙後的資料庫,因此需要先有一次成功的匯入,若尚未有任何匯入,它會明確說明。當一次匯入完成、或使用中設定發生變更時,結果會自動重新整理,而不會顯示過時的答案。

結果列不只是一份清單,而是一扇門。雙擊它——或選取該列後按下 Enter——該試算表就會開啟,並選取相符的儲存格;單純點擊則只會選取該列。由於結果來自烘焙後的資料,一筆結果可能指名目前工作階段尚未載入的試算表——那一列不會進行導覽,清單下方會有一則簡短說明,告訴你原因,而不是毫無反應。

開啟匯入失敗的試算表(隔離)

過去,一項驗證錯誤會讓你完全無從修正:匯入失敗,因此視窗中不會出現任何試算表,唯一的前進方式就是直接開啟該份試算表本身。現在這個情況已經反過來了。

擷取與儲存,與驗證是分開的。 只要來源被完整讀取,即使驗證失敗,試算表仍會被儲存為 baseline 快照——因此 Studio 依然會開啟它們,針對有問題的儲存格顯示每一個錯誤,並讓你一如往常地修正並推送。

真正被封鎖的是輸出:在錯誤數歸零之前,程式碼產生與烘焙都不會執行,因此「不會有部分組裝的結果」這項原則,被保留在它真正該存在的地方——出口處。

  • 你會被告知,而不是被晾在一旁猜測。 Console 會說明試算表已被儲存,以及目前被封鎖的內容。側邊欄會帶有一則 ⛔ N error(s) — code generation and baking are blocked 通知,點擊即可跳到第一個錯誤,而逐試算表的錯誤徽章,則來自你已經在 Problems 中看到的投影診斷。完全無法剖析的試算表,會明確說明此狀況,而不是顯示為空白。
  • 推送你的修正只會詢問一次。 當試算表處於隔離狀態時,寫回動作會顯示一次額外的確認:既有的錯誤會保留,而這次編輯所引入的新錯誤也會一併寫入——驗證不會阻止它。它所找到的一切,都會以警告的形式列在該次反映的報告中,之後自動重新匯入會重新驗證整份試算表。在健全的試算表上則不會有任何變化:預檢依然是一道嚴格的關卡。
  • 出口依然關閉。 匯出,以及推送到正式試算表,在隔離期間皆會被拒絕,因為兩者都會把最後一次成功烘焙的數值拼接進較新的試算表中——這會讓某人才剛修正好的數值被回滾。基於相同原因,新鮮度檢查也會阻擋建置,入門視窗同樣會顯示這個狀態。
  • 這個旗標只會在唯一一個地方被清除——也就是一次匯入完整跑完烘焙的那一刻。更早的任何步驟都無法清除它,因此之後的一次失敗,絕不會留下一個假的「一切正常」訊號。

排序與篩選(僅影響顯示)

Studio 新增了一個逐試算表排序功能(任意欄、遞增/遞減、具型別感知的比較方式,依專案保存)與一個文字篩選功能。兩者都只會改變顯示順序:列號槽仍保留真正的試算表列號,排序或篩選都完全不會影響暫存、反映、推送或匯出。

當排序或篩選啟用時,列號槽選單中的列移動項目會自我停用並說明原因,因為此時「畫面上可見的鄰居」並非真正的鄰居。下方所述的逐欄數值篩選與隱藏欄同樣遵循這項規則。

凍結欄(僅影響顯示)

在某個欄標頭上按右鍵 ▸ 凍結到這一欄為止,該欄連同其左側的所有欄,就會移入一個獨立於水平捲動範圍之外的窗格中——如此一來,即使你捲動到很遠的欄,鍵值仍會保持在可視範圍內。取消凍結欄 則會將它們釋放。至少必須保留一欄可以捲動,因此凍結最後一欄會被拒絕並顯示原因。只有單一欄的表格則沒有任何東西可以凍結。

被凍結的是從左側數起的欄數,而不是某個具名的特定欄。因此移動一欄會改變目前被固定住的是哪幾欄,這與試算表軟體中凍結窗格的行為完全相同。

與排序及篩選一樣,這是一項檢視設定,依專案偏好設定逐試算表儲存。它絕不會傳達到試算表本身,因此在唯讀與 xlsx 來源的試算表上,以及匯入執行期間,它依然可以正常運作,且不會出現在任何推送或匯出結果中。

欄寬、隱藏與逐欄篩選(僅影響顯示)

無論是在資料試算表還是 Enum 定義試算表上,每一欄都能手動調整大小:拖曳把手(位於該欄字母儲存格的右緣)、按兩下把手可恢復到測量寬度,或使用欄選單中的欄寬…輸入精確數值,也可用自動調整欄寬重新測量一次。下限為 24 px,沒有上限。寬度會依試算表儲存,並在該試算表或編輯器再次開啟時還原;自動調整功能會測量每一列——不只是可見的列——因此篩選不會讓欄寬跳動。

同一個欄選單還帶有其餘的試算表功能集:

  • 隱藏欄顯示隱藏欄(n)——隱藏是一項檢視設定:字母仍會標示試算表的真實位置(A.C.D),標頭與內容區中的粗體邊界線會標示隱藏欄所在的位置,工具列上的晶片會統計其數量。最後一欄可見欄會拒絕被隱藏,並顯示原因。隱藏欄在其他地方依然存在——畫布、驗證、Export 與 Push 所看到的試算表都不受影響。
  • 篩選…——一份欄值核取清單(空白儲存格對應一個**(空白)**項目),外加一項條件:任何欄都可使用包含/不包含/空白/不是空白,數字欄則可另外使用等於/不等於/大於/小於/大於或等於/小於或等於。未勾選任何項目時,所有值都會通過,且條件依然生效。篩選會與搜尋框結合運作,新增的列一律保持可見,工具列上的晶片會統計已套用篩選的欄數,清除篩選則會移除一項篩選。
  • 清除欄資料…——經過確認後,會以一個復原步驟清空該欄在每一列(包括被篩選掉的列與暫存的新列)中的值。鍵值欄會拒絕——每一列的名稱就存在那裡,請改在儲存格中重新命名——而必填欄則會誠實回報錯誤,直到重新填入為止。沒有內容可清除的欄則什麼都不會暫存。
  • 遞增排序/遞減排序/(sheet order)——逐試算表排序功能,現在也出現在欄選單中,並會在目前使用中的選項上標示核取記號。

與排序及凍結欄一樣,這一切都僅影響顯示:這些是逐試算表的檢視設定,絕不會傳達到試算表本身、推送或匯出結果中。

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 試算表上,並標示為暫存狀態,直到下一次反映將其寫入為止。

若某個 enum 是由外掛透過 C# 註冊的,這一列則不會出現——而不是出現後才失敗——因為該試算表並不擁有那個 enum。

網頁應用以相同的方式、相同的規則編寫這些試算表——請參閱 SheetForge Web

從 Console 錯誤直接跳至該儲存格

當匯入或反映發現錯誤時,人類可讀的 Console 報告會在每個錯誤的座標旁附上一個可點擊的**"在 Data Studio 中開啟"**連結。點擊它會開啟 Studio、切換至對應分頁,並醒目標示該儲存格(列的左側會有一條標示線,儲存格則會加上邊框)。沒有特定儲存格的錯誤(檔案/分頁層級)則只會聚焦到該分頁。

此連結只會加進人類可讀的報告中;供機器讀取、供 CI 與記錄檔擷取使用的座標行則維持不變。

健康檢查

Studio 工具列中的 ⋯ ▸ 健康檢查,會執行一次快速、無需連網的診斷。它會針對以下每一項印出 ✓/✗ 與建議的修正方式:

  • 使用中設定;
  • 來源可存取性——本機資料夾是否存在,或 Google id + 服務帳戶金鑰路徑;
  • 匯入 baseline;
  • 產生的程式碼/烘焙/Addressables 是否為最新。

摘要對話框會告訴你有幾項檢查需要處理。

使用中的匯入設定

當專案中存在超過一個 SheetForgeSettings 資源時,工具列會顯示一個下拉選單,讓你選擇哪一個是使用中的。選取後會立即啟用該資源並重建畫面;選單、匯入,以及兩個編寫視窗,全都會依循使用中的選擇。只有單一設定資源時,此下拉選單會被隱藏。

使用中的選擇會依專案與使用者各別儲存,因此絕不會影響版本控制。你也可以在入門視窗(Tools ▸ SheetForge ▸ 入門)中管理它,或透過某個設定資源的檢閱器來管理,其檢閱器會顯示一個**「使用中」徽章,或是一個「設為啟用」**按鈕。

安全防護機制

  • 針對本機來源提供外部變更偵測
  • 當存在暫存變更時會顯示關閉警告
  • 透過暫存世代錨點,防止對過時的表格進行操作。
  • 模式感知:當來源為唯讀(Google ExportUrl)時,推送/反映/結構編輯/刪除都會被停用,並附上滑鼠懸停說明。
  • 匯入/匯出/推送過程中會顯示進度條,並且永遠會被清除(try/finally),且已在地化。
  • 一個行為異常的擴充功能,並不會導致整個視窗當機:畫布覆寫、小工具與動作皆於 try/catch 中呼叫,發生失敗時只會產生一則英文的 Console 警告,視窗的其餘部分則會繼續正常運作。

重新命名前應知道的事(反映後即無法復原)

  • 欄重新命名/@type 變更會重新產生對應的欄位(名稱/型別),因此參照該欄位的遊戲程式碼必須手動更新。確認對話框會明確說明此點,因此造成的編譯錯誤,會被自動連鎖流程安全中止,並提供可據以行動的說明。欄的數值則會被保留。
  • 分頁重新命名會變更產生的類別名稱(FooDatabaseBarDatabase)——規則相同。
  • 互換與循環重新命名,適用與單一重新命名相同的規則(請參閱上方的分頁重新命名小節)。只有真正的衝突——兩個重新命名指向同一個名稱——才會被拒絕。
  • 來源為 xlsx 的分頁不支援重新命名。表單會說明原因,且「套用」按鈕會被停用;請直接在該活頁簿中重新命名分頁,然後重新匯入。
  • 在 Google 上,仍存在一個邊界情況:兩個互換的分頁若互相參照,並不會被重新指向(本機端則完全正確)——詳見功能與限制
  • 反映之後,這些動作就無法再以 Ctrl+Z 復原(因為試算表已經被寫入)。

測試編輯(暫時性的 SO 調整)

烘焙後 SO 的檢閱器具有一個**「測試編輯」切換開關**(預設為關閉 = 唯讀)。開啟後即可暫時調整 SO 數值、試驗執行期數字——絕不會寫入試算表,且會在下一次重新匯入時消失。記錄可透過 codeNameid 快速尋找,無論是在編輯器中還是在 Play 模式下皆可。

Workbench 那個獨立的「將我的暫存數值預覽套用到 SO 上」按鈕,已隨那個視窗一併走入歷史。它當初驅動的覆蓋層,如今仍是公開 API,供想要使用它的工具呼叫:EphemeralSoApply 會套用它能夠真實計算出的部分,並拒絕待處理的欄與剖析失敗的儲存格,而不是偽造這些數值。上方的切換開關則涵蓋了日常使用情境。

有無外掛的差異

凡是列為無外掛(僅核心)的項目,皆可在一個純淨的專案中運作。每一行加上外掛之後,則是一個領域外掛會新增的內容。這一切都會透過內建的 Plugin Demo 實際運作,因此你可以在自行撰寫之前,先看看每一項實際運行的樣子(請參閱外掛開發)。

  • 試算表、儲存格、列
    • 無外掛:完整表格、儲存格編輯、新增列、暫存、Ctrl+Z、推送。
    • 加上外掛之後:不變。
  • 拉取/推送
    • 無外掛:從使用中來源匯入;透過相同的預檢+重新匯入鏈路推送。
    • 加上外掛之後:不變。
  • Problems
    • 無外掛:四項核心驗證(鍵值、參照、@overlap、資源鍵值)。
    • 加上外掛之後:加上你自己的 IDomainValidator 規則。示範會針對未加制動的反應循環,以及孤兒記錄提出警告。
  • 畫布顯示的內容
    • 無外掛:你所開啟的記錄、它是由什麼組成,以及有什麼使用了它,並以決定性的方式排列。
    • 加上外掛之後:加上你透過 ISheetForgeGraphPlugin 提供的逐分頁覆寫——並非試算表記錄的身分、核心看不到的連結、依領域順序(絕對位置或從畫面上的記錄起算)固定的欄位,以及一筆記錄對外呈現的人類可讀名稱。示範會在 ExampleActions 記錄周圍長出事件節點與一個程式碼區塊、固定 ExampleSkills 記錄的施放階段,並將卡片與選取器中的 fireball 轉換顯示為 Fireball
  • 繪製的邊
    • 無外掛:核心掃描器能看到的每一個 RecordId@Tab 參照(純量、清單元素、預設值、wrapper 內部)。
    • 加上外掛之後:加上由 IEdgeContributor 宣告的邊,以及任何由畫布覆寫所揭露的額外邊。示範會開啟深埋在 Modifier 迷你語法值內部的數值參照。
  • 在畫布上編輯
    • 無外掛:針對每一欄的建立、連結、取消連結、重新瞄準、分岔、刪除,以及行內數值編輯;新記錄可以在已繪製連接埠所指向的試算表中建立。
    • 加上外掛之後:加上 IAuthorableGraphShape 決定新記錄可以在哪裡建立、IAuthorableEdgeContributor 讓貢獻者自己的邊變得可編輯,以及 IEdgeTokenEditor 公開其 token 中除鍵值以外的部分。示範的貢獻者會在你連結或取消連結一個數值時改寫 modifier 迷你語法,並在連線檢閱器中將其 op:value 提供為一列可編輯的內容。
  • 儲存格元件
    • 無外掛:內建分支(切換開關、選項選取器、參照選取器、附拖放的資源選取器、顏色/曲線/漸層欄位、這三種型別清單所用的晶片清單、原始文字)。
    • 加上外掛之後:加上你為某個具名儲存格型別提供的 IStudioCellEditorProvider。若完全沒有撰寫任何元件程式碼,則會改由 StudioCellEditorHint 為該型別指定七種內建外觀之一(下拉選單、多行、滑桿、切換開關、顏色、曲線、漸層)。已註冊的元件優先;提示則優先於核心預設值——當一個套件以相同型別名稱註冊自己的提示時,也一併優先於內建的顏色/曲線/漸層提示。
  • 選單與面板
    • 無外掛:僅內建項目。
    • 加上外掛之後:加上你的 ISheetForgeStudioPlugin 註冊內容——檢閱器末端的動作、列選單、欄標頭選單、畫布節點選單,以及工具列的 、一個右側摘要面板,以及欄標頭旁的徽章。示範會在一列上暫存一個反應制動器、以一個 Undo 步驟填滿整欄,並以一個施放時間量表摘要一項技能的組裝內容。
  • 自繪面板
    • 無外掛:無。
    • 加上外掛之後:IStudioPanelProvider 可繪製任意的 UIToolkit 面板。若以與某個已描述面板相同的 id 註冊,這裡會由它勝出,而瀏覽器則會繪製那個已描述的面板。
  • 側邊欄
    • 無外掛:只有你自己的試算表。
    • 加上外掛之後:加上以 _Refs 風格鎖定的程式碼註冊表(ISheetForgeCodeRegistryPlugin),以唯讀的鍵值/標籤/raises 網格呈現;指向這些鍵值的邊不會被畫成失效狀態。
  • 畫布上方
    • 無外掛:沒有內容(核心不出貨任何小工具)。
    • 加上外掛之後:你自己的 IStudioGraphWidget。示範會顯示一條固定的階段長條(VALIDATE → CAST → COMMIT → DELIVER → APPLY),內容取自終點列。
  • 節點檢閱器
    • 無外掛:位址、使用者清單、「Go to this sheet」、「Duplicate and split」。
    • 加上外掛之後:加上你自己的 IStudioInspectorAction 按鈕。示範會在一個未加制動的反應上暫存 brakeSeconds = 0.25(一項正常、可復原的暫存編輯)。
  • 顏色與標籤
    • 無外掛:內建預設集,加上每份試算表自己的 @style 顏色。
    • 加上外掛之後:加上你自己的 ISheetForgeThemePlugin 預設集,以及 ISheetForgeStringsPlugin 字串——這些字串註冊於 Core,因此同一個字串包的標籤也會顯示在瀏覽器中。

從空白專案開始

沒有使用中匯入設定的情況下開啟,Studio 會顯示一個**「Get started」**面板取代原本的表格——內含用於建立設定資源、匯入外掛/核心示範,或開啟入門視窗的內嵌按鈕。一旦存在設定資源,此面板就會立即消失。

更快的做法是:將一個資料夾拖曳到視窗上,或單一 .tsv.csv.xlsx 檔案(會使用其所在的父資料夾)。經過一次確認後,這會建立一個讀取該資料夾的匯入設定資源,並將其設為使用中。如果你已經有使用中設定,對話框會說明此情況,並提供建立新資源後切換的選項。

工作台去哪了

原本的 IMGUI Workbench 視窗已被移除。它與 Studio 共用同一個編寫工作階段、同一套組合/驗證引擎,以及同一條反映路徑,因此沒有任何行為因此而遺失——而它獨有的三項功能,已率先被搬遷:

Workbench 功能現在的所在位置
All 分頁——支援換頁的跨試算表搜尋Studio 側邊欄最上方的 All 項目(相同的搜尋方式、相同的每頁筆數)
拖放上手流程由 Studio 本身接收拖放(如上所述)
Google 的 gid 自動填入/即時分頁清單面板設定資源檢閱器中的 Google Sheets 區段

有一項功能是被捨棄、而非被搬遷:Workbench 那個可將暫存數值預覽套用到烘焙後 SO 上的按鈕。SO 檢閱器的測試編輯切換開關涵蓋了相同的需求(詳見上方的測試編輯)。

如果你手邊的程式碼或筆記還指向它:沒有任何選單項目需要更新——它從來就沒有過選單項目——而設定檢閱器、烘焙後 SO 檢閱器,以及入門視窗的範本庫,現在全都會開啟 Data Studio。

相關頁面