2016-12-04 44 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好得多。