Scriptable Objects in Unity

This is a description of Scriptable objects from Unity Manual — ScriptableObject

A ScriptableObject is a data container that you can use to save large amounts of data, independent of class instances. One of the main use cases for ScriptableObjects is to reduce your Project’s memory usage by avoiding copies of values. This is useful if your Project has a Prefab
that stores unchanging data in attached MonoBehaviour
scripts

Every time you instantiate that Prefab, it will get its own copy of that data. Instead of using the method, and storing duplicated data, you can use a ScriptableObject to store the data and then access it by reference from all of the Prefabs. This means that there is one copy of the data in memory.

ScriptableObjects cannot be attached to a GameObject

When you use the Editor, you can save data to ScriptableObjects while editing and at run time because ScriptableObjects use the Editor namespace and Editor scripting. In a deployed build, however, you can’t use ScriptableObjects to save data, but you can use the saved data from the ScriptableObject Assets that you set up during development.

Data that you save from Editor Tools to ScriptableObjects as an asset is written to disk and is therefore persistent between sessions.

Scriptable objects are very useful as templates, for example

Here we have some cards with text (info) and pics.
With scriptable objects, we can create one template and create as many cards as we want changing only the info (text) and the image (pic)

For instance, we can create a new panel with the objects for each card

  • Create a script called CardView
  • Drag and drop the script into the Cards_panel
  • Inside the script, declare the following
  • Assign each one in the hierarchy

The objective will be to update this info through code at runtime

  • Create a script CardModel. This will be the model (template) for all the cards
  • Instead of MonoBehaviour, it will inherit from ScriptableObject

The first script will show the info, this script will store the data to be shown

CardModel can’t be attached to any game object, so we need to create a new scriptable object with a Unity attribute

In the project window, create a new scriptable object, call it Africa and fill it in with the info

So, after creating all the scriptable objetcs, and in this map:

We can create a DisplayCard method and a CardModel array in CardView

And assign the values in the inspector

Later in the map panel, assign the DisplayCard method to OnClick event, for instance, AfricaLabel (button), and also to enable the Cards_panel gameobject

And you can do the same for the remaining cards

Also, Add an OnClick event to the close button in order to close the Cards_panel