《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)
- 以及更多功能…
入門指南
匯入套件
匯入 Ultimate Inventory System 後,你可能會看到以下錯誤訊息:
A tree couldn't be loaded because the prefab is missing.
除了上述錯誤之外,你也可能看到幾個動畫相關的警告:
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/
DemoInventoryDatabase。由於範例場景高度依賴這個資料庫的結構,請勿隨意修改此資料庫,否則可能導致範例場景無法正常運作。
建立庫存資料庫
瀏覽完範例場景後,建議透過以下方式建立你自己的資料庫:複製範例資料庫,或從頭建立一個全新的資料庫。資料庫可以在 Inventory Manager 編輯器的 Setup Manager 中建立,路徑為:
Tools → Opsive → Ultimate Inventory System → Main Manager
Opsive 資料夾下建立或修改的資產,在重新匯入 UIS 套件時都可能被覆蓋。請勿在你的正式專案中直接使用原始範例的 Prefab 或 ScriptableObject。
Missing Parent Folder 錯誤。正確做法是:先在 Unity 內建立父資料夾,再按按鈕。
場景設定(Scene Setup)
UIS 需要幾個 Singleton 元件才能正常運作,這些元件必須在編輯模式下加入場景。點選 Scene Setup 區塊中的 「Add Components」 按鈕即可自動加入。
系統會新增一個名為 Game 的 GameObject,其中包含 Inventory System Manager 元件,它會參照你的 Inventory Database,作為取得與建立物品的核心樞紐。
角色設定(Character Setup)
Inventory 元件可以掛載在任何 GameObject 上,不限於玩家角色。玩家角色通常會需要以下幾個額外元件:
"Player",編輯器管理器會利用此 Tag 自動填入部分欄位。
存檔設定(Save Setup)
UIS 內建存檔系統,運作方式是在你要存檔的元件旁邊加上對應的 Saver 元件,然後由 Save System Manager 統一呼叫這些 Saver 來存取資料。例如:
Inventory → Inventory SaverCurrency Owner → Currency Owner Saver
建立物品撿取模板(Create Item Object Templates)
此區塊可讓你為 2D 或 3D 遊戲建立物品撿取模板。建立後,可以編輯並存為 Prefab 以便重複使用。只需在執行階段或編輯時,在 Item Object 元件上設定對應的 Item 即可。物品撿取物件支援物件池(Object Pool)以利重複利用。
使用 UI Designer 進行 UI 設定
開啟 UI Designer Manager 開始為場景新增 UI。
- 在 Setup 頁籤的「Create Canvas Managers」下,點選 「Setup」,系統會自動生成 Canvas 和 Display Panel Manager。
- 在「UI Designer Schema」區塊選擇一個你喜歡的 Schema,並按下 「Duplicate」 進行複製。複製後才能開始使用 UI Designer。
- 複製完成後,按下 「Spawn In Scene」 快速在場景中生成基本選單。
- 之後其他頁籤也會可用,讓你建立、尋找並編輯自己的 UI。
接下來呢?
完成上述設定後,你的遊戲中已有一個完整運作的庫存系統。接下來可以:
- 從少量的物品定義開始,逐步擴展你的 Inventory Database。
- 在場景中透過 Inventories、Currency Owners 和 Crafters 來測試這些物品、貨幣和配方。
- 詳細閱讀後續文件,並觀看影片教學。
- 如有問題或功能需求,歡迎前往官方論壇尋求協助。
術語說明
UIS 是一個高度彈性的框架,可以用來建立各種類型的庫存系統。為了降低學習門檻,系統設計了清楚的工作流程與規範。以下是系統中各核心元件的說明:
屬性(Attributes)
屬性廣泛應用於整個系統中。屬性可以對另一個屬性進行「覆寫」、「繼承」或「修改」,用來建立 Item Definitions 的變體,大幅加速迭代效率。
三種變體類型:
myAttribute2 = "[myAttriute1] * 20 + <Inherit>"
HealAmount (override 10) → 10HealAmount (inherit) → 5HealAmount (modify "<Inherit>*3") → 15
物品類別(Item Category)
物品類別用來有條理地組織你的物品。同一類別下的所有物品都擁有相同的屬性定義,但各自的數值可以不同。這確保對同一類別中的任何物品都能執行相同的動作。類別可以巢狀嵌套,支援多個子類別和父類別。
設定為 Mutable(可變)的類別,其所有子物品的屬性值都可以在執行期間修改。
EquippableOneHandedWeapon : EquippableOneHandedWeapon : Weapon, OneHandedDagger : OneHandedWeaponSword : OneHandedWeapon
物品定義(Item Definition)
物品定義可以想像成物品的「模板」或「模具」。Item Definition 中定義的屬性,會在所有以此定義建立的物品實例之間共享。它也包含一個「預設物品(Default Item)」的參照,作為建立其他物品實例的基礎。
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):玩家可以使用物品與強盜戰鬥並獲取戰利品。
可以透過以下路徑編輯範例資料庫:
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
Missing Parent Folder 錯誤。請先在 Unity 內建立好父資料夾,再按按鈕。
從頭建立資料庫時,系統會預設包含一個「All」Item Category,並附帶兩個 Item Definition 屬性:Icon 和 Description。這兩個屬性是最常用的,你可以自行重新命名或刪除這個 Item Category。
建議先新增你預計會用到的幾個 Item Categories,例如:
- 功能性分類:
Consumable、Equippable、Droppable - 類型性分類:
Food、Weapon、Material(可繼承「All」及部分功能性分類) - 細節分類:
One-Hand Weapon、Sword、Knife(用來區分同一父類別下的物品)
All, Weapon, Droppable, Melee Weapon, Ranged Weapon繼承關係:
Weapon 的父類別為 All 和 DroppableMelee Weapon 和 Ranged Weapon 為 Weapon 的子類別屬性配置建議:
All:Icon(Item Definition 屬性)、Description(Item Definition 屬性)Droppable:DropPrefab(Item Definition 屬性)Weapon:WeaponPrefab、Attack(Item Definition 屬性)Ranged Weapon:Clip Size(Item Definition 屬性)、Clip Remaining(Item 屬性)
定義屬性
建立資料庫時,良好的屬性規劃非常重要。以下說明各種屬性應如何正確配置。
Item Category 的設定
Item Category 定義了物品「能做什麼」和「不能做什麼」。屬於某個類別的所有物品,都會繼承所有父類別的屬性。
可變性(Mutability)與唯一性(Uniqueness)
Category 還定義了其直屬物品的可變性與唯一性:
- Mutability:定義物品的屬性值是否可在執行期間修改。
- Unique:定義物品是否在可能的情況下自動疊加堆疊。請注意,Mutable 且 Common(非 Unique)的物品在堆疊時,會保留原有物品的屬性值。
屬性應放置的位置
定義屬性時,最重要的是選擇正確的集合(Collection):
Item Definitions 的應用技巧
在執行期間,有時你可能需要修改屬性值,例如提升武器的攻擊力。與其直接修改屬性,更好的做法是用新的物品替換舊的物品。
Sword、Sword +1、Sword +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 屬性,無法在執行期間修改。Attack 和 Slots 則設為 Item 屬性,可以在執行期間變更。Attack 預設使用 Modify 變體,複製 BaseAttack 的值,之後可再依需求調整。
範例說明:Material Category(材料類別)
Material Category 設定為 Immutable + Common。Immutable 是因為沒有需要在執行期間變更的屬性;Common 是因為材料類物品在加入庫存時應該自動疊加堆疊。
- 只有一個 Category 屬性:
CategoryIcon。 - 所有其他屬性都設為 Item Definition 屬性。
- 不需要設置 Item 屬性,因為每個材料定義只會有一個物品實例。