《UIS》 第 2 篇 編輯器與資料庫設定

本篇文章、圖片出處來自 Ultimate Inventory System
軟體版本與本翻譯文件可能會有落差,本翻譯文件僅供參考。
本譯文為本站譯者原創翻譯內容,文字著作權歸本站所有。
未經授權,請勿任意轉載、改作或商業使用。

編輯器與資料庫設定

v1.1 版本 1.1 升級指南

版本 1.1 帶來了大量改進,重點在於使用者介面。目標是建立一套模組化且靈活的系統,讓使用者可以自由混搭功能來打造專屬的庫存 UI。由於這需要完全重寫整個 UI 系統及其所有元件,1.0.x 版本的 UI 與新系統不相容,因此從舊版升級需要以下步驟。

重要 升級前請務必備份你的專案!

升級步驟

1. 移除版本 1.0.x

由於許多腳本已被重新命名或移除,Unity Package 對這類變更的處理不太理想。請先完整移除 1.0.x 版本,再匯入 1.1 版本。

2. 檢查場景與 Prefab 的遺失元件

由於許多腳本已被重新命名、替換或刪除,部分 GameObject 或 Prefab 可能需要修復。

3. 選單與面板(Menus & Panels)

如果你的選單或面板是從範例場景複製而來,強烈建議將其移除,並使用 UI Designer 從頭重建。這是因為為了讓 UI 系統更具擴展性,所做的改動幅度相當大。

4. Item Box → Item View / Attribute Box → Attribute View

Item Box、Attribute Box 等元件現在統一改名為 Item View、Attribute View 等。View 系列元件用來顯示特定物件,通常(但非必要)位於 View Slot(如 Item View Slot)中,View Slot 是一種自訂的 Selectable,可偵測點擊、拖曳、選取等互動事件。

5. 元件序列化結構異動

系統現在使用一些方便的結構體(Struct)來序列化資料庫中的物件,讓系統在物件不屬於正確資料庫時可以自動替換。這些結構體包括 Dynamic Item CategoryDynamic CurrencyDynamic Crafting Recipe 等。

由於此項變更,所有在 Inspector 中設定的類別都必須重新指派,包括:Item Slot Set、Category Item Actions、Category Item View Set 等。

6. Category Item Actions → Item Action Set

為避免 Category Item Actions 和 Category Item Action Sets 之間的混淆,Category Item Actions 已更名為 Item Action Set

提示 如果你希望每個 Item(Definition)都有不同的 Item Actions,而不是以 Item Category 為單位,可以將 Item Action Set 作為物品的一個屬性來使用。

7. Equipper & Usable Equipped Items Handler

Equipper 不再負責「使用」物品,它只負責在視覺上裝備物品。Usable Equipped Items Handler 是負責監聽 Inventory Input 事件以使用 Item Object Behaviours 的元件。將此元件加在 Equipper 旁邊,並參照 Item User 即可。

8. 其他改名項目

舊名稱新名稱說明
Item Object ActionItem Object Behaviour更名以避免與 Item Actions 混淆
Usable Item ObjectItem Object Behaviour Handler改用組合(Composite)關係取代繼承
Item Pickup Visual ListenerItem Object View改為依賴 Item Object 事件;也支援在 Item Object 上設定 World Canvas UI 的 Item View

9. 使用新功能的 API 範例

版本 1.1 提供了全新的 API,可透過 Inventory System Manager 取得 Inventory 和 Display Panel Manager:

// 透過 Inventory Identifier 取得 Inventory(可在程式碼任意位置呼叫)
var inventory = InventorySystemManager.GetInventoryIdentifier(1).Inventory;

// 以名稱新增物品
inventory.AddItem("potion", 3);

// 取得 Display Panel Manager
var displayPanelManager = InventorySystemManager.GetDisplayPanelManager(1);

// 以名稱開啟 Display Panel
displayPanelManager.OpenPanel("Main Menu");

v1.2 版本 1.2 升級指南

版本 1.2 的改進重點在於穩定性與功能完整性,同時針對社群功能需求做了大量改進,並強化了與 Opsive Ultimate Character Controller 的整合。部分 UIS 1.1.x 的元件可能與新系統不相容。

