《UIS》第 1 篇 入門指南與基本概念

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

入門指南與基本概念

系統介紹

Ultimate Inventory System(UIS) 是一套專為開發者設計的 Unity 庫存框架,協助開發者快速為遊戲建立完整的物品庫存系統。系統設計上強調強大、模組化、可擴展,讓複雜的庫存結構也能快速搭建完成。

為了達到這個目標,UIS 建立了一套嚴謹且有條理的架構,透過 物品類別(Item Categories)物品定義(Item Definitions) 來組織所有物品。搭配屬性系統(Attribute System),開發者可以直接在編輯器中定義物品的各種屬性,完全不需要寫程式。再加上多層巢狀的物品類別結構,以及屬性繼承、修改與覆寫機制,便能以驚人的速度建立複雜的物品依賴關係。

除了物品管理之外,UIS 還內建了以下完整功能:

  • 物品動作(Item Actions)
  • 貨幣系統(Currencies)
  • 合成系統(Crafting)
  • 道具商店(Item Shops)
  • 裝備系統(Equipping)
  • 存檔 / 讀檔(Saving / Loading)
  • 以及更多功能…
最低 Unity 版本需求 本系統要求 Unity 2019.3 或以上版本,原因是編輯器腳本已從舊版 IMGUI 遷移至 UIElements。

入門指南

匯入套件

匯入 Ultimate Inventory System 後,你可能會看到以下錯誤訊息:

A tree couldn't be loaded because the prefab is missing.
注意 這個錯誤只會在首次匯入時出現一次,完全無害。這是 Unity 本身的已知 Bug,不影響任何功能。如果你方便的話,歡迎前往 Unity Issue Tracker 對這個 Bug 投票支持修復!

除了上述錯誤之外,你也可能看到幾個動畫相關的警告:

File 'Idle' has animation import warnings. See Import Messages in Animation Import Settings for more details.

這是因為動畫檔案是在 Blender 中製作的,而 Unity 對 Blender 匯出的動畫格式有些不相容。這是一次性警告,不影響動畫的實際播放,可以安心忽略。

Demo 場景

匯入完成後,建議先開啟範例場景熟悉系統的運作方式。主要的範例場景位於:

Opsive/UltimateInventorySystem/Demo/Demo.unity

另外也有一些針對特定功能的獨立範例場景,位於:

Opsive/UltimateInventorySystem/Demo/_FeatureDemos/
提示 若想節省專案空間,Demo 資料夾可以直接刪除,庫存系統仍可正常運作。
注意 範例場景使用的資料庫名稱為 DemoInventoryDatabase。由於範例場景高度依賴這個資料庫的結構,請勿隨意修改此資料庫,否則可能導致範例場景無法正常運作。

建立庫存資料庫

瀏覽完範例場景後,建議透過以下方式建立你自己的資料庫:複製範例資料庫,或從頭建立一個全新的資料庫。資料庫可以在 Inventory Manager 編輯器的 Setup Manager 中建立,路徑為:

Tools → Opsive → Ultimate Inventory System → Main Manager
複製 Prefab 的提示 建立資料庫時會詢問是否要複製資料庫所參照的 Prefab。如果你打算重複使用範例場景中的 Prefab 資源,建議選擇複製。這樣可以確保後續更新 UIS 套件時,你所複製的 Prefab 不會被覆蓋。
資料庫路徑提示 所有在 Opsive 資料夾下建立或修改的資產,在重新匯入 UIS 套件時都可能被覆蓋。請勿在你的正式專案中直接使用原始範例的 Prefab 或 ScriptableObject
重要 若在作業系統的檔案總管中先建立資料庫的父資料夾,然後再按下「New」或「Duplicate」,可能會出現 Missing Parent Folder 錯誤。正確做法是:先在 Unity 內建立父資料夾,再按按鈕

場景設定(Scene Setup)

UIS 需要幾個 Singleton 元件才能正常運作,這些元件必須在編輯模式下加入場景。點選 Scene Setup 區塊中的 「Add Components」 按鈕即可自動加入。

系統會新增一個名為 Game 的 GameObject,其中包含 Inventory System Manager 元件,它會參照你的 Inventory Database,作為取得與建立物品的核心樞紐。

