需求
由于之前给服务器导出过.obj文件(类似于导出游戏地图中每个GameObject的某些信息),其中会遇到一个问题,就是如果这些文件中有一些文件有错误,我们如何定位到游戏地图中对应的GameObject。
最简单的就是导出的时候带name信息,然后在Hierarchy面板中搜索对应的name。但是由于一个大地图,可能有成千上万个GameObject,然后美术在制作的时候可能很多都是重复的,利用复制黏贴生成。导致实际上会有很多相同name的GameObject,也不太可能说让美术们一个个改名来保证唯一性。
我们知道GameObject有个InstanceID,可以作为唯一标识,但是这个ID我们在Hierarchy面板中无法直观的看见,这时候就需要我们加点小功能,来实现下面两个功能:
1.在Hierarchy面板中,显示选中的GameObject的InstanceID
2.创建一个自定义窗口,在里面可以通过输入一个InstanceID,来定位到Hierarchy对应的GameObject
效果图如下:
这样我们就可以通过导出文件的时候带上InstanceID属性,当发现某些文件有问题时,通过这些InstanceID来定位出问题的GameObject。
备注:同一个GameObject,gameobject.GetInstanceID() 和 transform.GetInstanceID()不一样,我们需要使用gameobject的instanceid。
实现
我们知道Inspector,Scene面板都可以做一些自定义功能,那么我们如何拓展Hierarchy面板呢,通过查找,发现有一个EditorApplication.hierarchyWindowItemOnGUI的API可以帮助我们实现。
这是一个委托方法,HierarchyWindowItemCallback(int instanceID, Rect selectionRect)中两个参数分别是Hier