Page 1 sur 1

[architecture] Ou lier mes sprites ?

Publié : 03 Déc 2019 12:12
par ZeroKcm
Hello,

J'ai une question d'architecture sur Unity. Je ne suis pas un débutant : je l'utilise depuis très longtemps (2007)

Y'a un truc qui m’embête toujours et qui m'arrive souvent.

J'ai besoin d'utiliser fréquemment des mêmes sprites et textures dans pleins de scripts différents.
Le plus simple serait de lier mes sprites dans tous mes scripts, mais c'est horrible :)

Je cherche la solution la plus optimisée au niveau perfs & mémoire.

Le plus souvent, je créé un GameObject Data dont je fais un singleton.
Ensuite, si j'ai besoin d'un de mes sprites, j'accèdes à mon singleton depuis n'importe où :

Code : Tout sélectionner

void Update()
{
    sprite = Data.Instance.monJoliSprite;
}
Je trouve que c'est un peu lourd à cause du singleton.

J'ai essayé de remplacer Data par un ScriptableObject mais, ça demande de le lier dans tous mes objets. J'ai peur de faire pire que le singleton car il est possible que j'instancie 1000 objets qui contiennent tous ce lien.

Vous faites comment vous ?

Re: [architecture] Ou lier mes sprites ?

Publié : 03 Déc 2019 14:13
par boubouk50
Salut,
Est-ce que les sprites sont accessibles via un scriptableObject? (question que je pose)
Cela t'enlèverait l'utilisation d'un singleton et leur accès serait illimité et partagé par tous.
Tu aurais donc un Asset qui possède tous les sprites dont tu te sers où tu pourrais piocher ce que tu souhaites quand tu le souhaites.
Avec l'avantage de créer différents assets variantes du premier pour avoir des packages de sprites.

Re: [architecture] Ou lier mes sprites ?

Publié : 03 Déc 2019 16:03
par Alesk
Je ne connais pas non plus de solution miracle dans ce cas

A un moment il faut bien définir un point d'accès quelque part. Donc que ça soit un singleton ou un scripable object ... ça revient un peu au même je pense.

Re: [architecture] Ou lier mes sprites ?

Publié : 03 Déc 2019 22:08
par ZeroKcm
J'ai regardé pas mal de vidéos la dessus et je pense avoir trouvé la solution :

On peut utiliser un singleton de ScriptableObject

Code : Tout sélectionner

[CreateAssetMenu(menuName = "ScriptableObjects/Data")]
public class Data : ScriptableObject
{
	public static Data Instance { get; private set; }

	[RuntimeInitializeOnLoadMethod]
	private static void Init()
	{
		Instance = Resources.FindObjectsOfTypeAll<Data>()[0];
	}

	public Sprite carrotIcon;
	public Sprite rabbitIcon;
	public Material rabbitMaterial;
	public Sprite goldIcon;
	...
}
C'est génial, pratique et y'a pas besoin de GameObject inutile.

Explications ici : https://baraujo.net/unity3d-making-sing ... matically/