관리 메뉴

도드넷

[메모2] 유니티 Monobehaviour 저장? 씬 리로드 다시 불러오기 본문

창고/게임 개발 [Hidden]

[메모2] 유니티 Monobehaviour 저장? 씬 리로드 다시 불러오기

도드! 2019. 6. 29. 19:23



[개발 메모2]



유니티 Monobehaviour 저장하기?


1. 유니티 인게임 게임오브젝트 컴포넌트인 Monobehaviour 을 상속받은 객체/컴포턴트는 

serialized json 형태로 저장할 수 없다.




2. Scriptable Object 형태의 객체는 저장이 가능하지만 그 안에 만약, 인게임 Monobehaviour 컴포넌트가 참조되어 있다면 보이지않는 오류가 나고 재대로 저장이 되지 않느다.


결론 : 인게임에 게임 오브젝트(GameObject)의 컴포넌트로 쓰이는 

NEVER, EVER, 절대로 게임 씬안에 존재하는 Mono상속 객체(컴포넌트)를 저장하려 들지말라.



+3. 씬 다시불러오기 리로드 하기


using UnityEngine.SceneManagement;

        SceneManager.LoadScene(0);  // Reload The Scene.  



 


4. 하지만 유니티 Mono 객체를 참조-저장 할수도 있다


[PARADOX! 2번]




Weapon은 온갖 무기 데이터를 담는 Scriptable Object이다. 이 녀석은 2번 메모에도 불구하고 Mono 객체인 Projectile과 FX, Buff 등의 다양한 Mono를 상속받은 변수들을 자유자재로 참조하고 저장하며 사용하고 있다. 

게다가 이 녀석은 코어 세이브 파일에 들어가 저장까지 되는 매우 귀한몸이다.


그런데 세이브가 잘된다

로드도 잘된다.

고로, 참조 값고 잘 불러와진다.


WHAT?


Mono 객체는 참조-저장이 안된다고 하지않았나?


이유가 뭘까?


여기서 사용하고있는 Mono 객체인 Projectile과 FX, Buff 는 모두 인게임 씬 안의 오브젝트가 

아닌 Asset에 포함되는 Prefab 객체 소속이기 때문이다.



[결론]


게임 씬 안의 Monobehaviour 상속 객체는 참조하여 값을 재대로 저장할 수 없다.


굳이 Monobehaviour 객체를 저장 하고싶다면,


Prefab의 형태로 Asset에 저장된 형태로 사용하자.


하지만 Asset 형태로 고정된 형태가아닌 인게임 변환이 일어나는 Mono 컴포넌트의 값(EX: Unit)을 저장하고 싶다면,

따로 제2의 세이브용 객체, Mono의 상속을 받지않는 순수 [Serializable] 객체만들어서 값을 복사해서 저장해야한다.





반응형
Comments