重要 升級前請務必備份你的專案!

升級步驟

1. 移除版本 1.1.x(含 Shared 資料夾)

請將 1.1.x 版本完整移除,包含 Shared 資料夾,再匯入 1.2 版本。如果你也擁有角色控制器(Character Controllers),請同時重新安裝,因為它包含 UIS 外部的共用腳本。

2. 檢查場景與 Prefab 的遺失元件

部分腳本已被重新命名、修改或刪除,請逐一檢查你的 GameObjects 和 Prefabs。

常見錯誤:TMPro could not be found

若遇到此錯誤,請找到 Shared 資料夾和 UIS 的 Assembly Definition,確認它們有參照 TextMeshPro 的 Assembly Definition(Unity.TextMeshPro)。Assembly Definition 位於:

Assets/Opsive/Shared/Opsive.Shared
Assets/Opsive/UltimateInventorySystem/Scripts/Opsive.UltimateInventorySystem

1.2 版主要新功能

功能範例場景(Feature Demo Scenes)
新增了多個精簡的示範場景,詳細解說特定功能,是社群最期待的功能之一,有助於更直觀地理解各項系統的用法。
CSV 匯入 / 匯出(CSV Import Export)
現在可以將庫存系統資料庫匯入和匯出為 CSV 檔案。雖然有一些限制,但對於喜歡以表格格式管理物品資料的開發者非常實用,也適合從其他庫存系統遷移時使用。
音效管理器(Audio Manager)
Audio Manager 已全面重寫,現在是 UIS 與 Character Controllers 之間的共用功能。新的 Audio Config ScriptableObject 可讓你定義音效清單、Audio Mixer、音量、音調等,並支援固定值或隨機值。也可以擴展 Audio Manager Module 以使用自訂或第三方音效系統。
存檔 Metadata(Save Meta Data)
存檔系統現在支援 Metadata,可以擴展以加入遊戲時間、玩家進度等自訂資訊,並在 Save Views 中顯示。

1.2 版潛在的破壞性變更

函式重新命名

舊名稱新名稱影響範圍
AddItemConditionCanAddItemInventory、Item Collection、Restriction 類別
RemoveItemConditionCanRemoveItemInventory、Item Collection、Restriction 類別

腳本移除 / 重新命名

  • Audio Manager:現為 UIS 和 Character Controllers 的共用檔案,功能更強大。
  • FixedSizeItemCollection:已移除,改用 Item Restriction Object 來限制庫存或 Item Collection 中的物品數量。

編輯器視窗(Editor Window)

規劃你的資料庫

在建立任何庫存物件之前,建議先思考好如何組織庫存。首先要考慮的是 Item Categories——它是最重要的庫存物件,決定了資料庫的結構、所有物品的屬性,以及每種物品可執行的動作。

確定好 Categories 之後,下一步是建立 Item Definitions——物品的模板。Item Definition 定義了所有同定義物品實例共享的屬性,不同實例可以有不同的屬性值。

新增物件

建立資料庫時,系統會自動給予一個 Uncategorized 的 Item Category 和 Crafting Category,這兩個不能被刪除。在編輯器中建立的 Item Definitions 如果尚未設定 Category,會先被歸入 Uncategorized,Crafting Recipes 也同理。

在各自的編輯器頁面中,於「Add」按鈕旁的欄位輸入名稱即可新增物件。搜尋列和排序功能可以幫助你快速找到物件。在物件建立後,它會以 ScriptableObject 的形式儲存,並在資料庫中保留參照。大多數相關物件(例如 Item Definition 和其 Item Category)會互相持有對方的參照。

刪除物件

刪除物件可能產生連鎖影響,以下說明各種情況:

刪除 Item Category

  • 被刪除類別與子類別之間的連結會斷開,若有父類別則父類別會直接連接子類別。
  • 子類別會保留被刪除類別所「要求」的屬性。
  • 直接屬於被刪除類別的 Item Definitions,會被改為歸屬於其子類別或父類別;若兩者皆不存在,則歸入 Uncategorized。
  • 若在執行期間刪除類別,所有屬於該類別的 Item Definitions 和 Items 都會被取消註冊。

