페이지

2017년 1월 20일 금요일

Unity3D에서 클래스 이름(string)으로 System.Type 얻기

    // 어셈블리로부터 클래스 이름 문자열을 보내 System.Type을 얻는다.
    public static Type GetTypeFromAssemblies( string TypeName )
    {
        // null 반환 없이 Type이 얻어진다면 얻어진 그대로 반환.
        var type = Type.GetType( TypeName );
        if( type != null )
            return type;

        // 프로젝트에 분명히 포함된 클래스임에도 불구하고 Type이 찾아지지 않는다면,
        // 실행중인 어셈블리를 모두 탐색 하면서 그 안에 찾고자 하는 Type이 있는지 검사.
        var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        var referencedAssemblies = currentAssembly.GetReferencedAssemblies();
        foreach( var assemblyName in referencedAssemblies )
        {
            var assembly = System.Reflection.Assembly.Load( assemblyName );
            if( assembly != null )
            {
                // 찾았다 요놈!!!
                type = assembly.GetType( TypeName );
                if( type != null )
                    return type;
            }
        }

        // 못 찾았음;;; 클래스 이름이 틀렸던가, 아니면 알 수 없는 문제 때문이겠지...
        return null;
    }

가끔씩 Unity3D 환경에서 툴 개발을 하다보면 컴포넌트 이름으로 컴포넌트를 찾아서
특정 오브젝트에 그 컴포넌트를 붙여준다던가 하는 작업이 필요하다.

보통 System.Type.GetType( string className )을 통해 클래스 타입을 얻을 수 있는데
Unity3D환경에서는 바로 Type이 얻어지질 않아, 어셈블리를 활용해서
Type을 찾아내곤 한다.

예전 프로젝트에서도 애니메이션 툴에서 Key를 박아 넣고,
그 Key와 연동되서 실행 되어야 할 모듈을 클래스 이름과 함수명을
설정해 줄 수 있게 해 주었고,

최근에서 tk2d+Spine환경에서 Spine데이터를 원터치 조작으로
내가 원하는 형태의 프리팹으로 만들어 줄 때,
특정 컴포넌트를 그 프리팹에 붙여주어야 했다.

나중에 또 필요해 질 때 바로 찾을 수 있도록 코드를 정리해 보았다.

댓글 1개: