2016-12-04 19 views
1

私はUnityエディタを拡張するのが非常に新しく、階層内の選択したオブジェクトを強調表示するこのスクリプトをまとめました。 問題は、私がエディタにいて、スタックのトップ(シーン名)がツリー上で見える場合、階層全体が見えなくなります!シーン名が見えなくなるようにスクロールすると、それ自体が修正されます。私は何が起きているのかをよりよく理解するために画像を添付しました。この問題は、たくさんのオブジェクトを持っていても、新しいシーンでは使えなくなってしまったときは、ごくわずかです。エディタを拡張して階層を強調表示する問題

[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、のRect selectionRect)(18資産/ HierarchyHighlighter.csで) "オブジェクト参照がオブジェクトのインスタンスに設定されていません" : Functioning as normal

Not functioning as normal

はあなたの助けをありがとう!

答えて

0

コードでヌル参照例外がスローされています。あなたが投稿したものとおそらくファイル内で異なるので、私はどの行が18か分からないが、Object o = EditorUtility...はnullを返すか、返すオブジェクトはGameObjectではないので(o as GameObject)はnullを返して例外をスローするGetComponentを呼び出すとき。

あなたが作ることができる3つの明白な最適化もあります

  • 一度だけ(o as GameObject)キャストを行うには。あなたはObjectを全く必要としないので、取得するとすぐにキャストを行うことができます:GameObject o = EditorUtility.InstanceIDToObject(selectionID) as GameObject;(nullをチェックして例外を修正してください)。
  • GetComponent呼び出しと同じです。一度だけ実行します。 ...Component h = o.GetComponent...、次にif (h != null && h.highlight)
  • if (Event.current.type == EventType.Repaint)を機能の先頭に移動します。そうしないと、他のすべてのGUIイベントですべてのパフォーマンスが無駄になります。

また、説明変数名を使用してください。 objとhighlighterはoとhよりはるかに良いでしょう。

関連する問題