刪除 Item Definition

  • 被刪除定義與其子定義之間的連結會斷開,子定義會改為以被刪除定義的父定義作為新的父定義。
  • 若在執行期間刪除,所有屬於該 Item Definition 的 Items 都會被取消註冊。

刪除 Item

刪除 Item 不需要額外清理,Item Categories 和 Item Definitions 不依賴 Item。若有 MonoBehaviour 依賴該 Item,Item Object 元件會在物品移除前觸發事件函式,讓額外的清理邏輯得以執行。

搜尋、篩選與排序

物件清單面板提供搜尋列,支援排序下拉選單和篩選預設。除了名稱搜尋,Item Category 還支援以下特殊搜尋 Token:

Token說明
c:<categoryName>篩選所有以指定類別為直接父類別的 Category
i:<categoryName>篩選所有繼承自指定類別(包含間接祖先)的 Category
a:<AttributeName>篩選所有擁有指定屬性名稱的 Category
提示:善用 SearchFilterPreset 若你經常使用相同的搜尋條件,可以建立 SearchFilterPreset。在搜尋列右側按 + 按鈕建立後加入搜尋欄,每次開啟 Editor Window 都會自動套用,非常適合管理以「平面清單」顯示的大量物件。

進階篩選:自訂 SearchFilterPreset

繼承 SearchableListFilterPreset 類別並覆寫 IsValid 方法,即可建立自訂的進階搜尋條件:

/// <summary>
/// 用於可搜尋清單的篩選與排序預設物件
/// </summary>
public class SearchableListFilterPreset : ScriptableObject
{
    [Tooltip("預設搜尋字串。")]
    [SerializeField] protected string m_SearchString;

    [Tooltip("預設排序選項(以索引表示)。")]
    [SerializeField] protected int m_SortOptionIndex;

    public string SearchString {
        get => m_SearchString;
        set => m_SearchString = value;
    }
    public int SortOptionIndex {
        get => m_SortOptionIndex;
        set => m_SortOptionIndex = value;
    }

    /// <summary>
    /// 回傳物件是否符合條件(字串搜尋另行處理)。
    /// 可覆寫此函式以建立進階篩選條件。
    /// </summary>
    public virtual bool IsValid(object obj)
    {
        return true;
    }
}

屬性編輯器(Attributes)

屬性(Attributes)是以唯一名稱定義值的物件,可以在 Item Categories、Item Definitions 和 Items 上設定不同的屬性值。屬性只能從 Item Category 中建立,建立後會向下傳遞給屬於該類別的所有 Item Definitions 和 Items。

可以把 Item Category 的屬性定義想成「變數宣告」,而 Item Definitions 和 Items 上的屬性則是「取得或設定這個變數的值」。

屬性列表欄位說明

屬性列表顯示每個屬性的名稱、型別和數值(模型、Prefab、Sprite 以外的值以文字呈現)。屬性名稱旁有兩個顏色方塊:

  • 左方色塊:表示屬性的來源 Category,點擊可跳轉至該類別。
  • 右方色塊:顯示屬性繼承自哪個物件,方塊中的字母表示繼承來源類型:
字母繼承來源
CItem Category
SSource(來源 Category)
IDefault Item
DItem Definition

Item Category 編輯器中可修改的屬性選項

屬性說明
Name 屬性名稱,在該 Item Category 中必須唯一,須以字母開頭,只能包含字母、數字和底線。
Type 屬性所代表的物件類型。建立後可透過 Type 下拉選單更改,系統會建立對應的泛型屬性 Attribute<T>。若選擇自訂屬性類型則不會是泛型。
可透過 Tools → Opsive → Unit Options 新增自訂類型到下拉選單。
Variant Inherit:值由父層屬性決定。
Override:值由自訂指定值決定。
Modify:值由公式計算決定(詳見 Modify Variant 文件)。
Pre-evaluate (從屬性視圖右上角齒輪按鈕開啟)開啟後,屬性值會被快取,不會在每次存取時重新計算。對 Modify 類型的屬性最明顯。
Move To (從齒輪按鈕開啟)可以輕鬆在三個屬性集合之間移動屬性。從 Item Definition 或 Item 移往 Item Category 時,非 Item Category 屬性值將遺失;反方向移動則會保留所有子項目的值。