角色設定(Character Setup)

Inventory 元件可以掛載在任何 GameObject 上,不限於玩家角色。玩家角色通常會需要以下幾個額外元件:

Inventory
持有物品的核心元件。
Currency Owner
持有角色貨幣的元件。
Item User
允許角色透過 ItemActions 使用物品的元件。
Inventory Standard Input
新版輸入元件,負責處理使用物品與 UI 互動的輸入事件。
Inventory Interactor
讓場景中可互動的物件能取得庫存參照。
Inventory Identifier
將此庫存 GameObject 註冊至 Inventory System Manager,使其可從程式碼任何地方存取。
建議 建議將角色的 Tag 設為 "Player",編輯器管理器會利用此 Tag 自動填入部分欄位。

存檔設定(Save Setup)

UIS 內建存檔系統,運作方式是在你要存檔的元件旁邊加上對應的 Saver 元件,然後由 Save System Manager 統一呼叫這些 Saver 來存取資料。例如:

對應關係
InventoryInventory Saver

Currency OwnerCurrency Owner Saver

建立物品撿取模板(Create Item Object Templates)

此區塊可讓你為 2D 或 3D 遊戲建立物品撿取模板。建立後,可以編輯並存為 Prefab 以便重複使用。只需在執行階段或編輯時,在 Item Object 元件上設定對應的 Item 即可。物品撿取物件支援物件池(Object Pool)以利重複利用。

使用 UI Designer 進行 UI 設定

開啟 UI Designer Manager 開始為場景新增 UI。

  1. 在 Setup 頁籤的「Create Canvas Managers」下,點選 「Setup」,系統會自動生成 Canvas 和 Display Panel Manager。
  2. 在「UI Designer Schema」區塊選擇一個你喜歡的 Schema,並按下 「Duplicate」 進行複製。複製後才能開始使用 UI Designer。
  3. 複製完成後,按下 「Spawn In Scene」 快速在場景中生成基本選單。
  4. 之後其他頁籤也會可用,讓你建立、尋找並編輯自己的 UI。

接下來呢?

完成上述設定後,你的遊戲中已有一個完整運作的庫存系統。接下來可以:

  • 從少量的物品定義開始,逐步擴展你的 Inventory Database。
  • 在場景中透過 Inventories、Currency Owners 和 Crafters 來測試這些物品、貨幣和配方。
  • 詳細閱讀後續文件,並觀看影片教學。
  • 如有問題或功能需求,歡迎前往官方論壇尋求協助。

術語說明

UIS 是一個高度彈性的框架,可以用來建立各種類型的庫存系統。為了降低學習門檻,系統設計了清楚的工作流程與規範。以下是系統中各核心元件的說明:

屬性(Attributes)

屬性廣泛應用於整個系統中。屬性可以對另一個屬性進行「覆寫」、「繼承」或「修改」,用來建立 Item Definitions 的變體,大幅加速迭代效率。

三種變體類型:

Override(覆寫)
完全取代父層屬性的數值。
Inherit(繼承)
直接沿用父層屬性的數值。
Modify(修改)
使用表達式計算出依賴父層屬性或同一集合中其他屬性的值。這個功能極為強大,讓非程式設計師也能在物品上加入簡單邏輯。更複雜的計算邏輯應使用 Item Actions。
Modify 表達式範例
myAttribute2 = "[myAttriute1] * 20 + <Inherit>"
三種變體的實際數值比較(父層 HealAmount: 5)
HealAmount (override 10) → 10
HealAmount (inherit) → 5
HealAmount (modify "<Inherit>*3") → 15

物品類別(Item Category)

物品類別用來有條理地組織你的物品。同一類別下的所有物品都擁有相同的屬性定義,但各自的數值可以不同。這確保對同一類別中的任何物品都能執行相同的動作。類別可以巢狀嵌套,支援多個子類別和父類別。

設定為 Mutable(可變)的類別,其所有子物品的屬性值都可以在執行期間修改。

類別巢狀範例
Equippable
OneHanded
Weapon : Equippable
OneHandedWeapon : Weapon, OneHanded
Dagger : OneHandedWeapon
Sword : OneHandedWeapon

物品定義(Item Definition)

