[Unity Editor Scripting] "TYPE" must be instantiated using the ScriptableObject.CreateInstance method instead of new "TYPE"
에러 메시지
HexaCraft.HCModel must be instantiated using the ScriptableObject.CreateInstance method instead of new HCModel.
원인 분석
`ScriptalbeSingleton<T>` 클래스를 상속받은 클래스 내부에서 `HCModel` 클래스 생성자를 호출하였다. HCModel은 Monobehaviour나 ScriptableObject를 상속받은 클래스가 아닌 일반 순수 클래스였다.
생각해보면, 유니티 엔진은 `ScriptableObject`를 상속받은 것들은 모두 자동으로 직렬화하는데, ` ScriptalbeSingleton`도 스크립터블 오브젝트를 상속받았으므로 이를 직렬화하는 과정에서 일반 plain 클래스가 섞여 있으면 직렬화하는데 방해가 될 수 있겠다는 생각이 들었다.
참고 자료의 유니티 포럼 링크는 이를 팩토리 패턴이라고 설명한다. 생성자 대신 사용하기 위한 정적 메소드를 소유하게 된다고 한다. 유니티에서 이 패턴을 사용하는 이유는 ScriptalbeObject의 생성자는 특별한 기능을 수행하고, 유니티 엔진 개발자는 사용자가 상속된 클래스 생성자 내에서 기본 생성자를 호출하는 것을 원하지 않았다 본다고 한다.
어쨌든 스크립터블 오브젝트의 장점은 Persistence와 에디터 친화성이다.
해결 방법
그래서 당장은 동작이 되지만, ScriptableObject안에서 사용할 필드의 클래스들은 ScriptalbeObject를 상속받은 클래스로 선언한 뒤, `ScriptableObject.CreateInstance<TYPE>();` 을 통해 객체를 생성하여 관리해야한다.
이런 이유에 대해 완벽히 원인 파악을 할 순 없다고 생각한다. 유니티 엔진의 내부 코드를 모두 열어볼 수 있지 않은 이상, 그런 내용들을 상세히 알 순 없기에 유니티가 수행하는 직렬화에 방해되지 않도록 코드를 짜도록 해야겠다.
참고 자료
'유니티에서 게임개발을 추구하면 안되는걸까 > 유니티 에디터 스크립팅' 카테고리의 다른 글
[Unity Editor Scripting] EditorStyles null Reference (0) | 2024.12.06 |
---|---|
[Unity Editor Scripting] 유니티의 직렬화(serialization)와 재귀 문제 회피 (0) | 2024.11.09 |
[Unity Editor Scripting] Editor관련 함수 정리 (0) | 2024.10.25 |