物品類別編輯器(Item Category)

Item Category 編輯器分為三個區塊:屬性(Properties)屬性設定(Attributes)、以及關聯關係(Relationships)

搜尋 Token

同 Editor Window 的搜尋功能,Item Category 支援 c:i:a: 三種前綴 Token 進行搜尋。

Properties(屬性設定)

屬性說明
Name 類別名稱,同時代表 ScriptableObject 的檔案名稱,必須唯一。
Mutable 設為 Mutable 後,直屬此類別的 Items 的屬性值可在執行期間變更。設為 Immutable 可確保物品建立後不會改變,同時透過共用物品實例來節省記憶體。
Unique 設為 Unique 後,直屬此類別的 Items 在預設 Item Collection 中不會自動堆疊。Common(非 Unique)且 Mutable 的物品合併時可能遺失屬性值,請特別注意。
Abstract Abstract 類別不會出現在 Item Definitions 的類別選擇清單中,主要用於整理和組織資料庫結構。
Editor Color 在編輯器中顯示的類別顏色,純粹用於視覺化管理物件清單。
Editor Icon 在編輯器中顯示的圖示。若未指定,會使用名稱為 "CategoryIcon" 的屬性。
Parents Item Category 支援多個父類別和多個子類別。不能將自己的後代設為父類別(避免循環)。父類別的屬性名稱不能重疊(相同名稱但不同型別);若相同名稱且相同型別,第一個父類別的屬性會被優先使用。

Attributes(屬性集合)

Item Category 有三個屬性 Tab:

Item Category 屬性 Tab
只被 Item Categories 繼承。適合放置與類別本身相關的值,或所有該類別物品共享的值,例如類別圖示(Category Icon)。
Item Definition 屬性 Tab
被 Item Categories 和 Item Definitions 繼承。適合放置各 Item Definition 專屬的值,例如每個物品自己的圖示(Icon)或說明(Description)。
Item 屬性 Tab
被 Item Categories 和 Items 繼承。Item Definitions 的「Default Item」可用來在編輯器中設定 Item 屬性的預設值。Item 屬性是物品實例專屬的,例如耐久度(Durability)或物品格位(Item Slots)。由於只有 Mutable Item 可在執行期間修改 Item 屬性,通常只有 Mutable Item Category 才需要設定 Item 屬性。
新增 / 刪除屬性 只有在 Item Category 編輯器中才能新增和刪除屬性。按 + 新增,選取後按 - 刪除,系統會詢問你是要只移除此 Category 及其父類別的屬性,還是同時移除其子類別的屬性。

Relationships(關聯關係)

Relationships 視圖顯示與目前 Item Category 相關的物件清單,點擊名稱前的顏色方塊即可跳轉。包含以下 Tab:

  • Ancestors(祖先類別)
  • Descendants(後代類別)
  • Direct Item Definitions(直屬 Item Definitions)
  • Inherited Item Definitions(繼承的 Item Definitions)
  • Direct Recipes(直接合成配方)
  • Inherited Recipes(繼承的合成配方)

物品定義編輯器(Item Definition)

Item Definition 編輯器同樣分為三個區塊:Properties、Attributes 和 Relationships。

搜尋 Token

Token說明
a:<AttributeName>篩選所有擁有指定屬性名稱的 Item Definition
c:<ItemCategoryName>篩選所有繼承指定類別的 Item Definition
右鍵選單 在清單中的 Item Definition 上按右鍵,可以使用 Duplicate(複製定義,適合建立相似物品)和 Create Recipe(以此物品為輸出自動建立合成配方)兩個快捷動作。

Properties