物品定義可以想像成物品的「模板」或「模具」。Item Definition 中定義的屬性,會在所有以此定義建立的物品實例之間共享。它也包含一個「預設物品(Default Item)」的參照,作為建立其他物品實例的基礎。

Item Definition 繼承範例
HealPotion (HealAmount: 10, CoolDown: 2)
↳ SmallHealPotion (HealAmount Override 6 → 6, CoolDown Inherit → 2)
↳ BigHealPotion (HealAmount Modify "<Inherit>*2.5" → 25, CoolDown Override 3 → 3)

物品(Item)

物品在執行期間從 Item Definition 建立而來,可以擁有與其他物品不同的屬性值。如果物品屬於 Mutable 的 Item Category,其屬性值甚至可以在執行期間即時修改。物品本身不包含任何「物品邏輯」,它只是一組純資料。系統會根據物品所屬的 Item Category、Item Definition 和屬性值來決定可以對它執行哪些動作。物品分為 Mutable(可變)Immutable(不可變)兩種。

物品動作(Item Action)

物品動作包含了可以對特定類別物品執行的邏輯。例如「使用(Consume)」動作可以對「Consumable(消耗品)」類別的任何物品執行;「裝備(Equip)」動作則可以對「Equippable(可裝備)」類別的物品執行。這些動作是遊戲專屬的,可以在範例場景中看到示範。Item Actions 設計上鼓勵開發者加以擴展,以充分發揮其潛力。

物品動作集(Item Action Set)

Item Action Sets 是一種 ScriptableObject,可將多個 Item Actions 按 Item Category 分組。它非常實用,可以加入大多數包含物品的 UI 元件中。

物品物件(Item Object)

Item Object 是一個 MonoBehaviour,用來將 Item 與 GameObject 綁定。對於需要裝備、撿取/丟棄,或在場景中有實體存在的物品來說非常有用。

物品物件行為(Item Object Behaviour)

Item Object Behaviours 是可以附加到 Item Object 上的元件,讓你為物品加入場景互動邏輯,例如用「劍」攻擊,或用「槍」開火、換彈。有了在場景中的實體存在,也可以偵測觸發/碰撞事件,或從槍管位置生成子彈。

貨幣(Currency)

貨幣是一種抽象物件,可以用來與其他物件進行交換。

合成配方(Crafting Recipe)

合成配方定義了將一個或多個物件組合成新物品所需的輸入與輸出。Crafting Recipe 與 Crafting Processor 搭配運作,執行將一組物件轉換為另一組物件的邏輯。

庫存(Inventory)

庫存是多個 Item Collections 的集合。每個 Item Collection 可以對進出的物品設置不同限制。將庫存拆分成不同區塊是很好的組織方式。例如,常見的做法是建立兩個 Item Collections:一個放已裝備的物品,另一個放未裝備的物品。

物品集合(Item Collection)

Item Collections 包含一組物品,物品以 Item Stack(物品堆疊)的形式儲存。當物品被加入、移除時,Item Collection 會向 Inventory 發送事件通知。

物品堆疊(Item Stack)

Item Stack 是一個儲存特定數量物品的物件,例如「5 顆蘋果」。Item Stack 應僅存在於 Item Collection 中,不應與 Item Amount 混淆(Item Amount 可以存在於 Collection 之外)。

物品數量(Item Amount)

Item Amount 是一個包含物品及其數量的簡單結構,不需要與 Item Collection 綁定,不應與 Item Stack 混淆。

物品資訊(Item Info)

Item Info 提供更詳細的物品來源資訊,不只包含 Item Amount,還有對應的 Item Stack 和 Item Collection 的參照。這在需要指定從特定 Stack 取出特定數量物品時非常有用。

庫存系統資料庫(Inventory System Database)

這是在編輯器中建立的資產檔案,用來儲存專案中所有的 Item Categories、Item Definitions、Currencies、Crafting Categories 和 Crafting Recipes,統稱為 Inventory System Objects。資料庫是純粹的資料容器,在遊戲啟動時由 Inventory System Manager 載入。

庫存系統管理器(Inventory System Manager)

