ReferenceCollector类
看这个类在inspector中的表现,猜想这个类应该有引用对象的功能。
ReferenceCollectorData类序列化了一个名字key和object对象。就是对应上面的"LobbyCanvas"和LobbyCanvas对象。这个类有Serializable特性,所以该类是可以被序列化的。
ReferenceCollectorDataComparer类是一个继承IComparer接口的比较器。比较的是ReferenceCollectorData类的key值,使用的序号排序的规则来进行比较,关于比较器可以参考这篇文章。StringComparison枚举定义了6种排序规则,其中这里使用的Ordinal规则表示进行非语言(non-linguistic)上的比较,API运行时将会对两个字符串进行byte级别的比较,因此这种比较是比较严格和准确的,并且在性能上也很好。
ReferenceCollector类实现了ISerializationCallbackReceiver接口用于序列化字典,参考这篇文章。其内部维护了一个List<ReferenceCollectorData> data和一个字典Dictionary<string, Object> dict。List中存储的应该就是需要序列化的资源。 Add方法中有两个参数:SerializedObject和SerializedProperty类型。在使用Add方法时,会使用该类创建一个可序列化
的对象,然后在该对象中查找“data”属性,作为可序列化的属性。这里的“data”就是ReferenceCollector类中的List。这里的添加和我们使用List的添加方法是不一样的,

删除方法主要就是使用了SerializedProperty类的DeleteArrayElementAtIndex()方法,相应的,清空方法使用了ClearArray()方法,而排序则定义了List的Sort方法,使用的是 ReferenceCollectorDataComparer比较器,该方法就是上面定义的比较器。
在实现接口的OnAfterDeserialize方法中(反序列化后),清空字典后,将data中的元素加入到字典中去。实际最后利用的是该字典。List只是一个中间手段,因为Unity是不能直接序列化字典的。
ReferenceCollectorEditor类
该类是和ReferenceCollector类配套的编辑器类,继承了Editor类。首先对基类的几个属性/方法做一些简要说明。targets属性代表的是The object being inspected,即正在检视面板中操作的对象,这里表示的就是ReferenceCollector类的对象。serializedObject属性代表的是检视面板查看对象的SerializedObject对象。OnInspectorGUI方法,重写该方法,可以实现自定义的检视面板。
里面还涉及到一个方法,Undo.RecordObject(),该方法是用于做撤销操作的。第一个参数是要执行撤销的对象,第二个参数是撤销操作的名字,注意,这个名字是要作了对应操作后,才会在撤销菜单显示的。
后面还有一些关于GUI方面的知识。这里用BeginHorizontal和EndHorizontal方法包裹着一些按钮,这表示开启了一组功能控件,并且按照水平方式排列,如图:

然后又显示了一组水平控件,显示了一个文字控件,一个gameObject控件,一个Button控件。
最后显示了一组列表,个数对应于ReferenceCollector类中的List的个数(target属性)。将序列化数据的key和gameObject属性分别显示在文字控件和gameObject控件中,后面再放一个Button控件。
后面还涉及到了拖拽添加引用的部分。