屬性說明
Name Item Definition 名稱,同時代表 ScriptableObject 檔案名稱,必須唯一。
Item Category 此 Item Definition 所屬的 Item Category。新建時預設為 Uncategorized。設定 Category 後,所有屬性才會被建立。更換 Category 時,若屬性不匹配會被移除。
Parent 父 Item Definition,必須與目前的 Item Definition 屬於相同的 Item Category。設定父定義後,屬性值會改為從父定義繼承,而非直接從 Item Category 繼承,非常適合快速建立物品變體。
Editor Icon 在編輯器中顯示的圖示。若未指定,會使用名稱為 "Icon" 的屬性。

Attributes

可以分別為 Item Definition 和其 Default Item 設定屬性值。Default Item 是所有以此定義建立的物品實例的模板;若物品是 Mutable 的,執行期間建立時會複製 Default Item。

Relationships

包含以下 Tab:Item Categories、Ancestors、Descendants、Direct Recipes、Inherited Recipes。

合成類別(Crafting Category)

Crafting Category 的目的是組織合成配方,並設定配方的類型。直屬於某個 Crafting Category 的所有配方,都必須在編輯器中定義配方類型(Type),且該類型必須繼承自基礎 Crafting Recipe 類型。

Crafting Category 編輯器分為兩個區塊:Properties 和 Relationships。

Properties

屬性說明
Name類別名稱,同時為 ScriptableObject 檔案名稱,必須唯一。
AbstractAbstract 類別不會出現在 Crafting Recipes 的類別選擇清單中,僅用於組織整理。
Color僅用於編輯器視覺化管理。
Recipe Type處理配方時使用的 Crafting Recipe 類型,允許你定義客製化的合成輸出邏輯。
Parents支援多父多子,規則同 Item Category(不能循環,屬性名稱不重疊)。
Editor Color / Editor Icon同 Item Category 的編輯器視覺設定。

Relationships

包含:Ancestors、Descendants、Direct Crafting Recipes、Inherited Crafting Recipes。

合成配方(Crafting Recipe)

Crafting Recipe 定義了合成所需的輸入材料與輸出結果。編輯器分為四個區塊:Properties、配方材料/輸出/其他設定、視覺化顯示圖,以及 Relationships。

搜尋 Token

Token說明
c:<CraftingCategoryName>篩選繼承指定 Crafting Category 的配方
右鍵選單 在配方清單上右鍵可選擇 Duplicate 快速複製配方。

Properties

屬性說明
Name配方名稱,同時為 ScriptableObject 檔案名稱,必須唯一。
Category配方所屬的 Crafting Category。更換 Category 時,配方會轉換為新的 Recipe Type,之前的部分值可能遺失。
Editor Icon在編輯器中顯示的圖示。

Recipe Definition 三個 Tab

Ingredients Tab(材料)
設定合成所需材料。基礎配方類型支援選擇 Item Category、Item Definition 或 Item 作為材料。若使用基礎合成處理器(Basic Crafting Processor),建議使用 Item Definition 作為材料。選用其他 Recipe Type 時可能出現額外選項(例如貨幣 Tab)。
Outputs Tab(輸出)
設定合成結果。通常為一個物品,但為了靈活性可設定為物品清單。輸出的具體選項依據選用的 Recipe Type 而定。
Other Tab(其他)
用於編輯自訂 Recipe Type 上的屬性,所有序列化欄位都會在此顯示。

Visual Diagram(視覺化圖)

配方的結果會在 Recipe Definition 區塊下方以視覺化圖呈現,並隨著編輯即時更新,讓你一眼看清完整配方。

貨幣編輯器(Currency)

貨幣可以用於與其他物件的交換。單一貨幣本身功能有限,但透過巢狀嵌套並設定兌換率,可以輕鬆建立多幣種系統(例如金幣 = 100 銀幣 = 10,000 銅幣)。

Properties

