
前言
我們都知道 Unity 預設支援的 SerializeReference 效果相當簡陋,基本上除了能顯示類型外,幾乎無法直接在 Inspector 中進行任何操作。
雖然理論上可以透過【自訂 Editor 擴充功能】或【撰寫 PropertyDrawer】來改善體驗,但這樣做不僅耗時,還需要對 Unity 編輯器 API 有相當深入的理解。
好消息是——社群早就有人替我們解決了這個問題!
今天要介紹的插件 Unity-SerializeReferenceExtensions,正是專為多型序列化打造的可視化工具,讓你能輕鬆地在 Inspector 中操作【抽象類別】、【介面】或【多層級物件】,徹底解放 Unity 原生序列化的限制。
插件介紹
Unity-SerializeReferenceExtensions 是由開發者 mackysoft 所製作的開源工具,主要用來強化 Unity 對 SerializeReference 屬性的支援。
它能讓你在 Inspector 面板中,直接以下拉選單(SubclassSelector)的方式選擇多型物件,並支援【列表(List)】、【陣列(Array)】等集合型資料結構。
這款插件最大的特色,是在不改動 Unity 底層序列化機制的前提下,透過【自訂屬性標籤(Attribute)】與【Editor 擴充】,提供更直覺的操作介面。
開發者可以為【抽象類別】、【介面】或【衍生型別】建立可視化的編輯體驗,並透過 AddTypeMenu 屬性來定義自訂【路徑】與【命名】,使大型專案的資料結構管理更加清晰。

功能特色
- 靈活的多型控制支援
透過內建的 SubclassSelector 屬性,開發者可以在 Inspector 面板中直覺地選擇【抽象基類】或【介面】的具體實作類別,無論是【單一物件】、【陣列】,還是清單(List),都能輕鬆操作。 - 【自訂類別選單】與【結構化管理】
使用 AddTypeMenu 屬性,能為子類別定義【自訂路徑】與【顯示名稱】,使複雜資料的分類更清晰;同時還能透過取消 Serializable 標籤的方式隱藏不需要的類別選項,方便維護大型專案中的多層級物件架構。 - 【零侵入式擴充】與【穩定整合】
無需改動 Unity 原生序列化系統,只需引入簡單的屬性標籤即可啟用功能,與現有專案完全相容;這種輕量化設計能有效降低整合風險,並維持編輯器操作的【穩定性】與【效能】。
適用場景
- 模組化資料系統建構
適用於需要【頻繁替換】或【擴充資料類型】的場景,例如【武器系統】、【AI 行為樹】、【任務模組】等,開發者能透過 Inspector 直接管理不同型別的子物件,減少重複編碼。 - 【多型物件配置】與【可視化】
當專案中包含【抽象基類】或【介面型別】的成員時,插件能讓這些多型物件直接顯示於編輯器中,並支援即時編輯;這讓設計師與工程師能同步調整內容,實現更高效的跨部門協作流程。 - 複雜遊戲資料序列化
在需要序列化多層級結構,如【技能組合】、【事件觸發鏈】、【行為模板】的情境下,插件可確保資料結構在【編輯】與【運行階段】保持一致,並避免手動維護【JSON】或【ScriptableObject】帶來的錯誤風險。

Unity-SerializeReferenceExtensions 插件下載安裝
Github 下載連結:Unity-SerializeReferenceExtensions

Unity-SerializeReferenceExtensions 使用說明
1.測試用例
為了方便後續測試,我先建立一個基本的 SerializeReference 使用用例。
using System;
using UnityEngine;
//可序列化的抽象基類
[Serializable]
public abstract class Weapon
{
public abstract void Attack();
}
//創建具體實現類1
[Serializable]
public class Sword : Weapon
{
public int damage = 10;
public override void Attack() => Debug.Log("Swing sword!");
}
//創建具體實現類2
[Serializable]
public class Gun : Weapon
{
public int bullets = 30;
public override void Attack() => Debug.Log("Fire gun!");
}
public class Player : MonoBehaviour
{
[SerializeReference]
private Weapon currentWeapon;
[SerializeReference]
private List<Weapon> listWeapon;
[SerializeReference]
private Weapon[] arrayWeapon;
}
效果如下。

我們可以看到 Unity 預設支援的 SerializeReference 效果非常簡陋,基本上做不了任何操作。
2.SubclassSelector 屬性
public class Player : MonoBehaviour
{
[SerializeReference, SubclassSelector]
private Weapon currentWeapon;
[SerializeReference, SubclassSelector]
private List<Weapon> listWeapon;
[SerializeReference, SubclassSelector]
private Weapon[] arrayWeapon;
}
效果如下。

注意事項
- 我們也應該使用 SerializeReference 屬性進行標記
- 你可以用它標記基本類型(包括介面),允許您更改陣列、列表和單個元素
- 記得為具體實作的子類別加上 Serializable 特性,不然下拉選擇選單會找不到該子類別選項,我這裡已經加了。
- 如果是數組或列表數據,記得基類要加上 Serializable 特性,我這裡已經加了。
3.AddTypeMenu 屬性
我們可以為具體實作類別新增 AddTypeMenu 屬性,自訂它的路徑和名稱。
//創建具體實現類1
[AddTypeMenu("Data/劍")]
[Serializable]
public class Sword : Weapon
{
public int damage = 10;
public override void Attack() => Debug.Log("Swing sword!");
}
//創建具體實現類2
[AddTypeMenu("槍")]
[Serializable]
public class Gun : Weapon
{
public int bullets = 30;
public override void Attack() => Debug.Log("Fire gun!");
}
效果如下。

4.選擇選單中隱藏子類
前面我已經說過了,一定要給具體實作的子類別加上 Serializable 特性,不然下拉選擇選單會找不到該子類別選項,所以反過來我們要隱藏哪個子類別選項就去掉 Serializable 特性。
例如我們可以選擇隱藏 Sword 項。
//創建具體實現類1
public class Sword : Weapon
{
public int damage = 10;
public override void Attack() => Debug.Log("Swing sword!");
}
//創建具體實現類2
[Serializable]
public class Gun : Weapon
{
public int bullets = 30;
public override void Attack() => Debug.Log("Fire gun!");
}
效果如下。

Unity-SerializeReferenceExtensions 多型序列化工具相關介紹 & 教學影片
Serialize Reference, Serialize Field, Serializable and Scene Serialization in Unity | Unity Tutorial
Unity-SerializeReferenceExtensions 多型序列化工具相關網站 & 插件下載點
【Unity-SerializeReferenceExtensions】
Github 下載連結:Unity-SerializeReferenceExtensions
————————————————
更多好用插件:【Unity 好用插件推薦】持續更新,一遊戲開發事半功倍!
本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。
特約作家簡介
支持贊助 / DONATE
亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。
BTC |
![]() |
bc1psp8nnerlepv56nyfha6mqwnp3yr7qqjdw44c6qt5lx5r2urma7fqykxvwj |
|
ETH |
![]() |
0xB2231557bc418201922DD7C2673ec97E67E35F83 |
|
TRON |
![]() |
TAomNj4L6vMJuaJmbWUdmT1uAWYPf9vDjp |








