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();
                }
            }
        }
    }
}

コンソールには、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」と表示されます。

画像: 正常に機能しています

正常に機能していない

ご協力ありがとうございました!

4

1 に答える 1

0

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

また、次の 3 つの明白な最適化を行うことができます。

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

また、わかりやすい変数名を使用してください。obj と Highlighter は、o と h よりもはるかに優れています。

于 2016-12-05T01:13:44.303 に答える