屬性說明
Name貨幣名稱,必須唯一。
Icon貨幣的代表圖示,編輯器和執行期間都會使用。
Base Currency此貨幣由哪種貨幣組成(通常是比本貨幣價值更低的貨幣)。
Base Exchange Rate等同於本貨幣一單位的基礎貨幣數量。
Max AmountCurrency Collection 中此貨幣的最大持有數量。
Overflow Currency當本貨幣超過 Max Amount 時,超出部分會自動轉換為這個更高價值的貨幣。
Fraction Currency當本貨幣出現小數時,小數部分會以這個更低價值的貨幣表示。
貨幣家族(Currency Family) 在關聯關係框中可以看到同一貨幣家族的關係圖。貨幣家族的成員須共享同一個根貨幣(Source Currency)。點擊貨幣圖示可跳轉至該貨幣頁面,關係元素也顯示每種貨幣的兌換率,以及哪個是 Root、Base、Overflow 和 Fraction。

UI Designer

UI Designer 是用來建立所有與 UIS 相關的 UI 介面的工具。它的目標是讓開發者只需幾次點擊,就能在編輯器中建立出風格獨特的庫存 UI,這一切都要歸功於 UI Designer Schemas——一種儲存了建立 UI 所需 Prefab 和資產集合的 ScriptableObject。

UI 系統是獨立的 庫存系統本身與 UI 是解耦的,你可以選擇完全不使用內建的 UI 元件,改用自己的或第三方 UI 解決方案。

入門步驟

前置條件 使用 UI Designer 之前,請先在 Main Manager 的 Setup Tab 中設定好你要使用的 Inventory Database 並加入參照。
  1. 前往 Tools → Opsive → Ultimate Inventory System → UI Designer 開啟 UI Designer。
  2. 在 Setup Tab 的「Create Canvas Managers」下,點選 「Setup」 生成 Canvas 和 Display Panel Manager。
  3. 在「UI Designer Schema」區塊選擇喜歡的 Schema,按 「Duplicate」 進行複製。未複製時無法使用 UI Designer。
  4. 複製後按大型的 「Spawn In Scene」 按鈕,快速在場景中生成基本選單。
  5. 之後各個 Tab 都會解鎖,可以用來建立、尋找和編輯 UI。
提示 大多數 UI Designer 子選單的右上角都有 問號(?)放大鏡(🔍) 圖示,分別可跳轉至相關文件和在場景層級中選取對應元件。

Create 與 Edit 區塊

大多數 Tab 分為兩個部分:

  • Create:必須指定 Parent Transform(UI 生成的位置),以及一些決定使用哪些 Prefab / 資產的選項。
  • Edit:提供「Find Available Targets in Scene」按鈕,也可拖曳元件到欄位中選取目標。選定目標後,會顯示 UI 的資訊與編輯選項。

各 UI 元件概覽

Main Menu

Main Menu 是一個可包含子面板的元件,由 Display Panel Manager 管理,可輕鬆開啟和關閉。在建立 Inventory Grid、Save Menu、Crafting Menu 等面板時,選擇「Main Menu」Panel Option 即可將其設為 Main Menu 的子面板。

Inventory Grid(庫存格)

用來顯示庫存內容,可以顯示清單(List)或格狀(Grid)排列。建立時的可選選項:

選項說明
Parent TransformInventory Grid 生成的位置。
Panel OptionBasic(簡單矩形)、Simple(帶標題欄)、Floating(可拖曳移動)、Main Menu(嵌入 Main Menu)。
Inventory指定此 Grid 監視的 Inventory。
Grid OptionsGrid(格狀)或 List(單列 + 捲軸)。
Grid Size & Layout Group格子大小與 Layout Group,需正確設定以定義格子的方向軸。Layout Group Navigation 用來設定相鄰元件的導航。
Grid Navigation當物品數量超過格子容量時,用來捲動、分頁或分 Tab 顯示,支援滑鼠和鍵盤/控制器。
Filters & Sorters可加入預設篩選器、搜尋列(輸入即篩選)和排序下拉選單。
Grid Tabs由 Tab Controller 和 Tab Toggles 控制,每個 Tab 可設定不同的篩選器。

Item Shape Grid

讓物品在有限格子中佔用多個格位(類似《暗黑破壞神》風格的背包)。由 Item Shape Grid Controller & Data 管理,與一般 Inventory Grid 運作方式完全不同。Item Views 必須包含特定 Item View Modules 才能正確顯示。

Equipment(裝備面板)

