2016-12-04 43 views
1

我非常新的延长统一编辑,并拼凑起来的这个脚本,突出层次结构中选择的对象。 问题是,当我在编辑器中并且堆栈顶部(场景名称)进入树中时,整个层次结构变得不可见!当我向下滚动以便场景名称不再出现时,它会自行修复。我附上了图片,让您更清楚地了解发生了什么。当我有一堆对象时,这个问题很小,但在新场景中将无法使用。问题与扩展编辑器来突出层次

[InitializeOnLoad] 
public class HierarchyHighlighter 
{ 
    static HierarchyHighlighter() 
    { 
     EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItem_CB; 
    } 
    private static void HierarchyWindowItem_CB(int selectionID, Rect selectionRect) 
    { 
     Object o = EditorUtility.InstanceIDToObject(selectionID); 
     if ((o as GameObject).GetComponent<HierarchyHighlighterComponent>() != null) 
     { 
      HierarchyHighlighterComponent h = (o as GameObject).GetComponent<HierarchyHighlighterComponent>(); 
      if (h.highlight) 
      { 
       if (Event.current.type == EventType.Repaint) 
       { 
        GUI.backgroundColor = h.color; 
        GUI.Box(selectionRect, ""); 
        GUI.backgroundColor = Color.white; 
        EditorApplication.RepaintHierarchyWindow(); 
       } 
      } 
     } 
    } 
} 

控制台读取: “对象引用不设置为一个对象的一个​​实例” HierarchyHighlighter.HierarchyWindowItem_CB(的Int32 selectionID,矩形selectionRect)(在资产/ HierarchyHighlighter.cs:18)

图像: Functioning as normal

Not functioning as normal

谢谢您的帮助!

回答

0

您的代码正在抛出空引用异常。我不知道这行是18,因为它是从您发布什么文件中可能不同,但我的猜测是,Object o = EditorUtility...将返回null或它返回的对象不是游戏对象,以便(o as GameObject)返回null,抛出异常当你调用GetComponent。

也有三个明显的优化,你可以做:

  • 只做(o as GameObject)投一次。您甚至不需要o作为对象,因此您可以在获取该对象时立即执行该操作:GameObject o = EditorUtility.InstanceIDToObject(selectionID) as GameObject;(然后检查o以修复异常)。
  • 与GetComponent调用相同:只做一次。 ...Component h = o.GetComponent...,然后if (h != null && h.highlight)
  • if (Event.current.type == EventType.Repaint)移动到该函数的开始位置,否则您将在所有其他gui事件中浪费所有这些性能。

此外,使用描述性的变量名。 obj和荧光笔会比o和h好得多。