상태 패턴을 관리하는 클래스는 범용적으로 만들기 위해 제네릭 클래스로 만들었다.
제네릭 클래스여도 Mono를 상속받지 않는다면 new 로 초기화하면 된다.
아래의 StateMachine<T>는 딱히 Mono를 상속안받아도 되는 클래스지만 디버깅을 위해 Mono를 붙여주었다.
그런데 몬스터가 가지고 있게 하려고 AddComponenet를 하니 Null 오류가 발생한다.
// 컴포넌트로서 들어갈 클래스
public class StateMachine<T> : MonoBehaviour
{
}
public abstract class MonsterBase : CharacterBase
{
[SerializeField] public StateMachine<MonsterBase> StateMachine;
void Start()
{
// Null이 발생하여 StateMachine에는 아무것도 할당되지 않는다.
StateMachine = gameObject.AddComponent<StateMachine<MonsterBase>>();
}
}
유니티 포럼등에서 추천하는 방법은, 제네릭 클래스를 상속받는 클래스를 하나 만들고서 할당하는 방법.
불필요한 상속이라는게 좀 그렇지만, 빠르게 적용이 가능하다.
// 컴포넌트로서 들어갈 클래스
public class StateMachine<T> : MonoBehaviour
{
}
public class StateMachineMonster : StateMachine<MonsterBase>
{
}
public abstract class MonsterBase : CharacterBase
{
[SerializeField] public StateMachineMonster StateMachine;
void Start()
{
// 정상적으로 StateMachine에 할당된다.
StateMachine = gameObject.AddComponent<StateMachineMonster>();
}
}
'🌍 Unity > 유니티 엔진 동작 관련' 카테고리의 다른 글
Unity Coroutine 상속 / 코루틴 오버라이드 base 호출 (0) | 2020.06.16 |
---|---|
Unity Compression Method LZ4 (0) | 2020.01.29 |
유니티 버튼 이벤트 할당 Unity Button AddListener injection (0) | 2019.12.11 |
유니티 인터페이스로 호출 (Unity interface call / check) (0) | 2019.11.21 |
Unity 씬 로딩 될때마다 호출되는 함수 (OnSceneLoaded ) (0) | 2019.10.15 |