使用 Item Slot Collection View 建立,每個裝備槽對應 Item Slot Set 中的一個 Slot,可設定各槽位只允許特定 Item Category 的物品放入。

Item Hotbar(物品快捷列)

以方便存取的方式顯示物品,支援 Item Actions 輸入觸發和拖放操作。

Shop(商店)

用於買賣物品的 UI。UI Designer 允許直接在 Shop Menu 上加入 Shop 元件、顯示商品的 Inventory Grid、顯示完整價格的 Multi Currency View,以及數量選擇器(Quantity Picker)。

Crafting(合成)

作為使用 Crafter 元件合成物品的介面。UI Designer 可以建立含配方格子(Recipe Grid)的合成選單,並支援網格大小、版面、導航和 Tab 的編輯。

建議 Crafting Menu 是官方提供的一種解決方案,強烈建議透過擴展 Crafter 或 Crafting Processor 來建立客製化合成邏輯,並配套設計自訂的 Crafting Menu。

Save(存檔)

由於大多數專案會使用自訂存檔方案,官方的 Save Menu 設計簡單基本。UI Designer 可以找到場景中所有 Saver 元件,顯示目前哪些內容會被存取,也可編輯格子大小、版面和導航。

Storage(倉庫)

用於在兩個 Inventory(通常是玩家與倉庫)之間互相移動物品的介面。

常見警告 使用 UI Designer 建立 Storage Menu 時,可能出現「Some of the categories referenced on the item info category filter do not reference the right database.」警告。點擊各警告找到造成問題的 Tab Filter,替換為正確資料庫的 Category 即可。

Chest(寶箱)

最快的方式是直接從 Demo 資料夾生成「Chest」Prefab。玩家透過 Inventory Interactor 和 Interactable 元件與寶箱互動時,Chest Menu 會自動開啟並綁定至該寶箱。

Item Description(物品說明)

Item Description 是一種特殊的 Item View,專門用來顯示物品的詳細說明。UI Designer 提供多個說明模板,並可加入或移除 Item View Modules,以及將 Item Description 綁定至某個 Item View Slots Container(顯示目前選取物品的說明)。

Currency(貨幣顯示)

使用 Multi Currency View 顯示貨幣,將 Currency 對應至 Currency View。設定 Currency Amount 或 Currency Collection 後,會顯示每種貨幣的數量。Currency Designer Tab 可從 Schema 模板建立 Multi Currency Views、Currency Views 和 Currency Owner Monitors。

Inventory Monitor

當物品被加入 Inventory 時,Inventory Monitor 會在螢幕上彈出 Item Views 顯示通知。UI Designer 會直接建立一個 Inventory Monitor 元件。

Item View & Attribute View

Item View 搭配 Item View Modules 顯示物品;Attribute View 搭配 Attribute View Modules 顯示屬性值。建立後可在 UI Designer 中新增或移除 Modules。自訂 Module 繼承對應的基礎類別後,會自動出現在下拉清單中。

Item View Slots Container(共用功能)

Inventory Grid、Item Hotbar 和 Equipment 面板都基於 Item View Slots Container,共享以下功能:Item View Drawer、Item Actions、Item Moving(拖放)、Item Description 綁定等。

  • Item View Drawer:依 Item Category 對應至 Item View Prefab,決定每個物品用哪種 View 顯示。使用 Item View Slots 時需開啟「Use View Slots」選項,並設定 Content Transform。
  • Item Actions:可以在 Item View Slot Container 上加入 Item Actions,當點擊或透過程式碼觸發時執行對應動作。提供 Category Item Action SetCategory Item Actions 兩種設定方式。
  • Moving Items(拖放):系統分為 Cursor Manager(生成移動中的 Item View)、Drop Handler(定義放下時的動作)、Drag Handler(追蹤拖曳的起源)、Move Cursor(無滑鼠時移動物品)四個元件。

UI Designer Schemas

UI Designer Schemas 是 Prefab 和資產的集合,可以像樂高積木一樣組合起來建立 UI。

完全選用 使用 Schemas 是完全可選的,它只是加速建立基礎功能的起點。你可以在此基礎上自由修改,也可以完全忽略 Schemas 手動建立 UI。

