공부중
[Unity] string과 동일한 class 이름을 가진 타입을 인스턴스화 하기 본문
기기(aos, ios device)에서까지 돌아가는지는 안써봤지만 일단 정리해보려고 한다.
2020/04/07 - [Programing/Unity3D] - [Unity]동일한 구조(?)의 코드를 생성해야 하는 경우
위의 이전글에서 스킬명과 동일한 클래스 이름을 가진 여러 파일을 생성했었다.
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
assembly.GetType을 통해 string을 전달받아 동일한 클래스 타입을 가져온뒤
Activator.CreateInstance를 통해 인스턴스화 해준다.
좀 이해가 안가는 부분이 있긴한데 혹시 모를 null 체크를 걸기는 했지만
디버그를 통해서 확인해보면 Activator.CreateInstance의 return값이 "null"로 전달 받는다
무슨 의미인지는 자세히 몰라서 좀더 정보를 찾아봐야할것 같다. ㅠㅠ
진짜 null인지 아니면 내가 이해못한 무언가가 있는지 모르겠지만
(obj as Skill).Init(skillName[i]);
위와같이 적절한 형변환을 통해서 메소드 호출도 잘된다.
일단 구현은 됬지만 무언가가 거시기한 느낌은 지울수 없긴하다
블로그에 올리는 글들은 모두 나중에 내가 다시 읽기위한 공부용, 혹시 모를 도움될만한 사람이 있을까봐 글을 남기는것이므로 글을 작성해둔다.
'Programing > Unity3D' 카테고리의 다른 글
[Unity Shader]울렁울렁 거리는 굴절을 표현해 보자 (0) | 2020.05.20 |
---|---|
[Unity]동일한 구조(?)의 코드를 생성해야 하는 경우 (0) | 2020.04.07 |
[Unity]새로워진 스프라이트 아틀라스(Sprite Atlas) (0) | 2020.03.12 |
[Unity3D]프리팹 인스턴스 언패킹(Unpacking Prefab instances) (0) | 2020.02.25 |
3ds max에서 export한 fbx 모델이 유니티에서 회전되서 나오는 경우.. (0) | 2018.08.16 |