Un ScriptableObject est un conteneur de données que vous pouvez utiliser pour enregistrer de grandes quantités de données, indépendamment des instances de classe. L'un des principaux cas d'utilisation de ScriptableObjects est de réduire l'utilisation de la mémoire de votre projet en évitant les copies de valeurs.
Les objets scriptables (ScriptableObject) sont des conteneurs de données incroyables. Ils n'ont pas besoin d'être attachés à un GameObject dans une scène. Ils peuvent être enregistrés en tant qu'Asset dans notre projet. Le plus souvent, ils sont utilisés comme des Assets qui sont uniquement destinés à stocker des données, mais peuvent également être utilisés pour aider à sérialiser des objets et peuvent être instanciés dans nos scènes.
Chaque fois que nous créons une instance un Prefab (Instantiate), il aura sa propre copie des données (datas) inclues dans le prefab. Ainsi si on dispose de 30 prefabs, il existera 30 copies des données en mémoire.
Au lieu d'utiliser cette méthode, on peut utiliser un ScriptableObject, qui stocke les données, pour ensuite y accéder par référence pour tous les autres instances de prefabs. Cela signifie ainsi qu'une seule copie des datas, pour tous les prefabs, sera stockée en mémoire.
Excellent, on réduit donc l'impact des chargements des données en mémoire !
Par où on commence ?
Créer un ScriptableObject
Avant de pouvoir utiliser un ScriptableObject avec Unity, il faut avant toute chose, écrire sa définition, puis ensuite le créer. Il faut donc dans l'éditeur et avant toute chose, créer sa classe.
Le principe est simple car il suffit de créer un script C#, qui doit dériver de la classe ScriptableObject. Il est d'ailleurs tout à fait possible, d'automatiser cela avec l'utilisation de CreateAssetMenu .
using UnityEngine;
[CreateAssetMenu(fileName = "WeaponData", menuName = "ScriptableObjects/WeaponData", order = 1)]
public class WeaponData : ScriptableObject
{
public string swordName;
public string description;
public Sprite icon;
public int cost;
public int attackDamage;
}
Une fois que la classe est définie, on peut alors l'utiliser dans d'autres scripts.
Utiliser un ScriptableObject
Il faut alors créer un autre script qui aura une référence vers notre ScriptableObject crée précédemment .
using UnityEngine;
public class Client : MonoBehaviour
{
[SerializeField]
private WeaponData datas; // instance de notre ScriptableObject crée
private void OnMouseDown() // cette méthode fonctionne uniquement si le GameObject qui porte ce script possède un Collider.
{
Debug.Log(datas.swordName); // on accède aux données du ScriptableObject comme tout Object
Debug.Log(datas.description);
Debug.Log(datas.icon.name);
Debug.Log(datas.cost);
Debug.Log(datas.attackDamage);
}
}
Et c'est tout ! C'est aussi simple que cela. On vient ainsi de découpler les datas de la couche logique, tout en optimisant encore une fois la gestion de la mémoire du programme.