Usage détourné d'une interface
Publié : 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 :
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 :
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 :
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 :
et en faisant hériter mes managers d'items de cette interface :
En cherchant l'interface, cela fonctionne :
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.
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 {}
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> { }
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
J'ai résolu mon problème en créant une interface vide :
Code : Tout sélectionner
public interface IManager {}
Code : Tout sélectionner
public class HairManager : ItemSOManager<Hair>, IManager{}
Code : Tout sélectionner
itemSOManagersList = GetComponents<IManager> ().ToList ();
Merci d'avoir tout lu et de prendre un peu de votre temps pour me donner des pistes.