目前提供兩種官方 Schema:

Classic Schema
極簡風格,具有大圖示和大按鈕,靈感來自《薩爾達傳說:曠野之息》。非常適合快速入門,範例場景即採用此 Schema。包含:Inventory Grid、Inventory List、Item Shape Grid、Item Hotbar、Shop Menu、Crafting Menu、Save Menu、Item Description、Multi Currency View 等。
RPG Schema
卡通冒險風格,聚焦於浮動面板和 Item Shape Grid。融合了 PC 和手機遊戲的設計風格,主要適合滑鼠 + 鍵盤或觸控輸入。包含:Inventory Grid、Inventory List、Item Shape Grid、Equipment(Item Slot Collection View)、Item Hotbar、Shop Menu、Crafting Menu、Save Menu、Item Description、Multi Currency View 等。
建立並分享自訂 Schema 你可以建立並分享自己的 UI Designer Schema,只需確保每個 Prefab 符合 Schema 的結構限制即可。

匯入與匯出(Import & Export)

Import / Export 系統允許你匯入和匯出庫存系統資料庫的部分內容。這個功能的目的是修改現有資料庫,而不是建立新資料庫。適合快速批量新增物品,或在 Unity 之外以可讀格式維護物品資料表。

功能限制 Import / Export 的能力有限。Unity Objects、自訂 Recipes 和大部分的 Attributes 都不支援匯出為可讀格式。不可用此功能備份資料庫,請使用版本控制或正式備份方案。

預設使用 CSV Import Export Module,可自訂欄位 Key 和格式。Import Export Module 是 ScriptableObject,建議在頻繁使用前先複製一份,以免更新資產時設定被覆蓋。

支援匯入/匯出的物件包含:Item Categories、Item Definitions、Crafting Categories、Crafting Recipes、Currency。

匯入行為 匯入時,資料庫中現有的物件不會被刪除。若 CSV 中的物件不存在則新增,若已存在則更新差異資料。匯入時除主要 Key(ITEM CATEGORYITEMDEFINITION)和名稱 Key 以外,其他欄位皆為選填。

自訂 Import Export Module

繼承 ImportExportModule 類別即可建立自訂模組:

/// <summary>
/// Import Export Module 是用於匯入/匯出資料庫的 ScriptableObject。
/// </summary>
public abstract class ImportExportModule : ScriptableObject
{
    /// <summary>匯出庫存系統資料庫。</summary>
    public abstract void Export(InventorySystemDatabase database);

    /// <summary>匯入庫存系統資料庫。</summary>
    public abstract void Import(InventorySystemDatabase database);
}

Inventory System Manager API

Inventory System Manager 是場景中的 Singleton 元件,負責管理庫存中的所有物件。每個場景都必須包含此元件,可透過 Inventory System Manager 的 Scene Setup 加入。

取得物件

// 取得 Item Category
InventorySystemManager.GetItemCategory("Weapons");

// 取得 Item Definition
InventorySystemManager.GetItemDefinition("Big Potion");

// 取得 Currency
InventorySystemManager.GetCurrency("Gold");

執行期間建立 Item

// 以名稱建立物品
InventorySystemManager.CreateItem("ItemName");

// 以 Item Definition 建立物品
InventorySystemManager.CreateItem(itemDefinition);

// 指定 ID 建立物品(適合儲存 / 伺服器端 / 客戶端同步)
InventorySystemManager.CreateItem(itemDefinition, itemID);

// 複製一個 Item
InventorySystemManager.CreateItem(item);

取得其他管理器與組件

// 取得 Display Panel Manager
var panelManager = InventorySystemManager.GetDisplayPanelManager(id);

// 取得 Inventory Identifier(坐在 Inventory 旁邊的元件)
var inventoryIdentifier = InventorySystemManager.GetInventoryIdentifier(id);
var inventory = inventoryIdentifier.Inventory;

此網誌的熱門文章

哥利亞遙控炸彈 (Leichter Ladungsträger Goliath)

O-I(試製120t超重戰車「オイ」)