2016-12-04 5 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, 사각형 selectionRect) (18 자산/HierarchyHighlighter.cs AT) "개체 참조가 개체의 인스턴스에 설정되지" : Functioning as normal

Not functioning as normal

는 당신의 도움을 주셔서 감사합니다!

답변

0

코드에서 Null 참조 예외가 발생합니다. 내가 파일을 게시 한 것과 다를 수 있기 때문에 어떤 줄이 18인지 알지 못하지만, Object o = EditorUtility...이 null을 반환하거나 반환하는 개체가 GameObject가 아니므로 (o as GameObject)이 null을 반환하고 예외를 throw합니다. GetComponent를 호출 할 때.

당신이 만들 수도 세 가지 명백한 최적화가 있습니다

  • 한 번만 (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와 형광펜은 o와 h보다 훨씬 낫습니다.