본문 바로가기
Works/Unity 3D

ScriptableObject vs new Class

by Vader87 2024. 5. 21.
반응형

Unity 의 E-Book 을 보던 중 궁금해져서 찾아본 내용을 기록으로 남김

https://unity.com/kr/resources/create-modular-game-architecture-with-scriptable-objects-ebook?ungated=true&isGated=false

 

Create modular game architecture in Unity with ScriptableObjects

This guide provides tips and tricks from professional developers for deploying ScriptableObjects in production.

unity.com

E-Book 내용에 다음과 같은 내용이 있음

If you need to make a ScriptableObject instance at runtime, you can call the
static CreateInstance method

Runtime 에 ScriptableObject 를 Instance 해서 사용하는게 그냥 new Class 를 사용 하는 것보다 더 좋은 점이 있을까?

유저의 의견)

직렬화가 필요한 경우 ScriptableObject 를 사용하고 그 외의 경우에는 new Class 를 사용하는 것을 추천

(여기서 말하는 직렬화는 Unity Editor 에서 Inspector 에 노출 시키기 위한 기능을 뜻하는 것으로 추측됨)

더보기

Serialization!

Unity uses it's own serialization methods to save and load objects. This serialization methods only supports classes that are derived from UnityEngine.Object.

You may say: "wait Unity can serialize every class with a [System.Serializable] attribute", well that's just partly true. If you have a MonoBehaviour class that has a public variable of your own class, Unity serializes the custom class as part of the MonoBehaviour. Unity doesn't take the true type into account.

If you have a variable of a base class in your MonoBehaviour but you hold an instance of a derived class, the class will be lost / converted into an instance of the base type when serialized / deserialized.

ScriptableObjects are true standalone objects. They are serialized on their own and the MonoBehaviour will just hold the reference to the instance, even when serialized.

If you don't need the serialization feature, use normal classes.

Keep in mind that if you want to use serialization Unity does serialize / deserialize your objects quite often.

Entering playmode: current scene is serialized, saved and immediately deserialized

Leaving playmode: The saved scene is deserialized.

Personally i don't like the ScriptableObject and Unitys serialization. Usually i use either my own way to serialize / save objects or use MonoBehaviours on empty GOs because it makes debugging easier ;).

 

Preset 데이터가 필요한 경우

일반 new Class 의 경우 Preset 데이터가 필요하면 하드 코딩을 하거나 다른 형태의 데이터를 가공해서 파싱해 사용해야 되지만, ScriptableObject 의 경우 하드 코딩 없이 간단하게 Preset 데이터를 추가할 수 있음

+ Data 공유가 쉬움

일반 new Class 의 경우 동일한 데이터를 여러 Class 에서 참조해 사용하게 하려면 Static 하게 만들거나 구조를 잘 잡아줘야함, 하지만 ScriptableObject 를 사용하면 Static Class 를 사용하지 않아도 동일한 데이터를 쉽게 공유 할 수 있음

https://www.gameprogrammingpatterns.com/flyweight.html

 

 

참고

https://discussions.unity.com/t/what-is-the-purpose-of-scriptableobject-versus-normal-class/32329

https://docs.unity3d.com/ScriptReference/Serializable.html

 

Unity - Scripting API: Serializable

To enable serialization, apply the [Serializable] attribute. For more information on serialization, see Script Serialization. This attribute is not required for classes that derive from serialized Unity classes, such as MonoBehaviour, ScriptableObject and

docs.unity3d.com

https://learn.microsoft.com/ko-kr/dotnet/api/system.serializableattribute?view=net-8.0

 

SerializableAttribute 클래스 (System)

이진 또는 XML serialization을 사용하여 클래스를 serialize할 수 있음을 나타냅니다. 이 클래스는 상속될 수 없습니다.

learn.microsoft.com

https://www.youtube.com/watch?v=6vmRwLYWNRo

 

반응형

'Works > Unity 3D' 카테고리의 다른 글

AltTester  (0) 2024.08.14
Dependency Injection  (0) 2024.08.14
[Unity] TMP_InputField 의 inputValidator 사용법  (0) 2023.09.07
Unity Sentis 설치 방법  (0) 2023.08.18
Unity Muse  (0) 2023.08.16

댓글