[Unity][C#] Type class의 대한 이해

Yoo Hyung Joo ·2023년 10월 10일
0

System.Type에 공부하게 된 이유

Unity Custom BehaviourTree Editor를 만들게 되면서 여러 문제에 부딪혔었다. 제네릭과 관련해 Type을 이용한 함수를 만들어 내기 위해서 Type class에 대해 공부하게 되었다.

사용한 코드 (1)

if (node.GetType().IsSubclassOf(typeof(ActionNode<>).MakeGenericType(type)))
{
	AddToClassList("action");
}

사용한 코드 (2)

var actionNodeBaseType = typeof(ActionNode<>).MakeGenericType(brainType);
var derivedTypes = AppDomain.CurrentDomain.GetAssemblies()
	.SelectMany(s => s.GetTypes())
	.Where(p => actionNodeBaseType.IsAssignableFrom(p) && p.IsClass && !p.IsAbstract);

foreach (var type in derivedTypes)
{
	// type을 사용하여 노드를 생성하는 로직을 추가
	evt.menu.AppendAction($"[{type.BaseType.Name}]/{type.Name} ", (a) => CreateNode(type, nodePostion));
}

Type.IsSubClassOf(Type type)

이 함수는 매개변수로 들어온 Type이 Type class에서 파생되는지를 나타내는 함수이다.
=> Boolean 값으로 리턴

ex)
만약 PlayerController가 MonoBehaviour를 상속받았을 경우 PlayerController는 MonoBehaviour에서 파생된 클래스 이므로

typeof(PlayerController).IsSubClassOf(typeof(MonoBehaviour)) 

이런식으로 쓰였을 경우 True를 리턴해준다.

한줄 요약: 이 타입이 매개변수의 타입에서 파생되었는가? ( 상속되었는가? )

참고: https://learn.microsoft.com/ko-kr/dotnet/api/system.type.issubclassof?view=net-7.0

Type.MakeGenericType(Type[] types)

매개변수로 Type배열이 들어오게 되면 그 배열로 새로운 Type을 반환해주는 함수이다.

var genericType = node.GetType().IsSubclassOf(typeof(ActionNode<>).MakeGenericType(type))

현재 내가 사용한 코드에서는 type 의 Type으로 제네릭 변수가 생성되게 된다. 만약 type이 MonoBehaviour 이게 되면 MonoBehaviour 제네릭이 생성되는 것이다. 배열을 넣게되면 배열에 있는 모든 Type을 포함한 제네릭을 생성하게 된다. 또한 이 node.GetType()이 ActionNode<>에 파생되어있는지 Boolean값을 이용해 반환해준다.

한 줄 요약: GenericType을 만들어서 쓸 경우 사용

느낀점

유니티를 공부하면서 C# 관련 지식이 더 필요하다는 것을 좀 더 깨닫게 되었다. 점점 코드를 깔끔하고 객체지향화 시켜서 쓸려 노력하다보니 C# 관련 지식이 필요하다는 것이 확 와닿는다. 유니티 말고도 C#을 더 공부해서 좀 더 나은 개발자가 되도록 하자.

profile
성장을 멈추지 않는 개발자

0개의 댓글