Inventory System Manager 是極為重要的元件,負責管理專案中所有的 Item、Item Definition、Item Category、Currency、Crafting Category 和 Crafting Recipe。遊戲啟動時,它會載入 Inventory System Database,並取得所有已註冊的庫存系統物件的參照。它也負責確保只有有效的物件才能被註冊,並提供便捷的方法,以 ID 或名稱查詢物件,以及在執行期間建立新的 Items。

Demo 場景

第一次使用 UIS 時,強烈建議先在範例場景中探索,熟悉系統的各項功能。範例場景需要 TextMesh Pro,如尚未安裝,請透過 Unity Package Manager 安裝。

範例場景分為兩個區域:

  • 村莊(Village):玩家可以在這裡進行買賣、存放物品、升級和合成。
  • 森林(Forest):玩家可以使用物品與強盜戰鬥並獲取戰利品。
注意 範例場景中的角色腳本並非 UIS 核心框架的一部分,不應在範例場景以外使用。Character Stats、Item Upgrade Menu 和 Gate 等物件也是範例專屬的。

可以透過以下路徑編輯範例資料庫:

Tools → Opsive → Ultimate Inventory System → Main Menu

建議一開始先自行建立幾個 Item Definitions,感受一下物品在場景中是如何被參照和使用的。

所有選單都在 Inventory System Canvas GameObject 下。大部分世界物件(如商店和合成台)位於 World → Static Interactables。Display Panel Manager 在 Inventory System Canvas 上,可以指定遊戲中的 Play 和 Main Menu 面板。

UI 客製化

UIS 的 UI 系統大量依賴 Prefab 和 ScriptableObject 來顯示動態內容,讓你可以輕鬆替換成自己的 UI 設計。最佳入門方式是先透過編輯器中的 UI Designer 將 UI 加入場景。

Inventory Grid & List

Inventory Grid 和 List 元件讓你自訂物品的顯示方式,更多資訊請參閱 Inventory Grid 頁面。

Item Shape Grid

Item Shape Grid 元件讓每個物品可以在格子中佔用多個格位(如 RPG 遊戲中的不規則物品格),更多資訊請參閱 Item Shape Grid 頁面。

Item Action Set & Category Item Action Sets

UI 系統允許你自訂從庫存 UI 對物品可執行的動作,系統會根據 Item Category 取得對應的動作和 Prefab。Item Actions 頁面有更詳細的設定說明。

Item View(Modules)& Category Item View Sets

Category Item View Set ScriptableObject 可以用來修改物品的顯示方式。新的 View Set 可以在專案視窗的選單中建立:

Create → Ultimate Inventory System → UI → Category Item View Set

Item View Drawer

Category Item View Set 可以在 Item View Drawer 元件中被參照,而 Item View Drawer 則由 Inventory Grid / List 元件使用。

Item Description & Attribute View(Modules)

當選取庫存中的物品時,可以顯示包含物品資訊和屬性的說明面板。這些元件的客製化方式與 Item Views 類似,詳情請參閱 Item Description 和 Attribute Views 頁面。

新建資料庫

新的 Inventory System Database 可以在 Inventory Manager 編輯器的 Setup Manager 中建立:

Tools → Opsive → Ultimate Inventory System → Main Manager
重要 若在作業系統的檔案總管中建立資料庫的父資料夾,然後才按「New」,可能會出現 Missing Parent Folder 錯誤。請先在 Unity 內建立好父資料夾,再按按鈕。

從頭建立資料庫時,系統會預設包含一個「All」Item Category,並附帶兩個 Item Definition 屬性:IconDescription。這兩個屬性是最常用的,你可以自行重新命名或刪除這個 Item Category。

建議先新增你預計會用到的幾個 Item Categories,例如:

  • 功能性分類ConsumableEquippableDroppable
  • 類型性分類FoodWeaponMaterial(可繼承「All」及部分功能性分類)
  • 細節分類One-Hand WeaponSwordKnife(用來區分同一父類別下的物品)
武器分類架構範例
Item Categories: All, Weapon, Droppable, Melee Weapon, Ranged Weapon

繼承關係:
Weapon 的父類別為 AllDroppable
Melee WeaponRanged WeaponWeapon 的子類別

