Créer un système de Craft sur Unity

post-thumb

Réflexion sur le système

C’est une étape qui me fait particulièrement peur et pourtant j’ai une petite idée pour la réaliser.

Pour commencer, je voulais un système de craft me permettant de me challenger. Et j’ai tout de suite pensé aux jeux où nous devons craft nos items nous même. C’est-à-dire déposer nos ressources dans une grille avec une disposition bien précise pour former et créer un nouvel item. Tel que le jeu Minecraft.

Je pense que ce genre de système de Craft fonctionne de cette manière :

Nous avons une grille d’une dimension définie contenant des slots ayant une identité de placement et de l’autre côté, nous avons une liste d’items avec le patron de conception stocké dans autre une liste. Cela permet de regarder si notre disposition dans la grille peut crafter ou non un nouvel item.

C’est parti !

Étant donné que j’avais déjà une idée globale et que mes slots ayant InventoryItem Je me suis permis de me lancer directement.

Tout d’abord, j’ai conçu la création des patrons de conception de mes items, cela me permettra par la suite de créer et de paramétrer très facilement de nouveaux items. J’ai même eu l’idée de concevoir un panel d’édition visuel pour paramétrer mes items plus simplement et plus intuitivement. Mais il fallait d’abord que je teste ma réflexion et que je la mette en œuvre.

Ceci est mon CraftScriptable il va me permettre de créer de nouveaux items qui vont pouvoir être craftés par la suite.

[CreateAssetMenu(fileName = "Data", menuName = "CraftScriptable", order = 1)]  
public class CraftScriptable : ScriptableObject  
{   
	// Partie des données de paramétrage pour craft un item
	public List<ressourceCraft> ressource = new List<ressourceCraft>();  
  
    // Partie description de l'item et pour le joueur 
    public string CraftName;  
    public Sprite CraftImage;  
    public string CraftDescription;  
}  
  
[Serializable]  
public class ressourceCraft  
{  
	// Item que je veux pour un slot de la grille 
    public Item item;
 	// Le nombre qu'il en faut (je pense l'enlever pour en mettre 1 par défaut)
    public int numberItem;  
	// La position de l'item dans la grille
    public ItemPositionCraft positionCraft;  
}  
  
// ItemPositionCraft est un Enum pour positionner l'item par rapport à une position donnée
public enum ItemPositionCraft  
{  
    BottomLeft = 0,  
    BottomMiddle = 1,  
    BottomRigth = 2,  
  
    MiddleLeft = 3,  
    Middle = 4,  
    MiddleRight = 5,  
    TopLeft = 6,  
    TopMiddle = 7,  
    TopRight = 8  
}

Le seul gros défaut est que si par erreur dans l’editor, nous mettons par exemple une “pierre” au milieu et que nous mettons également un autre item au même endroit, cela va causer des problèmes sur le patron de conception de l’item.

Une fois que nous avons nos patrons de conçus, il faut la grille de craft pour savoir si un objet peut être crafté ou non.

La Grille va tout simplement fonctionner avec un script dérivé de InventoryItem se nommant CraftSlotItem. Il possède quelques fonctionnalités en plus permettant de récupérer et de vérifier via Crafting.

Comment la vérification va-t-elle se faire lorsqu’un item est déposé dans cette grille de 3x3 ?

Dans Crafting nous aurons une méthode de vérification :

public void verification()
{

	for (int i = 0; i < craftScriptable.Count; i++)
	{
		count = 0;
		for (int j = 0; j < craftScriptable[i].ressource.Count; j++)
		{

			for (int k = 0; k < craftSlotItem.Count; k++)
			{

				if (
          craftScriptable[i].ressource[j].positionCraft == craftSlotItem[k].GetItemPositionCraft()
          && craftSlotItem[k].GetItem() != null 
          && craftSlotItem[k].GetItem().GetType() == craftScriptable[i].ressource[j].item.GetType()
          )
				{
					count++;
				}
			}

		}

		if (count == craftScriptable[i].ressource.Count)
		{
				Debug.LogWarning("vous pouvez craft un " + craftScriptable[i].CraftingItemImage.name);

				craftingSlotItem.SetSlot(craftScriptable[i].CraftingItemImage, craftScriptable[i].CraftingItemDescription);

			return;
		}
		else
		{

			craftingSlotItem.ResetSlot();
		}

	}

}

Cette méthode va permettre de regarder parmi tous les patrons qui existent via craftScriptable si dans la grille les éléments sont bien placés et si ce sont les bons items !

Pour cela, nous faisons également une boucle au niveau des ressources contenues dans le patron pour savoir si nous avons entre 2 à 9 items, puis dans une autre boucle à la suite, nous les comparons pour chaque case du slot de craft.

Résultat

Conclusion

Je ne pensais pas apprendre autant de choses avec cet exercice, et surtout, je ne pensais pas le pousser autant jusqu’ici ! Au départ, ce petit projet consistait juste à ramasser des objets puis de les trier. J’ai beaucoup aimé ce projet, il m’a cassé la tête à plusieurs reprises, mais une fois réalisé, je suis très fier de ce que j’ai produit !

Des questions ?

Si vous avez la moindre question ou une partie que vous n’avez pas comprise. N’hésitez pas à m’envoyer un message sur mon Discord ou par Mail.

Tu pourrais aussi aimer