案例一
public class PracticeAssets : ScriptableObject
{[SerializeField][Searchable][ListDrawerSettings(ShowIndexLabels = true)][LabelText("練習版數據列表")]public List<PracticeData> Practicies = new List<PracticeData>();
}
1.?SerializeField
- 用途:此特性允許?
Practicies
?字段在 Unity 編輯器中可見并可序列化,即使它是一個?private
?字段也能被 Inspector 顯示出來。 - 效果:使得程序員在腳本中定義的某個字段(在這里是?
Practicies
)能夠在 Unity 編輯器的 Inspector 面板中進行賦值和編輯。
2.?[Searchable]
- 用途:這個特性通常用于自定義類或框架中的數據結構,允許在 Inspector 中搜索列表。這意味著在該列表中可以快速找到特定的?
PracticeData
。 - 效果:增強 UX(用戶體驗),使得在大量數據項中快速定位特定項變得容易。
3.?[ListDrawerSettings(ShowIndexLabels = true)]
- 用途:使用這個特性可以自定義列表在 Inspector 中的顯示方式。這里的?
ShowIndexLabels
?設置為?true
,表示在列表的每一項前面顯示它們的索引標簽(如 0, 1, 2...)。 - 效果:使列表更加易于理解和管理,尤其在處理多個?
PracticeData
?實例時,索引能夠幫助用戶快速識別和訪問特定項。
4.?[LabelText("練習版數據列表")]
- 用途:此特性用于指定在 Unity 編輯器 Inspector 中顯示的標簽。這允許您為?
Practicies
?列表設置一個更具描述性的名稱而非默認的字段名稱。 - 效果:在 Inspector 中顯示為“練習版數據列表”,提高可讀性,并提供有意義的上下文信息,幫助開發者理解這個字段的用途。
5.?public List<PracticeData> Practicies = new List<PracticeData>();
- 用途:這是字段的聲明。它定義了一個?
public
?類型的列表,列表中是?PracticeData
?類型的對象。 - 效果:允許將多個?
PracticeData
?實例存儲在?Practicies
?列表中,同時由于是?public
,可以在其它類中直接訪問此列表。
案例二
public class IndustryAssets : ScriptableObject
{[SerializeField][Searchable][ListDrawerSettings(ListElementLabelName = "GetClassName")][LabelText("行業列表")]public List<IndustryData> Industry = new List<IndustryData>();
}
1.[ListDrawerSettings(ListElementLabelName = "GetClassName")]
- 用途:此特性用于配置列表的顯示方式。在這里,
ListElementLabelName
?指定使用?GetClassName
?方法返回的值作為每個列表項的標簽。 - 效果:使得在 Inspector 中查看?
Industry
?列表時,每個?IndustryData
?實例將使用其?GetClassName()
?方法的返回值作為標簽,使得列表更具可讀性和可管理性。
案例三
[ReadOnly]
[GUIColor("red")]
[LabelText("數據驗證:")]
public string ErrorMessage;
1.[ReadOnly]
- 用途:表示該字段在 Unity Inspector 中為只讀,不允許用戶編輯。
- 效果:防止用戶在 Inspector 中修改該字段的值,確保程序邏輯控制該字段。
2.[GUIColor("red")]
- 用途:為該字段指定一個顏色,這里設置為紅色。
- 效果:在 Inspector 中顯示該字段時,以紅色突出顯示,通常用于表示錯誤或警告消息。
案例四
[Space]
[Searchable]
[OnStateUpdate("CheckList")]
[ListDrawerSettings(ShowIndexLabels = true)]
[LabelText("隱患點數據列表")]
public List<DataConfigStruct> DataList = new List<DataConfigStruct>();
1.[Space]
- 用途:在 Inspector 中創建一個空間,用于分隔不同的部分。
- 效果:使變量的布局更清晰,不會擁擠在一起。
2.[OnStateUpdate("CheckList")]
- 用途:在狀態更新時自動調用?
CheckList
?方法。 - 效果:每當數據發生改變或進入檢查狀態時,
CheckList
?方法會被自動調用,以驗證數據的完整性。
3.[ListDrawerSettings(ShowIndexLabels = true)]
- 用途:配置列表在 Inspector 中的顯示方式,顯示每個元素的索引標簽。
- 效果:使得用戶可以看到列表中每一項的位置編號,便于管理和引用特定項。
方法 CheckList
private void CheckList()
{ // 檢查應用程序是否正在運行,如果是,則不執行驗證邏輯 if (Application.isPlaying) return; // 創建一個用于存儲所有 ID 的列表 List<uint> idList = new List<uint>(); // 遍歷 DataList 列表,提取每個 DataConfigStruct 對象的 ID for (int i = 0; i < DataList.Count; i++) { // 將每個對象的 ID 添加到 idList 列表中 idList.Add(DataList[i].ID); } // 使用 LINQ 查詢查找重復的 ID 值 var duplicates = idList.GroupBy(n => n) // 根據 ID 分組 .Where(g => g.Count() > 1) // 只選擇計數大于 1 的組,即重復的 ID .Select(g => g.Key); // 選擇每個重復組的 ID // 檢查是否存在重復的 ID if (duplicates.Count() > 0) { // 如果發現重復 ID,更新錯誤信息 foreach (var number in duplicates) { // 設置錯誤信息,包含找到的重復 ID ErrorMessage = string.Format("驗證不通過,存在相同的唯一ID: {0}", number); } } else { // 如果沒有重復 ID,設置驗證通過的消息 ErrorMessage = string.Format("驗證通過"); }
}
?