屬性配置建議:
AllIcon(Item Definition 屬性)、Description(Item Definition 屬性)
DroppableDropPrefab(Item Definition 屬性)
WeaponWeaponPrefabAttack(Item Definition 屬性)
Ranged WeaponClip Size(Item Definition 屬性)、Clip Remaining(Item 屬性)
提示 以上只是示例,你可以完全依照自己遊戲的需求來組織類別和屬性結構。重點是在正確的層級定義屬性。

定義屬性

建立資料庫時,良好的屬性規劃非常重要。以下說明各種屬性應如何正確配置。

Item Category 的設定

Item Category 定義了物品「能做什麼」和「不能做什麼」。屬於某個類別的所有物品,都會繼承所有父類別的屬性。

可變性(Mutability)與唯一性(Uniqueness)

Category 還定義了其直屬物品的可變性與唯一性:

  • Mutability:定義物品的屬性值是否可在執行期間修改。
  • Unique:定義物品是否在可能的情況下自動疊加堆疊。請注意,Mutable 且 Common(非 Unique)的物品在堆疊時,會保留原有物品的屬性值。
Immutable & Common(不可變 + 一般)
建立後不會改變的物品,相同定義的物品會共用同一個參照。適合木材、繩子、鋼鐵等材料類物品。
Mutable & Unique(可變 + 唯一)
每個物品都是獨立個體,有各自的 ID 和屬性值。適合鐵劍、大劍等武器類物品(可升級、具有獨立屬性)。
Immutable & Unique(不可變 + 唯一)
功能同 Immutable & Common,但物品不會在預設 Collection 中自動疊加。適合地圖鑰匙、寶箱鑰匙等關鍵道具。
Mutable & Common(可變 + 一般)
物品加入 Collection 時,會嘗試與相同定義的物品合併堆疊。適合閃光彈、碎片手榴彈等需要可變性但不需要唯一性的投擲物。
注意 可變性與唯一性的設定,只影響直屬於該類別的物品,不影響子類別的物品。

屬性應放置的位置

定義屬性時,最重要的是選擇正確的集合(Collection):

Item Category 屬性
與類別本身直接相關的屬性。該類別下的所有 Item Definitions 和 Items 都會共享同一個屬性值。例如「類別圖示(Category Icon)」。
Item Definition 屬性
同一 Item Definition 下所有物品共享的屬性,不應在執行期間變更。例如「物品圖示(Icon)」,每個不同的 Item Definition 可以有自己的圖示。
Item 屬性
可能在執行期間改變的屬性,專屬於物品個體本身。例如「耐久度(Durability)」,每次攻擊後會減少。

Item Definitions 的應用技巧

在執行期間,有時你可能需要修改屬性值,例如提升武器的攻擊力。與其直接修改屬性,更好的做法是用新的物品替換舊的物品。

武器升級定義設計範例
資料庫中定義:SwordSword +1Sword +2

升級劍時,用 Sword +1 物品替換 Sword

繼承關係:Sword → Sword +1 → Sword +2
所有屬性值由子定義自動繼承,結構清晰、易於維護。

範例說明:Sword Category(劍類別)

Sword Category 設定為 Mutable + Unique。在範例中,劍可以透過附加「強化」物品來升級。因此每把劍必須是唯一的(Unique,以防止堆疊),且可變的(Mutable,以便在執行期間修改攻擊力和附加的強化物品)。

Sword Category 有兩個 Category 屬性:

  • CategoryIcon:繼承自 Viewable 類別,定義在編輯器中顯示的圖示。
  • AnimatedID:繼承自 Animated 類別,用來決定攻擊時使用的動畫。同一類別下的所有物品都會以相同方式播放動畫。

BaseAttack 作為 Item Definition 屬性,無法在執行期間修改。AttackSlots 則設為 Item 屬性,可以在執行期間變更。Attack 預設使用 Modify 變體,複製 BaseAttack 的值,之後可再依需求調整。

範例說明:Material Category(材料類別)

Material Category 設定為 Immutable + Common。Immutable 是因為沒有需要在執行期間變更的屬性;Common 是因為材料類物品在加入庫存時應該自動疊加堆疊。

  • 只有一個 Category 屬性:CategoryIcon
  • 所有其他屬性都設為 Item Definition 屬性。
  • 不需要設置 Item 屬性,因為每個材料定義只會有一個物品實例。

此網誌的熱門文章

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

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