공부중

[Unity] string과 동일한 class 이름을 가진 타입을 인스턴스화 하기 본문

Programing/Unity3D

[Unity] string과 동일한 class 이름을 가진 타입을 인스턴스화 하기

곤란 2020. 4. 8. 00:22
반응형

기기(aos, ios device)에서까지 돌아가는지는 안써봤지만 일단 정리해보려고 한다.

 

2020/04/07 - [Programing/Unity3D] - [Unity]동일한 구조(?)의 코드를 생성해야 하는 경우

 

[Unity]동일한 구조(?)의 코드를 생성해야 하는 경우

음 뭐라고 제목을 정할까 하다가 실제로 저런 문제를 해결하려고 구현한것이라서 일단 저렇게 써봤다. 문제의 상황은 아래와 같다. Skill 이라는 클래스가 있고 Skill의 자식클래스로 각각의 스킬 구현을 할 예정..

hannom.tistory.com

위의 이전글에서 스킬명과 동일한 클래스 이름을 가진 여러 파일을 생성했었다.

ex) 스킬명 : hyperbeam, 클래스명 : hyperbeam

 

이번에는 스킬이름을 가지고 해당 스킬명과 동일한 클래스를 인스턴스화해서 사용하는것이다.

코드는 간단하다.

    .....
    
    public Skill[] pokemonSkills = new Skill[2];
    
    .....
    
    private void InitSkill()
    {
        string[] skillList = PokemonDataManager.Instance.GetPokemonSkillLearnData(pokemonNumber);

        ... 받아온 스킬목록중 랜덤으로 스킬정하는 코드 생략 ...

        string[] skillName = new string[2];

        for (int i = 0; i < skillName.Length; i++)
        {
            skillName[i] = skillList[skillIndex[i]];
        }

        // 인스턴스화 시작
        Assembly assembly = Assembly.GetExecutingAssembly();

        for (int i = 0; i < pokemonSkills.Length; i++)
        {
            System.Type t = assembly.GetType(skillName[i]);

            object obj = System.Activator.CreateInstance(t);

            if (null == obj)
            {
                Debug.LogError("error");
                return;
            }

            (obj as Skill).Init(skillName[i]);

            pokemonSkills[i] = obj as Skill;

        }

    }

중간에 Assembly 클래스를 사용하기 위해서는 System.Reflection 네임스페이스를 사용한다. 자세한 내용은 MSDN 또는 구글링으로... ㅠㅠ

https://docs.microsoft.com/ko-kr/dotnet/api/system.reflection?view=netframework-4.8

 

System.Reflection 네임스페이스

네임스페이스에는 메타데이터를 검사하여 관리 코드에서 어셈블리, 모듈, 멤버, 매개 변수 및 기타 엔터티에 대한 정보를 검색하는 형식이 포함되어 있습니다. The

docs.microsoft.com

assembly.GetType을 통해 string을 전달받아 동일한 클래스 타입을 가져온뒤

Activator.CreateInstance를 통해 인스턴스화 해준다. 

https://docs.microsoft.com/ko-kr/dotnet/api/system.activator.createinstance?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DKO-KR%26k%3Dk(System.Activator.CreateInstance);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.7.1);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.8

 

Activator.CreateInstance 메서드 (System)

 

지정한 매개 변수와 가장 일치하는 생성자를 사용하여 지정한 유형의 인스턴스를 만듭니다.Creates an ins

docs.microsoft.com

 

좀 이해가 안가는 부분이 있긴한데 혹시 모를 null 체크를 걸기는 했지만

디버그를 통해서 확인해보면 Activator.CreateInstance의 return값이 "null"로 전달 받는다 

무슨 의미인지는 자세히 몰라서 좀더 정보를 찾아봐야할것 같다. ㅠㅠ

 

진짜 null인지 아니면 내가 이해못한 무언가가 있는지 모르겠지만 

(obj as Skill).Init(skillName[i]);

위와같이 적절한 형변환을 통해서 메소드 호출도 잘된다.

 

일단 구현은 됬지만 무언가가 거시기한 느낌은 지울수 없긴하다

블로그에 올리는 글들은 모두 나중에 내가 다시 읽기위한 공부용, 혹시 모를 도움될만한 사람이 있을까봐 글을 남기는것이므로 글을 작성해둔다.

 

반응형