一、脚本编程
1、用代码完成了一个Unity修正器窗口(ItemEditor),用于办理游戏中的物品数据。它包括以下功用:
1. 经过Unity Editor窗口菜单栏创立了ItemEditor窗口。
2. 经过Visual Tree Asset加载了该窗口的布局和UI元素,包括一个ListView用于显现物品列表。
3. 经过一个SO (ScriptableObject) 文件来存储一切物品数据(ItemDataList_SO),一起经过ItemDetails类界说了物品的各种特点,比方id、称号、图标等。
4. 经过LoadDataBase()办法加载了物品数据列表,并运用EditorUtility.SetDirty(dataBase)办法符号数据发生了修正。
5. 经过GenerateListView()办法生成ListView,并将物品列表(itemList)绑定到ListView上。一起,该办法界说了如何显现每一个物品的UI,即如何对应ListView的items和UI模板(itemRowTemplate)。
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using System.Collections.Generic;
using System;
public class ItemEditor : EditorWindow
{
private ItemDataList_SO dataBase;
private List<ItemDetails> itemList = new List<ItemDetails>();
private VisualTreeAsset itemRowTemplate;
private ListView itemlistView;
[MenuItem("Lzj/ItemEditor")]
public static void ShowExample()
{
ItemEditor wnd = GetWindow<ItemEditor>();
wnd.titleContent = new GUIContent("ItemEditor");
}
public void CreateGUI()
{
// Each editor window contains a root VisualElement object
VisualElement root = rootVisualElement;
// Import UXML
var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UI Builder/ItemEditor.uxml");
VisualElement labelFromUXML = visualTree.Instantiate();
root.Add(labelFromUXML);
//拿到模板数据
itemRowTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UI Builder/ItemRowTemplates.uxml");
//变量赋值
itemlistView = root.Q<VisualElement>("ItemList").Q<ListView>("ListView");
//加载数据
LoadDataBase();
//生成ListView
GenerateListView();
}
private void LoadDataBase()
{
var dataArray = AssetDatabase.FindAssets("ItemDataList_SO");
if (dataArray.Length > 1)
{
var path=AssetDatabase.GUIDToAssetPath(dataArray[0]);
dataBase = AssetDatabase.LoadAssetAtPath(path, typeof(ItemDataList_SO)) as ItemDataList_SO ;
}
itemList = dataBase.itemDataList;
EditorUtility.SetDirty(dataBase);
//Debug.Log (itemList[0].itemID);
}
private void GenerateListView()
{
Func<VisualElement>makeItem=()=>itemRowTemplate.CloneTree();
Action<VisualElement, int> bindItem = (e, i) =>
{
if (i < itemList.Count)
{
if (itemList[i].itemIcen!= null )
e.Q<VisualElement>("Icon").style.backgroundImage = itemList[i].itemIcen.texture;
e.Q<Label>("Name").text = itemList[i]== null ? "No ITEM": itemList[i].itemName;
}
};
// itemlistView.fixedItemHeight=60;
itemlistView.itemsSource = itemList;
itemlistView.makeItem = makeItem;
itemlistView.bindItem= bindItem;
}
}
将上图Item Template模板生成在ItemList中:
二、初步了解脚本编程以及API的调用
1、命名空间
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using System.Collections.Generic;
using System;
1)、using UnityEditor;:这段代码引入了Unity修正器的命名空间,用于在修正器开发中运用Unity Editor API。
2)、using UnityEditor.UIElements;:这段代码引入了Unity修正器和UIElements的命名空间,用于在修正器中创立UI界面和交互式元素。
3)、using UnityEngine;:这段代码引入了Unity引擎的命名空间,包括了Unity中常用的类和函数。在脚本编写中,能够运用Unity引擎中的各种资源、组件等。
4)、using UnityEngine.UIElements;:这段代码引入了Unity UIElements的命名空间,用于在运用UIElements框架进行UI界面开发时调用相关的类和函数。
5)、using System.Collections.Generic;:这段代码引入了C#言语中的泛型调集命名空间,包括了常用的列表和字典等数据结构。
6)、using System;:这段代码引入了C#言语的体系命名空间,包括了一些常用的基础类型和常量。
2、声明变量,赋予操控权
private ItemDataList\_SO dataBase;
private List<ItemDetails> itemList = new List<ItemDetails>();
private VisualTreeAsset itemRowTemplate;
private ListView itemlistView;
1)、private ItemDataList_SO dataBase:
C#中的私有变量声明,变量名为dataBase
,类型为ItemDataList_SO
是一个自界说的ScriptableObject脚本类型。在Unity中,ScriptableObject是一种可编写、可重用的数据目标,它们允许您在游戏运行时创立和修正数据,而无需从代码中硬编码数据项。经过运用ScriptableObject,您能够将数据项从游戏目标中分离出来,从而更轻松地办理和修正它们。
一般,ScriptableObject会被用作某个修正器东西或体系的装备信息、设置变量或其他需求预存数据的类型上。
ItemDataList_SO
类型被用作dataBase
私有变量的类型。这可能意味着该变量在某些修正器东西或体系中扮演着装备或预设数据的人物,能够在修正器中进行装备和修正。一起,因为该变量为私有变量,只能在当时类内部被拜访和运用,保证了其封装性和安全性。
2)、创立ItemDetails列表的List列表
private List<ItemDetails>itemList=new List<ItemDetails>()
这是一个C#中的私有变量声明,该变量名为itemList
,类型为List<ItemDetails>
,并运用了C#的泛型特性。该行代码声明晰一个List<ItemDetails>
类型的私有变量itemList
,用于存储一组ItemDetails
类型的目标。
List<ItemDetails>
是一个泛型调集类,用于存储一组相同类型的目标。在此处,List<ItemDetails>
被用来存储名为ItemDetails\
的自界说结构体类型的目标。结构体类型一般用来封装数据,表明某个特定实体的特点和办法等信息。
在 C# 中,new
是一种实例化目标的方式。它能够用于创立一个新目标,然后回来其引用。在这里,new List<ItemDetails>()
表明创立了一个空的 List<ItemDetails>
目标,并将其引用赋值给了变量 itemList
。
List<ItemDetails>
是一个类,所以有必要运用 new
关键字来创立一个新的目标。这个目标是列表类型,即内部包括多个 ItemDetails
类型的目标,能够经过 Add
办法增加新元素,或是经过 Remove
办法移除指定元素。每次创立一个新窗口时,都需求从头加载并创立一个新的 itemList
目标,并用它来更新列表控件的数据源。
3)、拿到Item Template模板的操控权和ListView列表的操控权:
private VisualTreeAsset itemRowTemplate;//Item Template模板
private ListView itemlistView;//运用Item Template模板的显现列表
3、创立窗口显现
[MenuItem("Lzj/ItemEditor")]
public static void ShowExample()
{
ItemEditor wnd = GetWindow<ItemEditor>();
wnd.titleContent = new GUIContent("ItemEditor");
}
1)、[MenuItem("Lzj/ItemEditor")]
这段代码创立了一个菜单项,用于在Unity修正器的顶部菜单中增加一个名为 Lzj 的菜单,再在 Lzj 菜单下增加一个名为 ItemEditor 的子菜单。点击该子菜单时能够触发相应的事件或翻开相关的窗口。
2)、ItemEditor wnd = GetWindow <ItemEditor>
():
调用了GetWindow<ItemEditor>()
办法创立了一个名为wnd
的新窗口,并将其赋值给本地变量wnd
。然后,经过设置wnd.titleContent
特点,将窗口的标题显现为"ItemEditor"
。
在Unity修正器扩展中,运用GetWindow<T>()
办法能够创立一个指定类型(T)的窗口。经过该办法,开发者能够在自己的修正器东西或体系中创立自界说的窗口,并在其间增加自己需求的UI元素和功用。其间,泛型参数T指定了窗口对应的类或脚本类型。
在此例中,经过GetWindow<ItemEditor>()
办法创立了一个名为ItemEditor
的窗口,并将其赋值给wnd
本地变量。
3)、 wnd.titleContent = new GUIContent(“ItemEditor”):
设置wnd.titleContent
特点,将窗口的标题显现为"ItemEditor"
。其间,wnd 是创立的窗口实例,titleContent 特点用于设置窗口的标题内容。运用 GUIContent 类型的结构函数能够将字符串 ItemEditor"
换成 GUIContent 类型的目标,并赋值给 titleContent 特点。
4、创立的窗口中增加GUI元素
public void CreateGUI()
{
// Each editor window contains a root VisualElement object
VisualElement root = rootVisualElement;
// Import UXML
var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UI Builder/ItemEditor.uxml");
VisualElement labelFromUXML = visualTree.Instantiate();
root.Add(labelFromUXML);
//拿到模板数据
itemRowTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UI Builder/ItemRowTemplates.uxml");
//变量赋值
itemlistView = root.Q<VisualElement>("ItemList").Q<ListView>("ListView");
//加载数据
LoadDataBase();
//生成ListView
GenerateListView();
}
1)、public void CreateGUI(){}:
这是一个公共办法,名为CreateGUI()
。在该办法内部,首要获取了当时窗口的根视图(rootVisualElement
)。用于在创立的窗口中增加GUI元素和界面布局。CreateGUI 办法在窗口初始化时会被调用,能够在该办法中增加各种UI元素,如按钮、文本框、下拉菜单等。用户能够在该办法中进行UI定制化操作,以满足自己项目的需求。
2)、isualElement root = rootVisualElement;:
-
这段代码界说了一个名为 root 的 VisualElement 类型变量,并将根视图(rootVisualElement)赋值给它。在 Unity 中,窗口中的一切UI元素都是以 VisualElement 为单位,经过构建 VisualElement 树形结构来构建窗口界面布局。rootVisualElement 是窗口中默许最顶层的 VisualElement,经过将其赋值给变量 root,能够方便地在该窗口的上下文中增加其他 VisualElement 元素。
-
根视图是窗口的最顶层UI元素,它是一个 VisualElement 类型目标,在 Unity 中用于表明当时窗口中的整个UI元素树形结构。在增加UI元素时,常常需求将它们作为子元素增加到根视图上,从而完成组件的布局和排版。能够经过获取根视图目标来拜访窗口中的一切UI元素,对其进行定位、缩放、旋转等操作。在Unity中,能够经过
rootVisualElement
特点获取根视图目标。
3)、visualTree = AssetDatabase.LoadAssetAtPath<isualTreeAsset>
Assets/Editor/UI Builder/ItemEditor.uxml”);
这段代码运用 Unity 的 AssetDatabase 类加载了名为 “ItemEditor.uxml” 的 Visual Tree Asset(UI布局信息文件)。详细来说,代码中运用AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(path)
办法从指定途径(“Assets/Editor/UI Builder/ItemEditor.uxml”)加载一个 isualTreeAsset
型的目标,并将其赋值给 visualTree 变量。经过加载 UXML 文件,能够快速构建复杂的UI界面布局,完成可视化设计。
4)、VisualElement labelFromUXML = visualTree.Instantiate();
这段代码运用 visualTree
目标(即上一个问题中加载的 ItemEditor.uxml
文件)来创立一个名为 labelFromUXML
的 VisualElement
实例。详细来说,代码中运用 Visual Tree Asset 的 Instantiate 办法实例化了 visualTree 中界说的UI元素,并将其赋值给 labelFromUXML 变量。经过实例化 Visual Element,能够将XML布局文件中界说的各种UI元素转化成实际运行时的目标,以便在代码中对它们进行进一步操作和操控。
visualTree.Instantiate()
办法实例化了一个新的视图元素labelFromUXML
。
5)、root.Add(labelFromUXML):
这段代码将创立的VisualElement
(即 labelFromUXML) 增加到根视图 root 中,以便显现在窗口中。详细来说,代码调用了 root 目标的 Add 办法,将 labelFromUXML
作为参数传入,完成了将 labelFromUXML
增加为根视图的子元素的操作。经过将 VisualElement
增加到根视图中,能够在窗口中显现和办理该元素,并与窗口中的其他 UI 元素进行交互。
6)、 itemRowTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>
(“Assets/Editor/UI Builder/ItemRowTemplates.uxml”);
加载了另一个UXML文件,存储了ListView中的每个子项模板。
这段代码运用 Unity 的 AssetDatabase
类加载了名为 "ItemRowTemplates.uxml"
的 Visual Tree Asset(UI布局信息文件)。详细来说,代码中运用LoadAssetAtPath
办法从指定途径("Assets/Editor/UI Builder/ItemRowTemplates.uxml")
加载一个VisualTreeAsset
类型的目标,并将其赋值给 itemRowTemplate
变量。该 UXML 文件界说了用于显现列表项的UI元素布局模板
7)、itemlistView = root.Q<VisualElement>
(“ItemList”).Q<ListView>
(“ListView”);
经过root.Q<VisualElement>("ItemList").Q<ListView>("ListView")
找到了名为"ItemList"
的 VisualElement 元素,并找到其名为"ListView"
的ListView子元素,并将元素赋予变量itemlistView
。
8)、LoadDataBase();
经过调用LoadDataBase()
办法加载数据
9)、GenerateListView();
经过GenerateListView()
办法生成ListView
的子项以显现到视图中。
总而言之,该办法首要担任创立自界说窗口及视图,并将其增加到根视图中;加载数据;生成 ListView 子项等操作。
5、加载名为 “ItemDataList_SO” 的资源,并将数据存储到 itemList
字段中
private void LoadDataBase()
{
var dataArray = AssetDatabase.FindAssets("ItemDataList_SO");
if (dataArray.Length > 1)
{
var path=AssetDatabase.GUIDToAssetPath(dataArray[0]);
dataBase = AssetDatabase.LoadAssetAtPath(path, typeof(ItemDataList_SO)) as ItemDataList_SO ;
}
itemList = dataBase.itemDataList;
EditorUtility.SetDirty(dataBase);
}
这段代码的作用是加载项目中名为 “ItemDataList_SO” 的资源,并将其间的数据存储到 itemList
字段中。
首要,在该办法中调用 AssetDatabase.FindAssets("ItemDataList_SO")
办法查找名为 “ItemDataList_SO” 的资源,并将回来的一切匹配的资源 GUID 存储在 dataArray
数组中。然后,经过查看 dataArray
数组的长度是否大于 1 来确保只要一个匹配的资源,若不止一个资源,则挑选第一个匹配的资源。接着,运用 AssetDatabase.GUIDToAssetPath()
办法将所选资源的 GUID 转化为其在项目中的途径,并运用 AssetDatabase.LoadAssetAtPath()
办法加载该资源。此处需求留意的是,回来的资源类型有必要指定为 ItemDataList_SO
,以便正确地将其转化为该类型的目标。
加载完成后,经过拜访 dataBase.itemDataList
字段,能够获得包括在资源中的 ItemData
数据列表。最终,调用 EditorUtility.SetDirty()
办法来通知 Unity 引擎该目标已被修正,需求进行保存。
因而,该段代码的作用是从项目中加载名为 “ItemDataList_SO” 的资源,并将其间的数据存储到 itemList
字段中,以便在之后的修正器扩展(Editor Extensions)中运用。
1)、var dataArray = AssetDatabase.FindAssets(“ItemDataList_SO”);
这段代码的作用是在 Unity 项目中查找名为 “ItemDataList_SO” 的 ScriptableObject 资源,并回来它们的 GUID 列表。
它运用 Unity 的 AssetDatabase 类的静态办法 FindAssets
来查找项目中一切称号为 “ItemDataList_SO” 的 ScriptableObject 资源,并将它们的 GUID 存储在一个名为 dataArray
的字符串数组中。每个元素都包括一个匹配项的唯一标识符,也称为 GUID。
FindAssets
办法的参数是一个字符串类型的参数,它代表着要查找的资源的称号(不包括途径和扩展名)。在这个比如中,查找的资源称号是 “ItemDataList_SO”,表明查找一切姓名为 “ItemDataList_SO” 的 ScriptableObject 资源。
终究回来的是一个字符串类型的数组,其间封装了一切名为 “ItemDataList_SO” 的 ScriptableObject 资源的 GUID。
因而,该代码段的作用是查找项目中名为 “ItemDataList_SO” 的资源,并将其 GUID 存储在 dataArray
数组中,以便后续的操作。
2)、if (dataArray.Length > 1)
这段代码是一个条件句子,它的作用是查看 dataArray
数组的长度是否大于 1。
假如 dataArray
的长度大于 1,那么表明在项目中有多个名为 “ItemDataList_SO” 的资源。
3)、var path=AssetDatabase.GUIDToAssetPath(dataArray[0]);
作用是将 dataArray
数组中第一个匹配项的 GUID 转化为资源的途径。
运用 Unity 的 AssetDatabase 类的静态办法 GUIDToAssetPath
来将 dataArray
数组中第一个匹配项的 GUID(大局唯一标识符)转化为资源的途径。这个资源途径是相对于 Unity 项目的根目录的,能够被用于加载该资源或者在修正器中拜访。
4)、dataBase = AssetDatabase.LoadAssetAtPath(path, typeof(ItemDataList_SO)) as ItemDataList_SO ;
这段代码的作用是从指定途径(path
变量)加载资源,并将其转化为 ItemDataList_SO
类型的目标,然后存储到 dataBase
变量中。
详细地说,它运用 Unity 的 AssetDatabase 类的静态办法 LoadAssetAtPath
加载 path
变量所代表的途径上的资源,而且将其的类型转化为 ItemDataList_SO
。在这个比如中,ItemDataList_SO
是一个 ScriptableObject 类型的目标,包括了游戏中的一切物品数据信息。
LoadAssetAtPath
办法回来一个 Object 类型的目标,需求运用强制类型转化转化为 ItemDataList_SO
类型的目标。因而,这里运用了 as ItemDataList_SO
来完成类型转化。
终究,加载的 ItemDataList_SO
目标被赋值给名为 dataBase
的变量,以便在后续过程中运用它所包括的物品数据信息。
5)、itemList = dataBase.itemDataList;
这段代码的作用是将 dataBase
变量中所包括的物品数据信息存储到 itemList
变量中,以便在后续过程中运用。
详细地说,dataBase
是一个 ItemDataList_SO
类型的目标,其间包括了游戏中一切物品的相关信息。经过拜访 dataBase.itemDataList
特点,能够获取 ItemDataList_SO
目标中所包括的名为 itemDataList
的字段的值,该字段实际上是一个存储一切物品信息的列表。因而,该代码行的作用是将该列表存储到 itemList
变量中,以便在后续过程中运用。
需求留意的是,itemList
变量的类型有必要与 itemDataList
字段所存储的类型相同,这里 itemDataList
的类型是 List<ItemData>
,因而 itemList
的类型也应该是 List<ItemData>
。
6)、 EditorUtility.SetDirty(dataBase);
这段代码的作用是符号 dataBase
目标为“已修正”,以便 Unity 在保存场景或项目时将其正确地保存到磁盘上。
详细地说,EditorUtility.SetDirty
是 Unity 的 EditorUtility 类的静态办法。它用于符号一个目标为“已修正”,通知 Unity 在保存时需求保存该目标的状况,不然会丢失所做的更改。
在这个比如中,dataBase
是一个 ItemDataList_SO
类型的 ScriptableObject 目标,它包括了游戏中一切物品的相关信息。当进行对 dataBase
的修正操作之后,需求运用 EditorUtility.SetDirty
办法来告诉 Unity 需求保存这些修正更改,不然更改将不会被保存。
7、生成一个包括多个列表项的列表视图,显现游戏中的物品信息。
private void GenerateListView()
{
Func<VisualElement>makeItem=()=>itemRowTemplate.CloneTree();
Action<VisualElement, int> bindItem = (e, i) =>
{
if (i < itemList.Count)
{
if (itemList[i].itemIcon!= null )
e.Q<VisualElement>("Icon").style.backgroundImage = itemList[i].itemIcon.texture;
e.Q<Label>("Name").text = itemList[i]== null ? "No ITEM": itemList[i].itemName;
}
};
itemlistView.fixedItemHeight=60;
itemlistView.itemsSource = itemList;
itemlistView.makeItem = makeItem;
itemlistView.bindItem= bindItem;
}
这是一个私有办法,名为GenerateListView()
。在该办法中,界说了两个托付变量:makeItem
和bindItem
。
makeItem
托付运用 lambda 表达式界说了一个办法,该办法经过调用itemRowTemplate.CloneTree()
办法克隆了名为"ItemRowTemplates"
的UXML模板,并将其作为回来值。详细来说,该办法将用于在ListView
控件中生成每个子项。
bindItem
托付运用 lambda 表达式界说了别的一个办法,该办法承受两个参数:e
表明当时需求绑定数据的可视元素;i
表明当时子项地点的索引方位。在该托付中,首要查看itemList
列表中是否存在当时索引方位的子项,假如存在则获取该子项的基本信息并将其应用到对应的UI元素中。详细来说,代码中运用Q
办法获取了需求修正的UI元素,并将对应数据赋值给它们。
最终,经过为itemlistView
目标的itemsSource
、makeItem
和bindItem
特点别离赋值,将数据源、生成子项和绑定子项的操作与ListView
控件相关起来。这样就能够将数据显现到界面上了。注释掉了其间一行代码 // itemlistView.fixedItemHeight=60;
,该代码可能用于设置子项高度,但被注释掉了。
1)、 Func<VisualElement>makeItem=()=>itemRowTemplate.CloneTree();
这段代码创立了一个 lambda 表达式,并将其赋值给局部变量 makeItem
。
lambda 表达式的界说为:() => itemRowTemplate.CloneTree()
,其间 ()=>
是 lambda 表达式的符号,表明它是一个不带参数的函数。在该函数中,履行了 itemRowTemplate.CloneTree()
办法,该办法会克隆 itemRowTemplate
目标并回来新的目标。
-
Func<VisualElement>
是一个托付类型,表明回来一个 VisualElement 的办法。 -
makeItem
是一个 Func<VisualElement>
类型的变量名,用于存储一个办法。 -
()
表明该办法没有参数。 -
=>
表明该办法的回来值为后边的表达式。 -
itemRowTemplate
表明一个 VisualElement 实例,一般是一个自界说的列表行模板。 -
.CloneTree()
是 VisualElement 的办法,用于仿制当时 VisualElement 中一切的子元素及其特点,并回来其新的 VisualElement 实例。
因而,这段代码的作用是界说了一个名为 makeItem
的办法,该办法回来一个 VisualElement 实例。详细完成是将 itemRowTemplate
进行深复制并回来其新的 VisualElement 实例,适用于动态地创立列表项时运用。在 Unity 引擎中,一般运用 VisualElement 来表明界面上的元素,因而该办法的回来值能够被用于显现在列表中的某一项。
2)、Action<VisualElement, int> bindItem = (e, i) =>{}
这段代码创立了一个 lambda 表达式,并将其赋值给局部变量 bindItem
。
lambda 表达式的界说为:(e, i) => {}
,其间 (e, i)
是 lambda 表达式的参数列表,表明该函数承受两个参数:VisualElement 类型的 e 和 int 类型的 i。在 =>
符号后边的空花括号中,能够编写需求履行的代码。
-
Action<VisualElement, int>
是一个托付类型的界说,用于界说一个函数签名,该函数有两个参数:一个是 VisualElement 类型的参数e
,另一个是 int 类型的参数i
。该托付没有回来值(void)。 -
bindItem
是界说的一个托付类型变量,用于存储符合上述托付类型界说的详细函数完成。 -
=
是一个赋值运算符,用于将右边的表达式的值赋给左边的变量。 -
(e, i) => {}
是一个 lambda 表达式,它能够理解为一个匿名函数,表明详细的函数完成。括号中的e
和i
别离对应了前面界说的托付类型中的两个参数,而花括号内部则是函数体,即详细要履行的代码。
3)、 if (i < itemList.Count)
-
if
是一个条件判别句子,用于依据条件的成果来履行不同的代码。 -
(i < itemList.Count)
是该句子的条件部分,它表达了一个条件:当时索引值i
是否小于物品列表itemList
的长度。 -
<
是一个比较运算符,用于比较两个数的大小关系。在这里,它用于比较i
和itemList.Count
的大小关系,假如i
比itemList.Count
小,则回来true
;不然回来false
。 -
i
是表明索引值的变量名,一般用于循环遍历列表或数组等数据结构时运用。 -
itemList
是物品列表目标的称号,一般用于存储一组相同类型的物品数据。Count
是物品列表目标的特点,用于表明物品列表的长度。
因而,这段代码的作用是,判别当时要绑定数据的列表项是否超出了物品列表中的数据范围,假如超出了,则不再对该方位的列表项进行数据绑定,以防止出现越界拜访错误。
4)、 e.Q<VisualElement>(“Icon”).style.backgroundImage = itemList[i].itemIcon.texture;
-
e
表明一个 VisualElement 实例,一般是列表中的一个元素。 -
Q<VisualElement>("Icon")
是 VisualElement 类型的扩展办法,用于查找当时 VisualElement 中称号为 “Icon” 的子元素,并回来其 VisualElement 实例。该办法回来值是一个 VisualElement 实例或 null。 -
.style
表明 VisualElement 的款式目标,用于设置该元素的款式特点。 -
.backgroundImage
是款式目标的一个特点,表明该元素的布景图片(Background Image)。 -
itemList
是一个物品列表目标,用于存储一组相同类型的物品数据,i
是当时的索引值。 -
itemList[i]
表明依据当时的索引值获取物品列表中特定方位的元素,它是一个详细的物品目标。 -
.itemIcon
表明物品目标的图标特点,它指向一个 Texture2D 目标,用于表明该物品的图标信息。 -
.texture
表明 Texture2D 目标的纹路数据,用于显现在该元素的布景上。
因而,这段代码的作用是,在当时列表项的 “Icon” 子元素中,设置该元素的布景图画为当时索引对应的物品目标的图标纹路数据,完成了对列表项中数据和 UI 元素的绑定操作。这个操作的完成根据 Unity 引擎中的 UI 渲染技能,能够将物品图标等数据信息显现在列表项中。
5)、e.Q<Label>
(“Name”).text = itemList[i]== null ? “No ITEM”: itemList[i].itemName;
-
Q<Label>("Name")
是 VisualElement 类型的扩展办法,用于查找当时 VisualElement 中称号为 “Name” 的子元素,并回来其 Label 实例。该办法回来值是一个 Label 实例或 null。 -
.text
是 Label 的特点,表明该元素的文本内容。 -
.itemName
表明物品目标的称号特点,用于表明该物品的称号信息。
因而,这段代码的作用是,在当时列表项的 “Name” 子元素中,设置该元素的文本内容为当时索引对应的物品目标的称号,完成了对列表项中数据和 UI 元素的绑定操作。假如当时索引对应的物品目标为空,则该元素的文本内容将被设置为 “No ITEM”。这个操作的完成根据 Unity 引擎中的 UI 渲染技能,能够将物品称号等数据信息显现在列表项中。
6)、itemlistView.fixedItemHeight=60;
-
itemlistView
表明一个 Unity 引擎中的 ScrollView 实例,一般用于在界面上显现一个翻滚区域。 -
.fixedItemHeight
是 ScrollView 的特点之一,用于设置列表项的固定高度。
因而,这段代码的作用是设置 itemlistView 中的列表项固定高度为 60 像素。在 Unity 引擎中,ScrollView 组件一般被用于完成一些需求翻滚功用的 UI 界面,而其间的列表控件则会需求设置列表项的高度。经过设置列表项的固定高度,能够使得列表更加美观和规整,而且减少列表因为高度纷歧而导致的翻滚条的跳跃感。
7)、itemlistView.itemsSource = itemList;
-
itemlistView
表明一个 Unity 引擎中的 ScrollView 实例,一般用于在界面上显现一个翻滚区域。 -
.itemsSource
是 ScrollView 的特点之一,用于设置列表的数据源。 -
itemList
是一个物品列表目标,用于存储一组相同类型的物品数据。
因而,这段代码的作用是将物品列表 itemList
赋值给 itemlistView
的数据源特点,从而将物品列表中的数据加载到列表控件中进行显现。在 Unity 引擎中,列表控件一般需求经过指定数据源的方式来完成数据绑定,以便从数据源中读取数据并显现在列表项中。该代码赋值操作能够将一个包括多个物品目标的列表与一个 UI 列表控件进行绑定,在每个列表项中显现物品目标的相关信息。
8)、itemlistView.makeItem = makeItem;
-
itemlistView
表明一个 Unity 引擎中的 ScrollView 实例,一般用于在界面上显现一个翻滚区域。 -
.makeItem
是 ScrollView 的特点之一,用于设置创立列表项的托付函数。 -
makeItem
是一个 Func<VisualElement>
类型的变量名,用于存储一个办法,回来类型是 VisualElement。
因而,这段代码的作用是将创立列表项的托付函数 makeItem
赋值给 itemlistView
中的 .makeItem
特点,从而告诉 itemlistView
在需求创立新的列表项时运用哪个托付函数来进行创立。托付是 C# 编程言语中的一种重要机制,其本质是一种能够传递行为的类型,能够将一个办法作为一个参数或回来值来传递。因为列表控件一般需求动态地创立列表项,因而能够经过设置 makeItem
特点来指定创立列表项的托付函数。该代码将一个名为 makeItem
的办法赋值给了 itemlistView
中的 makeItem
特点,因而 itemlistView
在需求创立新的列表项时,会调用该办法来进行创立,并回来一个 VisualElement 目标作为列表项的实例。
9)、itemlistView.bindItem= bindItem;
-
itemlistView
表明一个 Unity 引擎中的 ScrollView 实例,一般用于在界面上显现一个翻滚区域。 -
.bindItem
是 ScrollView 的特点之一,用于设置绑定列表项的托付函数。 -
bindItem
是一个 Func<VisualElement, int, bool> 类型的变量名,用于存储一个办法,承受两个参数:VisualElement 类型的目标和 int 类型的索引值,回来类型是 bool。
因而,这段代码的作用是将绑定列表项的托付函数 bindItem
赋值给 itemlistView
中的 .bindItem
特点,从而告诉 itemlistView
在需求绑定列表项时运用哪个托付函数来进行绑定。类似于 .makeItem
特点,.bindItem
特点也是一个托付函数,用于将数据源中的数据绑定到指定的列表项上,完成数据和 UI 界面的相关。该特点需求承受两个参数:VisualElement 类型的目标和 int 类型的索引值,别离表明当时要绑定的列表项实例和该项在数据源中的索引方位。经过设置 bindItem
特点,能够方便地完成列表项与数据的双向绑定,在数据源发生变化时自动更新列表项内容。
阅览更多作者文章:
用户界面(Editor)如何创立 ListView 的 Item Template 上(14)