- 상황: 애니메이션 상태 컴포넌트를 추가하면서 그 컴포넌트 내에 가공된 데이터를 전달해야함.
스프라이트 데이터가 있으면 생성하고 없으면 생성하지 않는 과정을 애니메이션 마다 여러 번 반복하다보니 코드가 너무 더러워져서 AddComponent의 확장메서드를 만들기로 했다.
public static class ExtensionMethods
{
public static T AddComponentState<T>(this GameObject obj, Sprite[] sprites) where T : State
{
if (sprites != null)
{
var component = obj.AddComponent<T>();
component.Init(sprites);
return component;
}
else return null;
}
}
확장 메서드만 모아 놓은 static 클래스를 생성한 뒤 그 안에 확장 메서드를 정의했다.
State를 상속 받은 클래스를 추가할 때만 사용하고
State 내에 Init 함수가 있음을 보장해줘야 하기 때문에 인터페이스를 활용했다.
생성 후 상태 컴포넌트를 상태머신 트랜지션에 넣는 작업을 하기 때문에 변수에 할당 할 수 있도록 리턴값도 주었다.
참고로 게임 오브젝트가 컴포넌트로 가질 수 있는 클래스는 MonoBehaviour를 상속 받은 클래스 뿐이다.
public abstract class State : MonoBehaviour, IState
{
public void Init(Sprite[] sprites)
{
...
}
...
}
interface IState
{
public void Init(Sprite[] sprites);
}
이와 유사하게 GetCompent후 이니셜라이즈 작업을 하는 등 확장 메서드를 다양하게 활용 중이다.
'게임개발' 카테고리의 다른 글
[Unity] UI Toolkit 폰트 적용 안될 때 해결 방법 (0) | 2022.06.03 |
---|---|
[Winform] 개발 일기 - 밸런싱을 위한 시뮬레이터 제작기 (0) | 2022.05.10 |
[Unity] 픽셀 아트 플립북 애니메이션 구현 실험 2 (0) | 2022.04.20 |
[Unity] 픽셀 아트 플립북 애니메이션 구현 실험 1 (0) | 2022.04.20 |
[Unity] [오류 수정] UnityEvent VS Unirx Observable (0) | 2022.04.18 |