Usage détourné d'une interface

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Usage détourné d'une interface

Message par jmhoubre » 06 Juil 2023 17:29

Bonjour,

j'ai un petit souci, que j'ai résolu, mais je pense que la solution que j'ai utilisée manque d'élégance.

J'ai une classe abstraite générique, qui regroupe des champs et des méthodes communes aux classes filles :

Code : Tout sélectionner

public abstract class ItemSOManager<T> : MonoBehaviour where T : ItemSO {}
Les ItemSO sont des ScriptableObject.

De cette classe dérivent des classes de gestionnaires d'items : cheveux, barbes, masques, chapeaux, écharpes (et plus tard, armes, ...). Voici celle pour les cheveux :

Code : Tout sélectionner

public class HairManager : ItemSOManager<HairSO> { }
HairSO dérive d'ItemSO.

Le but de ce choix est d'éviter d'avoir à affecter à la main ces items. Quand le joueur choisit son personnage, il a accès à la possibilité de naviguer parmi les items possibles. Il peut choisir un HairSO pour les cheveux, mais pas un BeardSO. Par ailleurs, les différentes listes d'items se peuplent automatiquement depuis les assets.

Après avoir essayé plusieurs techniques, j'ai fini par attacher mes managers au personnage : HairManager, BeardManager, ... Pour l'instant il y a 6 managers, mais d'autres devraient arriver. Je souhaite me contenter d'attacher les nouveaux managers au personnage. Un script recherche ensuite les différents managers attachés pour en faire une liste :

Code : Tout sélectionner

itemSOManagersList = new List<ItemSOManager<ItemSO>> ();
itemSOManagersList = GetComponents<ItemSOManager<ItemSO>> ().ToList (); // ToList : LINQ
Visual Studio ne signale pas d'erreurs, mais la liste est vide. J'ai essayé avec un tableau, idem. Il semble qu'Unity ne reconnaissant pas le composant recherché, il s'en contente.

J'ai résolu mon problème en créant une interface vide :

Code : Tout sélectionner

public interface IManager {}
et en faisant hériter mes managers d'items de cette interface :

Code : Tout sélectionner

public class HairManager : ItemSOManager<Hair>, IManager{}
En cherchant l'interface, cela fonctionne :

Code : Tout sélectionner

itemSOManagersList = GetComponents<IManager> ().ToList ();
Mais je trouve cet usage détourné d'une interface peu élégant et je me demande si je ne suis pas passé à côté de quelque chose de plus simple.

Merci d'avoir tout lu et de prendre un peu de votre temps pour me donner des pistes.

Répondre

Revenir vers « Scripting »