2015년 9월 21일 월요일

The referenced script on this Behaviour is missing!

유니티가 가끔씩


The referenced script on this Behaviour is missing!


이런 워닝을 뱉어 내는 경우가 있는데

원인은 조금만 검색해도 알 수 있듯이

게임오브젝트에 컴포넌트로 추가 했던 Script(C#, Java, Boo)가 사라져서 생기는 증상입니다



뭐...

보통의 눈으로 플레이 상에서 보기에는 그닥 티가 나지 않기 때문에 

모르고 넘어가는경우가 많을것 같은데


깨져있는 스크립트에서 뭔가 게임오브젝트를 제어하려고 했을때 

원하는 대로 동작이 되지 않는다거나

깨진 스크립트에 접근하려고 할때 NullReference 에러를 만나게 됩니다.


근데 이게 또 Warnnig은 확인 했지만 어떤 오브젝트에서 출력하는건지

찾으려 들면 잠시 동안 대략 난감해 집니다.


게임오브젝트를 하나씩 뒤저보며 차일드에 붙어 있는녀석들까지 확인 하려면

처음이야 뭐 그럭저럭 참으며 할만 하겠지만

1분도 안되서 '동작하는데 문제 없어보이는데 걍 둘까?' 하며 자신과 타협하고 있을겁니다

-0-


깨진 스크립트를 갖고 있는 게임오브젝트를 찾을때 귀찮지 않은(매우 중요~)

방법이 뭐가 있을까~ 생각 하다가...


게임오브젝트 로딩시 자식들중에 깨져있는 스크립트를 갖고 있는경우

워닝이 아닌 에러로 해당 게임오브젝트의 이름까지 출력해주는게 있으면 좋겠다~

싶어서 만들어 봤습니다.



#if UNITY_EDITOR
        if (Debug.isDebugBuild)
        {
            MonoBehaviour[] monoBehaviours = go.GetComponentsInChildren<MonoBehaviour>();
            int count = monoBehaviours.Length;

            for (int i = 0; i < count; ++i)
            {
                if (null == monoBehaviours[i])
                {
                    Debug.LogError("Have a missing script in gameobject. gameobject name is '" + go.name + "'");
                    return;
                }
            }
        }
#endif


프리팹 로딩할 때마다 항상 위와 같은 체크를 하게되면 매우 심각한 낭비가 되므로

개발중인 상황에서만 체크 되도록 해주는것도 중요하겠습니다.



런타임에 하이어래키의 모든 게임오브젝트 검사하는 스크립트

댓글 없음:

댓글 쓰기